From 94d83f84758766511c5e324721e39fea6ab71dae Mon Sep 17 00:00:00 2001
From: Hans Hagen
Date: Fri, 31 Oct 2008 13:58:00 +0100
Subject: stable 2008.10.31 13:58
---
context/config/texexec.rme | 169 -
context/data/cont-cs-scite.properties | 148 +-
context/data/cont-de-scite.properties | 158 +-
context/data/cont-en-scite.properties | 160 +-
context/data/cont-fr-scite.properties | 148 +-
context/data/cont-it-scite.properties | 122 +-
context/data/cont-nl-scite.properties | 108 +-
context/data/cont-ro-scite.properties | 164 +-
context/data/context-bbedit-cs.xml | 2 +-
context/data/context-bbedit-de.xml | 2 +-
context/data/context-bbedit-en.xml | 2 +-
context/data/context-bbedit-fr.xml | 2 +-
context/data/context-bbedit-it.xml | 2 +-
context/data/context-bbedit-nl.xml | 2 +-
context/data/context-bbedit-ro.xml | 2 +-
context/data/context-jedit-cs.xml | 2 +-
context/data/context-jedit-de.xml | 2 +-
context/data/context-jedit-en.xml | 2 +-
context/data/context-jedit-fr.xml | 2 +-
context/data/context-jedit-it.xml | 2 +-
context/data/context-jedit-nl.xml | 2 +-
context/data/context-jedit-ro.xml | 2 +-
context/data/context.properties | 6 +-
doc/context/bib/bibmod-doc.pdf | Bin 272194 -> 281102 bytes
doc/context/bib/bibmod-doc.tex | 1 +
fonts/map/dvipdfm/context/8r-base.map | 78 -
fonts/map/dvipdfm/context/ec-base.map | 78 -
fonts/map/dvipdfm/context/ec-os-public-lm.map | 69 -
fonts/map/dvipdfm/context/ec-public-lm.map | 69 -
fonts/map/dvipdfm/context/el-public-lm.map | 69 -
fonts/map/dvipdfm/context/original-adobe-euro.map | 12 -
fonts/map/dvipdfm/context/original-ams-base.map | 39 -
fonts/map/dvipdfm/context/original-ams-cmr.map | 79 -
fonts/map/dvipdfm/context/original-ams-euler.map | 19 -
fonts/map/dvipdfm/context/original-base.map | 40 -
.../dvipdfm/context/original-context-symbol.map | 3 -
fonts/map/dvipdfm/context/original-dummy.map | 1 -
fonts/map/dvipdfm/context/original-empty.map | 1 -
.../context/original-micropress-informal.map | 7 -
fonts/map/dvipdfm/context/original-public-csr.map | 56 -
fonts/map/dvipdfm/context/original-public-lm.map | 97 -
fonts/map/dvipdfm/context/original-public-plr.map | 77 -
fonts/map/dvipdfm/context/original-public-vnr.map | 55 -
.../map/dvipdfm/context/original-vogel-symbol.map | 1 -
fonts/map/dvipdfm/context/original-wasy.map | 7 -
fonts/map/dvipdfm/context/original-youngryu-px.map | 36 -
fonts/map/dvipdfm/context/original-youngryu-tx.map | 66 -
fonts/map/dvipdfm/context/qx-base.map | 25 -
fonts/map/dvipdfm/context/qx-os-public-lm.map | 69 -
fonts/map/dvipdfm/context/qx-public-lm.map | 69 -
fonts/map/dvipdfm/context/t5-base.map | 36 -
fonts/map/dvipdfm/context/t5-os-public-lm.map | 69 -
fonts/map/dvipdfm/context/t5-public-lm.map | 69 -
fonts/map/dvipdfm/context/texnansi-base.map | 1 -
.../map/dvipdfm/context/texnansi-os-public-lm.map | 69 -
fonts/map/dvipdfm/context/texnansi-public-lm.map | 69 -
fonts/map/pdftex/context/original-ams-euler.map | 2 +-
metapost/context/base/mp-char.mp | 8 +-
metapost/context/base/mp-core.mp | 77 +-
metapost/context/base/mp-mlib.mp | 42 +-
metapost/context/base/mp-tool.mp | 7 +
scripts/context/lua/luatools.lua | 1231 +-
scripts/context/lua/mtx-babel.lua | 11 +-
scripts/context/lua/mtx-context.lua | 88 +-
scripts/context/lua/mtx-fonts.lua | 26 +-
scripts/context/lua/mtx-interface.lua | 85 +-
scripts/context/lua/mtx-server.lua | 23 +-
scripts/context/lua/mtx-update.lua | 4 +-
scripts/context/lua/mtx-watch.lua | 25 +-
scripts/context/lua/mtxrun.lua | 1424 +-
scripts/context/ruby/base/tex.rb | 7 +-
scripts/context/ruby/base/texutil.rb | 21 +-
scripts/context/ruby/ctxtools.rb | 214 +-
tex/context/base/attr-ini.lua | 315 +-
tex/context/base/attr-ini.tex | 43 +-
tex/context/base/char-def.lua | 26 +-
tex/context/base/char-def.tex | 52 -
tex/context/base/char-ini.lua | 40 +-
tex/context/base/char-ini.tex | 74 +-
tex/context/base/char-utf.lua | 341 +-
tex/context/base/colo-hex.tex | 4 +-
tex/context/base/colo-ini.lua | 567 +
tex/context/base/colo-ini.mkii | 1862 ++
tex/context/base/colo-ini.mkiv | 370 +
tex/context/base/colo-ini.tex | 2506 +--
tex/context/base/colo-new.lua | 547 -
tex/context/base/colo-new.mkii | 1859 --
tex/context/base/colo-new.mkiv | 336 -
tex/context/base/colo-new.tex | 1051 -
tex/context/base/colo-run.tex | 15 +-
tex/context/base/cont-fil.tex | 3 +
tex/context/base/cont-fr.tex | 2 +-
tex/context/base/cont-new.mkiv | 88 +-
tex/context/base/cont-new.tex | 29 +-
tex/context/base/cont-old.tex | 2 +-
tex/context/base/cont-pe.tex | 37 +
tex/context/base/context.mkii | 397 +
tex/context/base/context.mkiv | 418 +
tex/context/base/context.tex | 579 +-
tex/context/base/core-blk.lua | 145 +
tex/context/base/core-blk.mkiv | 109 +
tex/context/base/core-box.tex | 6 +-
tex/context/base/core-buf.lua | 358 +-
tex/context/base/core-con.lua | 4 +-
tex/context/base/core-con.mkii | 30 +-
tex/context/base/core-con.mkiv | 10 +-
tex/context/base/core-des.tex | 46 +-
tex/context/base/core-fig.tex | 35 +
tex/context/base/core-fnt.tex | 6 +-
tex/context/base/core-inc.lua | 63 +-
tex/context/base/core-itm.tex | 48 +-
tex/context/base/core-job.lua | 51 +-
tex/context/base/core-job.mkiv | 3 +
tex/context/base/core-job.tex | 2 +-
tex/context/base/core-lst.tex | 14 +-
tex/context/base/core-ltb.tex | 4 -
tex/context/base/core-mar.tex | 133 -
tex/context/base/core-mat.tex | 26 +-
tex/context/base/core-mis.tex | 72 +-
tex/context/base/core-new.tex | 23 +-
tex/context/base/core-not.tex | 34 +-
tex/context/base/core-num.tex | 2 +-
tex/context/base/core-obj.lua | 47 +-
tex/context/base/core-obj.mkii | 8 +-
tex/context/base/core-obj.mkiv | 39 +-
tex/context/base/core-obj.tex | 12 +-
tex/context/base/core-pgr.tex | 47 +-
tex/context/base/core-pos.lua | 81 +-
tex/context/base/core-pos.mkiv | 90 +-
tex/context/base/core-pos.tex | 95 +-
tex/context/base/core-ref.lua | 106 +
tex/context/base/core-ref.mkii | 90 +
tex/context/base/core-ref.mkiv | 107 +
tex/context/base/core-ref.tex | 130 +-
tex/context/base/core-reg.lua | 313 +-
tex/context/base/core-reg.mkiv | 27 +-
tex/context/base/core-rul.lua | 1 -
tex/context/base/core-rul.mkii | 86 +-
tex/context/base/core-rul.mkiv | 25 +-
tex/context/base/core-rul.tex | 264 +-
tex/context/base/core-sec.mkii | 2620 +++
tex/context/base/core-sec.mkiv | 2621 +++
tex/context/base/core-sec.tex | 2629 ---
tex/context/base/core-spa.lua | 209 +-
tex/context/base/core-spa.mkiv | 26 +-
tex/context/base/core-spa.tex | 274 +-
tex/context/base/core-syn.lua | 199 +-
tex/context/base/core-syn.mkiv | 25 +-
tex/context/base/core-syn.tex | 11 +-
tex/context/base/core-tbl.tex | 138 +-
tex/context/base/core-tsp.tex | 4 -
tex/context/base/core-two.lua | 110 +-
tex/context/base/core-two.mkiv | 73 +-
tex/context/base/core-uti.lua | 98 +-
tex/context/base/core-uti.mkiv | 78 +-
tex/context/base/core-uti.tex | 3 +-
tex/context/base/core-var.tex | 45 +-
tex/context/base/core-ver.mkiv | 69 +-
tex/context/base/core-ver.tex | 197 +-
tex/context/base/enco-fde.tex | 2 +
tex/context/base/enco-ffr.tex | 2 +
tex/context/base/enco-ini.mkiv | 57 +-
tex/context/base/enco-run.tex | 43 +-
tex/context/base/font-afm.lua | 634 +-
tex/context/base/font-col.lua | 92 +-
tex/context/base/font-col.tex | 76 +-
tex/context/base/font-def.lua | 358 +-
tex/context/base/font-ext.lua | 16 +
tex/context/base/font-fbk.lua | 76 +-
tex/context/base/font-ini.lua | 29 +-
tex/context/base/font-ini.mkii | 4855 ++++-
tex/context/base/font-ini.mkiv | 4664 ++++-
tex/context/base/font-ini.tex | 4849 -----
tex/context/base/font-otf.lua | 1270 +-
tex/context/base/font-pat.lua | 53 +
tex/context/base/font-run.tex | 6 -
tex/context/base/font-syn.lua | 214 +-
tex/context/base/font-tfm.lua | 208 +-
tex/context/base/font-uni.tex | 58 +-
tex/context/base/font-vf.lua | 52 +-
tex/context/base/hand-ini.mkii | 182 +-
tex/context/base/java-ini.tex | 12 -
tex/context/base/l-aux.lua | 41 +-
tex/context/base/l-dimen.lua | 8 +-
tex/context/base/l-dir.lua | 24 -
tex/context/base/l-file.lua | 14 +-
tex/context/base/l-io.lua | 1 +
tex/context/base/l-lpeg.lua | 32 +-
tex/context/base/l-math.lua | 6 +-
tex/context/base/l-string.lua | 14 +-
tex/context/base/l-table.lua | 931 +-
tex/context/base/l-unicode.lua | 39 +-
tex/context/base/l-utils.lua | 8 +-
tex/context/base/l-xml-edu.lua | 381 -
tex/context/base/l-xml.lua | 138 +-
tex/context/base/lang-frq.tex | 12 +-
tex/context/base/lang-ini.lua | 218 +-
tex/context/base/lang-ini.tex | 3 +
tex/context/base/lang-ita.tex | 6 +-
tex/context/base/lang-mis.tex | 20 +-
tex/context/base/luat-cbk.lua | 95 +-
tex/context/base/luat-env.tex | 11 +-
tex/context/base/luat-inp.lua | 64 +-
tex/context/base/luat-lib.lua | 85 +-
tex/context/base/luat-log.lua | 12 +
tex/context/base/luat-tex.lua | 99 +-
tex/context/base/luat-tmp.lua | 4 +-
tex/context/base/luat-tra.lua | 53 +-
tex/context/base/lxml-ini.lua | 112 +-
tex/context/base/lxml-ini.tex | 17 +-
tex/context/base/m-chart.tex | 62 +-
tex/context/base/m-graph.mkii | 72 +
tex/context/base/m-graph.mkiv | 63 +
tex/context/base/m-graph.tex | 191 +-
tex/context/base/m-mkivhacks.tex | 52 +
tex/context/base/m-timing.tex | 2 +
tex/context/base/m-translate.tex | 88 +
tex/context/base/math-ini.lua | 2 +-
tex/context/base/math-ini.tex | 125 -
tex/context/base/math-lbr.tex | 7 +
tex/context/base/meta-ini.mkii | 29 +-
tex/context/base/meta-ini.mkiv | 12 +-
tex/context/base/meta-pdf.lua | 2 -
tex/context/base/meta-pdf.mkii | 88 -
tex/context/base/meta-pdf.tex | 72 +-
tex/context/base/meta-tex.mkiv | 21 +-
tex/context/base/mlib-pdf.lua | 2 +
tex/context/base/mlib-pps.lua | 124 +-
tex/context/base/mlib-pps.tex | 14 +-
tex/context/base/mlib-run.lua | 7 +-
tex/context/base/mult-com.tex | 2737 +--
tex/context/base/mult-con.tex | 4015 +---
tex/context/base/mult-de.tex | 1576 ++
tex/context/base/mult-def.lua | 15651 +++++++++++++++
tex/context/base/mult-def.tex | 27 +
tex/context/base/mult-en.tex | 1576 ++
tex/context/base/mult-fr.tex | 1576 ++
tex/context/base/mult-fst.tex | 31 +-
tex/context/base/mult-his.tex | 1164 ++
tex/context/base/mult-ini.mkii | 807 +-
tex/context/base/mult-ini.mkiv | 813 +-
tex/context/base/mult-ini.tex | 1493 --
tex/context/base/mult-it.tex | 1576 ++
tex/context/base/mult-nl.tex | 1576 ++
tex/context/base/mult-ro.tex | 1576 ++
tex/context/base/mult-sys.tex | 10 +
tex/context/base/node-ini.lua | 287 +-
tex/context/base/node-ini.tex | 1 +
tex/context/base/node-par.lua | 43 +
tex/context/base/node-par.tex | 60 +
tex/context/base/node-seq.lua | 161 +
tex/context/base/page-bck.tex | 6 +-
tex/context/base/page-imp.tex | 14 +-
tex/context/base/page-ini.tex | 28 -
tex/context/base/page-lay.tex | 7 +-
tex/context/base/page-log.tex | 7 +-
tex/context/base/page-lyr.tex | 47 +-
tex/context/base/page-mar.tex | 2 +-
tex/context/base/page-mul.tex | 4 +-
tex/context/base/page-num.tex | 34 +-
tex/context/base/page-plg.tex | 3 +-
tex/context/base/page-set.tex | 130 +-
tex/context/base/page-txt.tex | 24 +-
tex/context/base/ppchtex.tex | 5 +
tex/context/base/prop-lay.mkii | 44 +
tex/context/base/prop-lay.mkiv | 52 +
tex/context/base/prop-lay.tex | 35 +-
tex/context/base/regi-ini.lua | 6 +-
tex/context/base/regi-ini.mkiv | 20 +-
tex/context/base/regi-utf.tex | 4 -
tex/context/base/s-mag-01.tex | 4 +-
tex/context/base/s-map-10.tex | 5 +
tex/context/base/s-pre-70.tex | 170 +
tex/context/base/s-pre-71.tex | 208 +
tex/context/base/spec-def.mkii | 4 +
tex/context/base/spec-def.mkiv | 4 +
tex/context/base/spec-def.tex | 15 +-
tex/context/base/spec-dpx.tex | 59 +-
tex/context/base/spec-fdf.mkii | 10 -
tex/context/base/spec-fdf.tex | 19 -
tex/context/base/spec-ini.tex | 48 +-
tex/context/base/spec-tpd.tex | 7 +-
tex/context/base/supp-fun.tex | 15 +-
tex/context/base/supp-lan.tex | 67 -
tex/context/base/supp-mat.tex | 2 +-
tex/context/base/supp-mps.tex | 16 +-
tex/context/base/supp-pdf.tex | 91 -
tex/context/base/supp-tpi.tex | 4 +-
tex/context/base/syst-cat.mkiv | 4 +
tex/context/base/syst-cat.tex | 25 +-
tex/context/base/syst-etx.tex | 5 +-
tex/context/base/syst-ext.tex | 10 +-
tex/context/base/syst-fnt.tex | 26 +-
tex/context/base/syst-gen.tex | 2 +-
tex/context/base/syst-new.tex | 45 +-
tex/context/base/syst-pdt.tex | 10 +-
tex/context/base/syst-tex.tex | 5 +-
tex/context/base/type-gyr.tex | 4 +-
tex/context/base/type-ini.tex | 57 +-
tex/context/base/type-msw.tex | 8 +-
tex/context/base/type-one.tex | 48 +-
tex/context/base/type-otf.tex | 4 +-
tex/context/base/type-siz.tex | 3 +
tex/context/base/unic-ini.mkii | 93 +-
tex/context/base/verb-ini.tex | 14 -
tex/context/base/verb-tex.tex | 4 -
tex/context/base/x-cals.mkiv | 7 +-
tex/context/base/x-mathml.lua | 1 +
tex/context/base/x-mathml.mkiv | 57 +-
tex/context/base/x-res-01.tex | 4 +-
tex/context/base/x-set-01.tex | 4 +
tex/context/base/x-set-02.tex | 2 +
tex/context/base/xtag-exp.tex | 6 -
tex/context/base/xtag-ext.tex | 5 -
tex/context/base/xtag-ini.tex | 28 +-
tex/context/base/xtag-map.tex | 4 -
tex/context/base/xtag-pre.tex | 4 -
tex/context/base/xtag-stk.tex | 5 -
tex/context/bib/bibl-apa.tex | 28 +-
tex/context/bib/t-bib.tex | 250 +-
tex/context/interface/cont-cs.xml | 356 +-
tex/context/interface/cont-cz.xml | 19780 +++++++++----------
tex/context/interface/cont-de.xml | 356 +-
tex/context/interface/cont-en.xml | 328 +-
tex/context/interface/cont-fr.xml | 344 +-
tex/context/interface/cont-it.xml | 356 +-
tex/context/interface/cont-nl.xml | 358 +-
tex/context/interface/cont-pe.xml | 10222 ++++++++++
tex/context/interface/cont-ro.xml | 350 +-
tex/context/interface/keys-cs.xml | 3232 ++-
tex/context/interface/keys-cz.xml | 3231 ++-
tex/context/interface/keys-de.xml | 3232 ++-
tex/context/interface/keys-en.xml | 3232 ++-
tex/context/interface/keys-fr.xml | 3231 ++-
tex/context/interface/keys-it.xml | 3232 ++-
tex/context/interface/keys-nl.xml | 3232 ++-
tex/context/interface/keys-pe.xml | 1589 ++
tex/context/interface/keys-ro.xml | 3232 ++-
tex/context/interface/t-bib.xml | 1 +
tex/generic/context/mptopdf.tex | 1 +
tpm/t-bib.tpm | 6 +-
web2c/context.cnf | 2 +-
342 files changed, 93909 insertions(+), 55759 deletions(-)
delete mode 100644 context/config/texexec.rme
delete mode 100644 fonts/map/dvipdfm/context/8r-base.map
delete mode 100644 fonts/map/dvipdfm/context/ec-base.map
delete mode 100644 fonts/map/dvipdfm/context/ec-os-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/ec-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/el-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/original-adobe-euro.map
delete mode 100644 fonts/map/dvipdfm/context/original-ams-base.map
delete mode 100644 fonts/map/dvipdfm/context/original-ams-cmr.map
delete mode 100644 fonts/map/dvipdfm/context/original-ams-euler.map
delete mode 100644 fonts/map/dvipdfm/context/original-base.map
delete mode 100644 fonts/map/dvipdfm/context/original-context-symbol.map
delete mode 100644 fonts/map/dvipdfm/context/original-dummy.map
delete mode 100644 fonts/map/dvipdfm/context/original-empty.map
delete mode 100644 fonts/map/dvipdfm/context/original-micropress-informal.map
delete mode 100644 fonts/map/dvipdfm/context/original-public-csr.map
delete mode 100644 fonts/map/dvipdfm/context/original-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/original-public-plr.map
delete mode 100644 fonts/map/dvipdfm/context/original-public-vnr.map
delete mode 100644 fonts/map/dvipdfm/context/original-vogel-symbol.map
delete mode 100644 fonts/map/dvipdfm/context/original-wasy.map
delete mode 100644 fonts/map/dvipdfm/context/original-youngryu-px.map
delete mode 100644 fonts/map/dvipdfm/context/original-youngryu-tx.map
delete mode 100644 fonts/map/dvipdfm/context/qx-base.map
delete mode 100644 fonts/map/dvipdfm/context/qx-os-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/qx-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/t5-base.map
delete mode 100644 fonts/map/dvipdfm/context/t5-os-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/t5-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/texnansi-base.map
delete mode 100644 fonts/map/dvipdfm/context/texnansi-os-public-lm.map
delete mode 100644 fonts/map/dvipdfm/context/texnansi-public-lm.map
delete mode 100644 tex/context/base/char-def.tex
create mode 100644 tex/context/base/colo-ini.lua
create mode 100644 tex/context/base/colo-ini.mkii
create mode 100644 tex/context/base/colo-ini.mkiv
delete mode 100644 tex/context/base/colo-new.lua
delete mode 100644 tex/context/base/colo-new.mkii
delete mode 100644 tex/context/base/colo-new.mkiv
delete mode 100644 tex/context/base/colo-new.tex
create mode 100644 tex/context/base/cont-pe.tex
create mode 100644 tex/context/base/context.mkii
create mode 100644 tex/context/base/context.mkiv
create mode 100644 tex/context/base/core-blk.lua
create mode 100644 tex/context/base/core-blk.mkiv
create mode 100644 tex/context/base/core-ref.lua
create mode 100644 tex/context/base/core-ref.mkii
create mode 100644 tex/context/base/core-ref.mkiv
create mode 100644 tex/context/base/core-sec.mkii
create mode 100644 tex/context/base/core-sec.mkiv
delete mode 100644 tex/context/base/core-sec.tex
delete mode 100644 tex/context/base/font-ini.tex
create mode 100644 tex/context/base/font-pat.lua
delete mode 100644 tex/context/base/l-xml-edu.lua
create mode 100644 tex/context/base/m-graph.mkii
create mode 100644 tex/context/base/m-graph.mkiv
create mode 100644 tex/context/base/m-mkivhacks.tex
create mode 100644 tex/context/base/m-translate.tex
create mode 100644 tex/context/base/mult-de.tex
create mode 100644 tex/context/base/mult-def.lua
create mode 100644 tex/context/base/mult-def.tex
create mode 100644 tex/context/base/mult-en.tex
create mode 100644 tex/context/base/mult-fr.tex
create mode 100644 tex/context/base/mult-his.tex
delete mode 100644 tex/context/base/mult-ini.tex
create mode 100644 tex/context/base/mult-it.tex
create mode 100644 tex/context/base/mult-nl.tex
create mode 100644 tex/context/base/mult-ro.tex
create mode 100644 tex/context/base/node-par.lua
create mode 100644 tex/context/base/node-par.tex
create mode 100644 tex/context/base/node-seq.lua
create mode 100644 tex/context/base/prop-lay.mkii
create mode 100644 tex/context/base/prop-lay.mkiv
create mode 100644 tex/context/base/s-pre-70.tex
create mode 100644 tex/context/base/s-pre-71.tex
create mode 100644 tex/context/interface/cont-pe.xml
create mode 100644 tex/context/interface/keys-pe.xml
diff --git a/context/config/texexec.rme b/context/config/texexec.rme
deleted file mode 100644
index 43f142f9d..000000000
--- a/context/config/texexec.rme
+++ /dev/null
@@ -1,169 +0,0 @@
-% == introduction ==
-%
-% This is 'texexec.ini', the file used by texexec to determine where
-% to find files, what TeX to use, what flags to pass, etc. Although
-% TeXexec tries to locate things itself, a little help is sometimes
-% needed. One can influence texexec by setting some variables. These
-% are only needed when the automatic determined settings fail.
-%
-% == interfacing ==
-%
-% UsedInterfaces nl,en the formats generated with --make
-% UserInterface nl the default format used
-%
-% == binaries ==
-%
-% TeXExecutable pdfetex the TeX binary to use
-% MpExecutable mpost the MetaPost binary to use
-% MpToTeXExecutable mpto the MetaPost to TeX converter
-% DviToMpExecutable dvitomp the DVI to MetaPost converter
-%
-% == Scripts ==
-%
-% DviSpecialScript dvispec the DVI special filter script
-%
-% == flags ==
-%
-% TeXFormatFlag -fmt= the format introducer
-% TeXVirginFlag -ini the format generation switch
-%
-% == paths ==
-%
-% TeXFormatPath texmf/... fmt files
-% ConTeXtPath texmf/tex/context/base sources
-% SetupPath texmf/tex/base/user cont-sys/usr file
-% TeXScriptsPath texmf/context/perltk scripts
-% TeXFontsPath texmf font files
-%
-% MpFormatPath TeXFormatPath mem files
-%
-% == the main shell setting ==
-%
-% As shown below, one can define his/her own sections. We default to
-% the teTeX/fpTeX web2c based settings.
-
-set TeXShell to tetex
-%set TeXShell to fptex
-%set TeXShell to miktex
-%set TeXShell to private
-
-% == setting up the variables ==
-%
-% Here are some general defaults. They can be overruled later.
-
-set UseEnginePath to true
-
-set UsedInterfaces to en nl metafun mptopdf
-set UserInterface to en
-
-set TeXExecutable to tex
-
-set MpExecutable to mpost
-set MpToTeXExecutable to mpto
-set DviToMpExecutable to dvitomp
-set DviSpecialScript to dvispec
-
-set MpFormat to metafun
-
-set TeXFormatFlag to &
-set MpFormatFlag to &
-
-% For teTeX the next settings will do.
-
-% -default-translate-file=cp8bit -file-line-error-style
-
-for tetex set TeXHashExecutable to mktexlsr
-for tetex set TeXExecutable to pdfetex
-for tetex set TeXVirginFlag to -ini
-for tetex set TeXPassString to -progname=context
-for tetex set TeXBatchFlag to -int=batchmode
-for tetex set TeXNonStopFlag to -int=nonstopmode
-for tetex set MpToTeXExecutable to mpto
-for tetex set MpVirginFlag to -ini
-for tetex set MpPassString to -progname=mpost
-for tetex set MpBatchFlag to -int=batchmode
-for tetex set MpNonStopFlag to -int=nonstopmode
-
-% These also apply to fpTeX.
-
-% -default-translate-file=cp8bit -file-line-error-style
-
-for fptex set TeXHashExecutable to mktexlsr
-for fptex set TeXExecutable to pdfetex
-for fptex set TeXVirginFlag to -ini
-for fptex set TeXPassString to -progname=context
-for fptex set TeXBatchFlag to -int=batchmode
-for fptex set TeXNonStopFlag to -int=nonstopmode
-for fptex set MpToTeXExecutable to mpto
-for fptex set MpVirginFlag to -ini
-for fptex set MpPassString to -progname=mpost
-for fptex set MpBatchFlag to -int=batchmode
-for fptex set MpNonStopFlag to -int=nonstopmode
-
-% a downward compatibility test (<7.5.3), next year we will use -8bit
-
-for tetex set TeXVirginFlag to -ini -translate-file=natural.tcx
-for fptex set TeXVirginFlag to -ini -translate-file=natural.tcx
-for tetex set MpVirginFlag to -ini -translate-file=natural.tcx
-for fptex set MpVirginFlag to -ini -translate-file=natural.tcx
-
-for tetex set TeXPassString to -progname=context -translate-file=natural.tcx
-for fptex set TeXPassString to -progname=context -translate-file=natural.tcx
-for tetex set MpPassString to -progname=mpost -translate-file=natural.tcx
-for fptex set MpPassString to -progname=mpost -translate-file=natural.tcx
-
-% MikTeX users probably have to set up some paths too.
-
-for miktex set TeXHashExecutable to initexmf --update-fndb
-for miktex set TeXExecutable to pdfetex
-for miktex set TeXVirginFlag to --initialize
-for miktex set TeXPassString to --alias=context --translate-file=natural.tcx
-for miktex set TeXBatchFlag to --interaction=batchmode
-for miktex set TeXNonStopFlag to --interaction=nonstopmode
-for miktex set MpToTeXExecutable to mpto
-for miktex set MpVirginFlag to --initialize
-for miktex set MpPassString to --alias=mpost --translate-file=natural.tcx
-for miktex set MpBatchFlag to --interaction=batchmode
-for miktex set MpNonStopFlag to --interaction=nonstopmode
-
-for miktex set TeXFormatFlag to --undump=
-for miktex set MpFormatFlag to --undump=
-
-% These are the settings used on some machines at PRAGMA ADE that
-% don't use the texmf tree. They can serve as an example for local
-% settings. Local settings should either be added to the previous
-% one, or go without the 'for' directives. Consider these
-% settings as an example.
-
-for private set UsedInterfaces to en nl
-for private set UserInterface to nl
-for private set ConTeXtPath to t:/sources/
-for private set SetupPath to t:/perl/
-for private set TeXScriptsPath to t:/perl/
-
-% == read this too ==
-%
-% If this file is called 'texexec.rme', copy it to 'texexec.ini',
-% check the settings above, change them according to your TeX
-% distribution, and say:
-%
-% texexec --verbose
-%
-% When set up properly, you should see your local settings fly by.
-% When these settings are ok, the next call should work:
-%
-% texexec --make
-%
-% and you should be able to process a file by saying
-%
-% texexec filename
-%
-% See 'mtexexec.pdf' for more information on the flags you can use with
-% 'texexec'. Also make sure you have the 'texutil' script installed in
-% the same path as 'texexec'.
-
-% Experimental
-%
-% set TcXPath to d:/tex/texmf/web2c
-% set FmtLanguage to pl
-% set FmtBodyFont to plr
diff --git a/context/data/cont-cs-scite.properties b/context/data/cont-cs-scite.properties
index 602aabbc6..fbc653e57 100644
--- a/context/data/cont-cs-scite.properties
+++ b/context/data/cont-cs-scite.properties
@@ -5,84 +5,86 @@ aktualnicislonadpisu aktualnidatum appendix barva bilemisto bublinkovanapoveda \
bypassblocks cap cernalinka cernelinky chapter chem \
cisla cislonadpisu citace citovat completecombinedlist completelistoffloats \
completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum \
-definetype definuj definujbarvu definujblok definujbloksekce definujbuffer \
+definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetype \
+definetypeface definuj definujbarvu definujblok definujbloksekce definujbuffer \
definujfont definujformatodkazu definujinterakcnimenu definujinterakcnimenu definujkombinovanyseznam definujkonverzi \
definujlogo definujnadpis definujobrazeksymbol definujodkaz definujodsazovani definujodstavce \
definujopis definujoramovani definujoramovanytext definujpaletu definujplvouciobjekt definujpodpole \
definujpole definujpopis definujpopisek definujprekryv definujpreskok definujprofil \
definujprogram definujprostredizakladnihofontu definujrejstrik definujsablonutabulky definujsekci definujseznam \
-definujseznamodkazu definujskupinubarev definujstartstop definujsymbol definujsynonyma definujtabelaci \
-definujtext definujtrideni definujupravu definujvelikostpapiru definujverzi definujvycet \
-definujvystup definujzakladnifont definujzasobnikpoli definujznaceni description dodrzujprofil \
-dodrzujverzi dodrzujverziprofilu dvoustrannypapir emptylines enumeration externiobraz \
-footnotetext forceblocks framedtext hl hlavnijazyk indentation \
-ininner inouter instalacejazyka interakcnilista interakcnitlacitka jazyk \
-jdidolu jdina jdinabox klonujpole komentar konvertujcislo \
-kopirujpole korekcebilehomista labeling listsymbol loadsorts loadsynonyms \
-marginalnilinka marginalnitext matematika mediaeval meritko mesic \
-mezera mrizka nadpis nadruhyokraj nadtrzeni nadtrzeno \
-name naokraj nastavbarvu nastavbarvy nastavbilamista nastavblok \
-nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu nastavcislostrany nastavcislovani \
-nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran nastavcitaci nastavdefinicipoznamekpodcarou nastavdeleniplvoucichobjektu \
-nastavdelitko nastavdolnitexty nastavexterniobrazy nastavhorejsek nastavhornitexty nastavinterakci \
-nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk nastavkapitalky nastavkombinovanyseznam \
-nastavkomentar nastavlegendu nastavmarginalie nastavmarginalniblok nastavmarginalnilinky nastavmeziradkovoumezeru \
-nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsazeni nastavodsazovani \
-nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez nastavotoceni \
-nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany nastavpodtrzeni nastavpole \
-nastavpolozky nastavpopisek nastavpopisky nastavpopisy nastavpozadi nastavpozadi \
-nastavpoznamkypodcarou nastavprechodstrany nastavpreskok nastavprofily nastavprogramy nastavprostredizakladnihofontu \
-nastavpublikace nastavradkovani nastavradky nastavrastr nastavrejstrik nastavrovnice \
-nastavsadusymbolu nastavsekci nastavseznam nastavseznamodkazu nastavsirkucary nastavsloupce \
-nastavspodek nastavspojeni nastavsynchronizaci nastavsynchronizacnilistu nastavsynonyma nastavsystem \
-nastavtab nastavtabelaci nastavtabulky nastavtenkelinky nastavtext nastavtexthlavicky \
-nastavtextovelinky nastavtextpopisku nastavtexttexty nastavtextyupati nastavtextyzahlavi nastavtlacitka \
-nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku nastavumistovani nastavupati \
-nastavupravu nastavurl nastavusporadani nastavvelikostpapiru nastavverze nastavvsechnapole \
-nastavvycty nastavvyplnovelinky nastavvyplnoveradky nastavvystup nastavvzhled nastavzahlavi \
-nastavzakladnifont nastavzarovnani nastavznaceni nastavzuzeni nastrane nejakyradek \
-nekde nextsection nivy nizky nocap nop \
-obrazovka odkaz odkaz odkaznadatum odkaznastranu odkaznatext \
-odsazovani okr opis opissoubor oramovani oref \
-orez otocit oznacverzi paragraph parovastrana part \
-pis placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist \
-podtrzeni podtrzeno pol pole polozka polozky \
-popisky porovnejpaletu porovnejskupinubarev pozadi pozice poznamka \
-poznamkapodcarou pref prelozit premistinamrizku prepninazakladnifont preskoc \
-preskrtnuti preskrtnuto prizpusobivepole prizpusobvzhled program propojeneznaceni \
-propojenydokument propojenyrejstrik publikace ran ref register \
-reservefloat reset resettextcontent resetznaceni rimskecislice rozdelplvouciobjekt \
-rozpojeneznaceni roztazene schovejbloky section sedabarva seeregister \
-settextcontent setupforms setupitemgroup setuplistalternative setuppaper setupstrut \
-sloupec slovovpravo sort spodek stanovcharakteristickuseznamu stanovcislonadpisu \
-startalignment startbarva startbuffer startbuffer startcitace startcolumns \
-startcombination startdescription startdocument startenumeration startfakt startfigure \
-startfloattext startformula startframedtext starthiding startinteraktivnimenu startitemgroup \
-startkomentar startkomponenta startlegend startline startlinecorrection startlinenumbering \
-startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginalnilinka \
-startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview \
-startparagraph startpositioning startpostponing startpozadi startprodukt startprofile \
-startprojekt startprostredi startregister startsymbolset startsynchronization starttable \
-starttables starttabulate starttextovalinka starttyping startunpacked startverze \
-startzhustene stopalignment stopbarva stopbuffer stopbuffer stopcitace \
-stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfakt \
-stopfigure stopfloattext stopformula stopframedtext stophiding stopinteraktivnimenu \
-stopitemgroup stopkomentar stopkomponenta stoplegend stopline stoplinecorrection \
-stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup \
-stopmarginalnilinka stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay \
-stopoverview stopparagraph stoppositioning stoppostponing stoppozadi stopprodukt \
-stopprofile stopprojekt stopprostredi stopsymbolset stopsynchronization stoptable \
-stoptables stoptabulate stoptextovalinka stoptyping stopunpacked stopverze \
-stopzhustene strana sub subject subsection subsubject \
-subsubsection subsubsubject sym symbol synchronizacnilista synchronizovat \
-synonym tab tecky tenkalinka tenkelinky tex \
-texthlavicky textovalinka textpopisku title tlacitko tref \
-tvrdemezery typebuffer typstrany ukazbarvu ukazexterniobrazy ukazmrizku \
-ukaznastaveni ukazpaletu ukazpodpery ukazpole ukazpostredizakladnihofontu ukazramecek \
-ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk ukazvzhled ukazzakladnifont \
-umistikombinovanyseznam umistikombinovanyseznam umistilegendu umistiloga umistilokalnipoznamkypodcarou umistinadsebe \
-umistinamrizku umistipodrovnici umistipoznamkypodcarou umistirejstrik umistirejstrik umistirovnici \
-umistiseznam umistivedlesebe umistizalozky usedirectory uzijURL uzijbloky \
+definujseznamodkazu definujskupinubarev definujstartstop definujsymbol definujsynonumumfontu definujsynonyma \
+definujtabelaci definujtext definujtrideni definujupravu definujvelikostpapiru definujverzi \
+definujvycet definujvystup definujzakladnifont definujzasobnikpoli definujznaceni description \
+dodrzujprofil dodrzujverzi dodrzujverziprofilu dvoustrannypapir emptylines enumeration \
+externiobraz footnotetext forceblocks framedtext hl hlavnijazyk \
+indentation ininner inouter instalacejazyka interakcnilista interakcnitlacitka \
+jazyk jdidolu jdina jdinabox klonujpole komentar \
+konvertujcislo kopirujpole korekcebilehomista labeling listsymbol loadsorts \
+loadsynonyms mapfontsize marginalnilinka marginalnitext matematika mediaeval \
+meritko mesic mezera mrizka nadpis nadruhyokraj \
+nadtrzeni nadtrzeno name naokraj nastavbarvu nastavbarvy \
+nastavbilamista nastavblok nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu \
+nastavcislostrany nastavcislovani nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran nastavcitaci \
+nastavdefinicipoznamekpodcarou nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty nastavexterniobrazy nastavhorejsek \
+nastavhornitexty nastavinterakci nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk \
+nastavkapitalky nastavkombinovanyseznam nastavkomentar nastavlegendu nastavmarginalie nastavmarginalniblok \
+nastavmarginalnilinky nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsazeni \
+nastavodsazovani nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez \
+nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany nastavpodtrzeni \
+nastavpole nastavpolozky nastavpopisek nastavpopisky nastavpopisy nastavpozadi \
+nastavpozadi nastavpoznamkypodcarou nastavprechodstrany nastavpreskok nastavprofily nastavprogramy \
+nastavprostredizakladnihofontu nastavpublikace nastavradkovani nastavradky nastavrastr nastavrejstrik \
+nastavrovnice nastavsadusymbolu nastavsekci nastavseznam nastavseznamodkazu nastavsirkucary \
+nastavsloupce nastavspodek nastavspojeni nastavsynchronizaci nastavsynchronizacnilistu nastavsynonyma \
+nastavsystem nastavtab nastavtabelaci nastavtabulky nastavtenkelinky nastavtext \
+nastavtexthlavicky nastavtextovelinky nastavtextpopisku nastavtexttexty nastavtextyupati nastavtextyzahlavi \
+nastavtlacitka nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku nastavumistovani \
+nastavupati nastavupravu nastavurl nastavusporadani nastavvelikostpapiru nastavverze \
+nastavvsechnapole nastavvycty nastavvyplnovelinky nastavvyplnoveradky nastavvystup nastavvzhled \
+nastavzahlavi nastavzakladnifont nastavzarovnani nastavznaceni nastavzuzeni nastrane \
+nejakyradek nekde nextsection nivy nizky nocap \
+nop obrazovka odkaz odkaz odkaznadatum odkaznastranu \
+odkaznatext odsazovani okr opis opissoubor oramovani \
+oref orez otocit oznacverzi paragraph parovastrana \
+part pis placefloat placelistoffloats placelistofsorts placelistofsynonyms \
+placereferencelist podtrzeni podtrzeno pol pole polozka \
+polozky popisky porovnejpaletu porovnejskupinubarev pozadi pozice \
+poznamka poznamkapodcarou pref prelozit premistinamrizku prepninazakladnifont \
+preskoc preskrtnuti preskrtnuto prizpusobivepole prizpusobvzhled program \
+propojeneznaceni propojenydokument propojenyrejstrik publikace ran ref \
+register reservefloat reset resettextcontent resetznaceni rimskecislice \
+rozdelplvouciobjekt rozpojeneznaceni roztazene schovejbloky section sedabarva \
+seeregister settextcontent setupfonthandling setupfontsynonym setupforms setupinterlinespace2 \
+setupitemgroup setuplistalternative setuppaper setupstrut sloupec slovovpravo \
+sort spodek stanovcharakteristickuseznamu stanovcislonadpisu startalignment startbarva \
+startbuffer startbuffer startcitace startcolumns startcombination startdescription \
+startdocument startenumeration startfakt startfigure startfloattext startformula \
+startframedtext starthiding startinteraktivnimenu startitemgroup startkomentar startkomponenta \
+startlegend startline startlinecorrection startlinenumbering startlines startlocal \
+startlocalenvironment startlocalfootnotes startmakeup startmarginalnilinka startmarginblock startnamemakeup \
+startnarrower startopposite startoverlay startoverview startparagraph startpositioning \
+startpostponing startpozadi startprodukt startprofile startprojekt startprostredi \
+startregister startsymbolset startsynchronization starttable starttables starttabulate \
+starttextovalinka starttyping startunpacked startverze startzhustene stopalignment \
+stopbarva stopbuffer stopbuffer stopcitace stopcolumns stopcombination \
+stopdescription stopdocument stopenumeration stopfakt stopfigure stopfloattext \
+stopformula stopframedtext stophiding stopinteraktivnimenu stopitemgroup stopkomentar \
+stopkomponenta stoplegend stopline stoplinecorrection stoplinenumbering stoplines \
+stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginalnilinka stopmarginblock \
+stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph \
+stoppositioning stoppostponing stoppozadi stopprodukt stopprofile stopprojekt \
+stopprostredi stopsymbolset stopsynchronization stoptable stoptables stoptabulate \
+stoptextovalinka stoptyping stopunpacked stopverze stopzhustene strana \
+sub subject subsection subsubject subsubsection subsubsubject \
+sym symbol synchronizacnilista synchronizovat synonym tab \
+tecky tenkalinka tenkelinky tex texthlavicky textovalinka \
+textpopisku title tlacitko tref tvrdemezery typebuffer \
+typstrany ukazbarvu ukazexterniobrazy ukazmrizku ukaznastaveni ukazpaletu \
+ukazpodpery ukazpole ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu ukazskupinubarev \
+ukazupravu ukazvytisk ukazvzhled ukazzakladnifont umistikombinovanyseznam umistikombinovanyseznam \
+umistilegendu umistiloga umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici \
+umistipoznamkypodcarou umistirejstrik umistirejstrik umistirovnici umistiseznam umistivedlesebe \
+umistizalozky usedirectory usetypescript usetypescriptfile uzijURL uzijbloky \
uzijexternidokument uzijexterniobraz uzijexternisoubor uzijexternisoubory uzijexternizvuk uzijkodovani \
uzijmodul uzijodkazy uzijprikazy uzijspeciality uzijsymbol verze \
vl vlasovalinka vlevo vpravo vradku vsedniden \
diff --git a/context/data/cont-de-scite.properties b/context/data/cont-de-scite.properties
index a08cc5ea1..f749bfe97 100644
--- a/context/data/cont-de-scite.properties
+++ b/context/data/cont-de-scite.properties
@@ -7,84 +7,86 @@ benutzespezielles beschrifteversion beschriftung bestimmekopfnummer bestimmelist
blanko bookmark bruch buchstabe buchstaben but \
bypassblocks cap chapter chem completecombinedlist completelistoffloats \
completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum \
-defineoutput definetype definiereabbsymbol definiereabsaetze definiereabschnitt definiereabschnittsblock \
-definierebeschreibung definierebeschreibungen definierebeschriftung definiereblanko definiereblock definiereeinzug \
-definierefarbe definierefarbengruppe definierefeld definierefeldstapel definierefliesstext definierefliesstextumgebung \
-definieregleitobjekt definiereinteraktionsmenue definiereinteraktionsmenue definierekonversion definierelabel definiereliste \
-definierelogo definieren definierenummerierung definiereoverlay definierepalette definierepapierformat \
-definiereprofil definiereprogramme definierepuffer definierereferenz definierereferenzformat definierereferenzliste \
-definiereregister definiereschrift definieresortieren definierestartstop definieresubfeld definieresymbol \
-definieresynonyme definieretabellenvorlage definieretabulator definieretext definieretippen definiereueberschrift \
-definiereumbruch definiereumrahmt definiereumrahmtertext definiereversion definierezusammengestellteliste description \
-doppelseite doppelseitigespapier drehen duennelinie duennerumriss durchgestrichen \
-durchstreichen einezeile einziehen emptylines entknuepfebeschriftung enumeration \
-externeabbildung farbe feld feldstapel festesspatium folgeprofil \
-folgeprofilversion folgeversion footnotetext forceblocks format framedtext \
-fussnote gefuelltesrechteck gefuelltezeile gestreckt gitter graufarbe \
-haarlinie hauptsprache heutigesdatum heutigeskopfnummer hintergrund hl \
-hoch holebeschriftung holepuffer imlinken imrechten imumriss \
-in inaktiviereinteraktionsmenue inanderermarginale indentation ininner inmarginalie \
-inouter installieresprache interaktionsbalken interaktionsknopfe inzeile irgendwo \
-its keinebeschriftung keinebloeckemehr keinedateienmehr keinekopfundfusszeilen keineliste \
-keinspatium keinzeilenobenundunten keinzwischenraum kleinerdurchschuss klonierefeld knopf \
-kommentar konvertierezahl kopf kopfnummer kopierefeld korrigierezwischenraum \
-labeling labels labeltext linksbuendig listsymbol loadsorts \
-loadsynonyms mar marginallinie marginaltext mathematik mediaeval \
-monat nachunten name nextsection nichteinziehen nocap \
-nop notiz paragraph part passelayoutan passendfeld \
-placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist platzierebookmarks \
-platziereformel platzierefussnoten platzierelegende platziereliste platzierelogo platzierelokalefussnoten \
-platzierenebeneinander platziereregister platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste \
-platzierezusammengestellteliste pos position posten programm publikation \
-punkt ran rechteck rechtecke rechtsbuendig ref \
-referenz register registrierefelder reservefloat resettextcontent roemischezahlen \
-ruecksetzten ruecksetztenbeschriftung schreibezumregister schreibezurliste schreibezurreferenzliste schreibezwischenliste \
-section seeregister seite seitenreferenz seitentyp settext \
-setupforms setupitemgroup setuplistalternative setuppaper setupstrut showsymbolset \
-sort spalte spatium spiegeln sprache startalignment \
-startbuffer startbuffer startcolumns startcombination startdescription startdocument \
-startenumeration startfarbe startfigure startfloattext startformula startframedtext \
-startgeg starthiding starthintergrund startinteraktionsmenue startitemgroup startkleinerdurchschuss \
-startkommentar startkomponente startlegend startline startlinecorrection startlinenumbering \
-startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginallinie \
-startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview \
-startparagraph startpositioning startpostponing startprodukt startprofile startprojekt \
-startregister startsymbolset startsynchronization starttable starttables starttabulate \
-starttextlinie starttyping startumgebung startunpacked startversion startzitat \
-stelleabsaetzeein stelleabsatznummerierungein stelleabschnittein stelleabschnittsblockein stelleanordnenein stelleausgabeein \
-stelleausrichtungein stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein \
-stellebindestrichein stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein \
-stelleeinzuegein stelleengerein stelleexterneabbildungenein stellefarbeein stellefarbenein stellefeldein \
-stellefelderin stellefliesstextein stellefliesstextumgebungein stelleformelnein stellefussnotendefinitionein stellefussnotenein \
-stellefusszeileein stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein \
-stellegleitobjektein stellehintergruendeein stellehintergrundein stelleinmarginalieein stelleinteraktionein stelleinteraktionsbalkenein \
-stelleinteraktionsbildschirmein stelleinteraktionsmenueein stelleknopfein stellekombinationein stellekommentarein stellekopfzahlein \
-stellekopfzeileein stellekopfzeilentextein stellelabeltextein stellelayoutein stellelegendeein stellelinienbreiteein \
-stellelisteein stellemarginalblockein stellemarginallinieein stellenobenein stellenummerierungein stellepaletteein \
-stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein stelleprofilein stelleprogrammein \
-stellepublikationein stellepufferein stellerasterein stellerechteckein stellereferenzierenein stellereferenzlisteein \
-stelleregisterein stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein stellespaltenein \
-stellespatiumein stellespracheein stellesymbolsetein stellesynchronisationein stellesynchronisationsbalkenein stellesynonymein \
-stellesystemein stelletabein stelletabellenein stelletabulatorein stelletextein stelletextobenein \
-stelletexttexteein stelletextumrissein stelletextuntenein stelletipein stelletippenein stelletoleranzein \
-stelleueberschriftein stelleueberschriftenein stelleueberschrifttextein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein \
-stelleuntenein stelleunterseitennummerein stelleunterstreichenein stelleurlein stelleversalienein stelleversionein \
-stellezeilenabstandein stellezeilenabstandein stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein \
-stellezwischenraumein stopalignment stopbuffer stopbuffer stopcolumns stopcombination \
-stopdescription stopdocument stopenumeration stopfarbe stopfigure stopfloattext \
-stopformula stopframedtext stopgeg stophiding stophintergrund stopinteraktionsmenue \
-stopitemgroup stopkleinerdurchschuss stopkommentar stopkomponente stoplegend stopline \
-stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes \
-stopmakeup stopmarginallinie stopmarginblock stopnamemakeup stopnarrower stopopposite \
-stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt \
-stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables \
-stoptabulate stoptextlinie stoptyping stopumgebung stopunpacked stopversion \
-stopzitat sub subject subsection subsubject subsubsection \
-subsubsubject sym symbol synchronisationsbalken synchronisieren synonym \
-tab teilegleitobjekt tex textlinie textreferenz tief \
-tiho tip tippedatei tippen tippepuffer title \
-tooltip ueber ueberschrifttext uebersetzten ueberstreichen ueberstrichen \
-umrahmt unterstreichen unterstrichen usedirectory verbergebloecke vergleichefarbengruppe \
+definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineoutput \
+defineschriftsynonym definetype definetypeface definiereabbsymbol definiereabsaetze definiereabschnitt \
+definiereabschnittsblock definierebeschreibung definierebeschreibungen definierebeschriftung definiereblanko definiereblock \
+definiereeinzug definierefarbe definierefarbengruppe definierefeld definierefeldstapel definierefliesstext \
+definierefliesstextumgebung definieregleitobjekt definiereinteraktionsmenue definiereinteraktionsmenue definierekonversion definierelabel \
+definiereliste definierelogo definieren definierenummerierung definiereoverlay definierepalette \
+definierepapierformat definiereprofil definiereprogramme definierepuffer definierereferenz definierereferenzformat \
+definierereferenzliste definiereregister definiereschrift definieresortieren definierestartstop definieresubfeld \
+definieresymbol definieresynonyme definieretabellenvorlage definieretabulator definieretext definieretippen \
+definiereueberschrift definiereumbruch definiereumrahmt definiereumrahmtertext definiereversion definierezusammengestellteliste \
+description doppelseite doppelseitigespapier drehen duennelinie duennerumriss \
+durchgestrichen durchstreichen einezeile einziehen emptylines entknuepfebeschriftung \
+enumeration externeabbildung farbe feld feldstapel festesspatium \
+folgeprofil folgeprofilversion folgeversion footnotetext forceblocks format \
+framedtext fussnote gefuelltesrechteck gefuelltezeile gestreckt gitter \
+graufarbe haarlinie hauptsprache heutigesdatum heutigeskopfnummer hintergrund \
+hl hoch holebeschriftung holepuffer imlinken imrechten \
+imumriss in inaktiviereinteraktionsmenue inanderermarginale indentation ininner \
+inmarginalie inouter installieresprache interaktionsbalken interaktionsknopfe inzeile \
+irgendwo its keinebeschriftung keinebloeckemehr keinedateienmehr keinekopfundfusszeilen \
+keineliste keinspatium keinzeilenobenundunten keinzwischenraum kleinerdurchschuss klonierefeld \
+knopf kommentar konvertierezahl kopf kopfnummer kopierefeld \
+korrigierezwischenraum labeling labels labeltext linksbuendig listsymbol \
+loadsorts loadsynonyms mapfontsize mar marginallinie marginaltext \
+mathematik mediaeval monat nachunten name nextsection \
+nichteinziehen nocap nop notiz paragraph part \
+passelayoutan passendfeld placefloat placelistoffloats placelistofsorts placelistofsynonyms \
+placereferencelist platzierebookmarks platziereformel platzierefussnoten platzierelegende platziereliste \
+platzierelogo platzierelokalefussnoten platzierenebeneinander platziereregister platziereregister platziereuntereinander \
+platziereunterformel platzierezusammengestellteliste platzierezusammengestellteliste pos position posten \
+programm publikation punkt ran rechteck rechtecke \
+rechtsbuendig ref referenz register registrierefelder reservefloat \
+resettextcontent roemischezahlen ruecksetzten ruecksetztenbeschriftung schreibezumregister schreibezurliste \
+schreibezurreferenzliste schreibezwischenliste section seeregister seite seitenreferenz \
+seitentyp settext setupfonthandling setupfontsynonym setupforms setupinterlinespace2 \
+setupitemgroup setuplistalternative setuppaper setupstrut showsymbolset sort \
+spalte spatium spiegeln sprache startalignment startbuffer \
+startbuffer startcolumns startcombination startdescription startdocument startenumeration \
+startfarbe startfigure startfloattext startformula startframedtext startgeg \
+starthiding starthintergrund startinteraktionsmenue startitemgroup startkleinerdurchschuss startkommentar \
+startkomponente startlegend startline startlinecorrection startlinenumbering startlines \
+startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginallinie startmarginblock \
+startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph \
+startpositioning startpostponing startprodukt startprofile startprojekt startregister \
+startsymbolset startsynchronization starttable starttables starttabulate starttextlinie \
+starttyping startumgebung startunpacked startversion startzitat stelleabsaetzeein \
+stelleabsatznummerierungein stelleabschnittein stelleabschnittsblockein stelleanordnenein stelleausgabeein stelleausrichtungein \
+stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein stellebindestrichein \
+stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein stelleeinzuegein \
+stelleengerein stelleexterneabbildungenein stellefarbeein stellefarbenein stellefeldein stellefelderin \
+stellefliesstextein stellefliesstextumgebungein stelleformelnein stellefussnotendefinitionein stellefussnotenein stellefusszeileein \
+stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein stellegleitobjektein \
+stellehintergruendeein stellehintergrundein stelleinmarginalieein stelleinteraktionein stelleinteraktionsbalkenein stelleinteraktionsbildschirmein \
+stelleinteraktionsmenueein stelleknopfein stellekombinationein stellekommentarein stellekopfzahlein stellekopfzeileein \
+stellekopfzeilentextein stellelabeltextein stellelayoutein stellelegendeein stellelinienbreiteein stellelisteein \
+stellemarginalblockein stellemarginallinieein stellenobenein stellenummerierungein stellepaletteein stellepapierformatein \
+stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein stelleprofilein stelleprogrammein stellepublikationein \
+stellepufferein stellerasterein stellerechteckein stellereferenzierenein stellereferenzlisteein stelleregisterein \
+stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein stellespaltenein stellespatiumein \
+stellespracheein stellesymbolsetein stellesynchronisationein stellesynchronisationsbalkenein stellesynonymein stellesystemein \
+stelletabein stelletabellenein stelletabulatorein stelletextein stelletextobenein stelletexttexteein \
+stelletextumrissein stelletextuntenein stelletipein stelletippenein stelletoleranzein stelleueberschriftein \
+stelleueberschriftenein stelleueberschrifttextein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein stelleuntenein \
+stelleunterseitennummerein stelleunterstreichenein stelleurlein stelleversalienein stelleversionein stellezeilenabstandein \
+stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein stellezwischenraumein stopalignment \
+stopbuffer stopbuffer stopcolumns stopcombination stopdescription stopdocument \
+stopenumeration stopfarbe stopfigure stopfloattext stopformula stopframedtext \
+stopgeg stophiding stophintergrund stopinteraktionsmenue stopitemgroup stopkleinerdurchschuss \
+stopkommentar stopkomponente stoplegend stopline stoplinecorrection stoplinenumbering \
+stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginallinie \
+stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview \
+stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt \
+stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextlinie \
+stoptyping stopumgebung stopunpacked stopversion stopzitat sub \
+subject subsection subsubject subsubsection subsubsubject sym \
+symbol synchronisationsbalken synchronisieren synonym tab teilegleitobjekt \
+tex textlinie textreferenz tief tiho tip \
+tippedatei tippen tippepuffer title tooltip ueber \
+ueberschrifttext uebersetzten ueberstreichen ueberstrichen umrahmt unterstreichen \
+unterstrichen usedirectory usetypescript usetypescriptfile verbergebloecke vergleichefarbengruppe \
vergleichepalette verknuepfebeschriftung verknuepfedokument verknuepfregister version verweis \
verweisdatum verwendeURL verwendebefehl verwendebloecke verwendeexteresdokument verwendeexterneabbildung \
verwendeexternedatei verwendeexternedateien verwendeexternestonstueck verwendemodul verwendereferenzen verwendesymbole \
diff --git a/context/data/cont-en-scite.properties b/context/data/cont-en-scite.properties
index d8dd3d486..72414c113 100644
--- a/context/data/cont-en-scite.properties
+++ b/context/data/cont-en-scite.properties
@@ -9,87 +9,89 @@ comparepalet completecombinedlist completelistoffloats completelistofsorts compl
convertnumber copyfield correctwhitespace coupledocument coupledregister couplemarking \
couplepage couplepaper coupleregister crlf currentdate currentheadnumber \
date decouplemarking define defineblank defineblock definebodyfont \
-definebodyfontenvironment definebuffer definecolor definecolorgroup definecombinedlist defineconversion \
-definedescription defineenumeration definefield definefieldstack definefiguresymbol definefloat \
-definefont defineframed defineframedtext definehead defineindenting defineinteractionmenu \
+definebodyfontDEF definebodyfontREF definebodyfontenvironment definebuffer definecolor definecolorgroup \
+definecombinedlist defineconversion definedescription definedfont defineenumeration definefield \
+definefieldstack definefiguresymbol definefloat definefont definefontfeature definefonthandling \
+definefontsynonym defineframed defineframedtext definehead defineindenting defineinteractionmenu \
defineinteractionmenu definelabel definelist definelogo definemakeup definemarking \
defineoutput defineoverlay definepalet definepapersize defineparagraphs defineprofile \
defineprogram definereference definereferenceformat definereferencelist defineregister definesection \
definesectionblock definesorting definestartstop definesubfield definesymbol definesynonyms \
-definetabletemplate definetabulate definetext definetype definetyping defineversion \
-description determineheadnumber determinelistcharacteristics disableinteractionmenu emptylines enumeration \
-externalfigure field fieldstack fillinfield fillinline fillinrules \
-fillintext fitfield fixedspaces followprofile followprofileversion followversion \
-footnote footnotetext forceblocks fraction framed framedtext \
-from getbuffer getmarking godown goto gotobox \
-graycolor grid hairline head headnumber headtext \
-hideblocks high hl in indentation indenting \
-inframed ininner inleft inline inmargin inothermargin \
-inouter inright installlanguage interactionbar interactionbuttons item \
-items its keepblocks labeling labels labeltext \
-language leftaligned listsymbol loadsorts loadsynonyms logfields \
-lohi low mainlanguage mar marginrule margintext \
-marking markversion mathematics mediaeval midaligned mirror \
-month moveongrid name nextsection nocap noheaderandfooterlines \
-noindenting nolist nomarking nomoreblocks nomorefiles nop \
-nospace note notopandbottomlines nowhitespace numbers overbar \
-overbars overstrike overstrikes packed page pagereference \
-pagetype paragraph part periods placebookmarks placecombinedlist \
-placecombinedlist placefloat placefootnotes placeformula placelegend placelist \
-placelistoffloats placelistofsorts placelistofsynonyms placelocalfootnotes placelogos placeongrid \
-placeontopofeachother placereferencelist placeregister placeregister placesidebyside placesubformula \
-position processblocks processpage program publication quotation \
-quote ran ref reference referral referraldate \
-register reservefloat reset resetmarking resettextcontent rightaligned \
-romannumerals rotate scale screen section seeregister \
-selectblocks selectpaper selectversion settextcontent setupalign setuparranging \
-setupbackground setupbackgrounds setupblackrules setupblank setupblock setupbodyfont \
-setupbodyfontenvironment setupbottom setupbottomtexts setupbuffer setupbuttons setupcapitals \
-setupcaption setupcaptions setupclipping setupcolor setupcolors setupcolumns \
-setupcombinations setupcombinedlist setupcomment setupdescriptions setupenumerations setupexternalfigures \
-setupfield setupfields setupfillinlines setupfillinrules setupfloat setupfloats \
-setupfloatsplitting setupfooter setupfootertexts setupfootnotedefinition setupfootnotes setupforms \
-setupformulae setupframed setupframedtexts setuphead setupheader setupheadertexts \
-setupheadnumber setupheads setupheadtext setuphyphenmark setupindentations setupindenting \
-setupinmargin setupinteraction setupinteractionbar setupinteractionmenu setupinteractionscreen setupinterlinespace \
-setupinterlinespace setupitemgroup setupitems setuplabeltext setuplanguage setuplayout \
-setuplegend setuplinenumbering setuplines setuplinewidth setuplist setuplistalternative \
-setupmakeup setupmarginblocks setupmarginrules setupmarking setupnarrower setupnumbering \
-setupoppositeplacing setupoutput setuppagenumber setuppagenumbering setuppagetransitions setuppalet \
-setuppaper setuppapersize setupparagraphnumbering setupparagraphs setuppositioning setupprofiles \
-setupprograms setuppublications setupquote setupreferencelist setupreferencing setupregister \
-setuprotate setupscreens setupsection setupsectionblock setupsorting setupspacing \
-setupstrut setupsubpagenumber setupsymbolset setupsynchronization setupsynchronizationbar setupsynonyms \
-setupsystem setuptab setuptables setuptabulate setuptext setuptextrules \
-setuptexttexts setupthinrules setuptolerance setuptop setuptoptexts setuptype \
-setuptyping setupunderbar setupurl setupversions setupwhitespace showbodyfont \
-showbodyfontenvironment showcolor showcolorgroup showexternalfigures showfields showframe \
-showgrid showlayout showmakeup showpalet showprint showsetups \
-showstruts showsymbolset someline somewhere sort space \
-splitfloat startalignment startbackground startbuffer startbuffer startcolor \
-startcolumns startcombination startcomment startcomponent startdescription startdocument \
-startenumeration startenvironment startfact startfigure startfloattext startformula \
-startframedtext starthiding startinteractionmenu startitemgroup startlegend startline \
-startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes \
-startmakeup startmarginblock startmarginrule startnamemakeup startnarrower startopposite \
-startoverlay startoverview startpacked startparagraph startpositioning startpostponing \
-startproduct startprofile startproject startquotation startregister startsymbolset \
-startsynchronization starttable starttables starttabulate starttextrule starttyping \
-startunpacked startversion stopalignment stopbackground stopbuffer stopbuffer \
-stopcolor stopcolumns stopcombination stopcomment stopcomponent stopdescription \
-stopdocument stopenumeration stopenvironment stopfact stopfigure stopfloattext \
-stopformula stopframedtext stophiding stopinteractionmenu stopitemgroup stoplegend \
-stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment \
-stoplocalfootnotes stopmakeup stopmarginblock stopmarginrule stopnamemakeup stopnarrower \
-stopopposite stopoverlay stopoverview stoppacked stopparagraph stoppositioning \
-stoppostponing stopproduct stopprofile stopproject stopquotation stopsymbolset \
-stopsynchronization stoptable stoptables stoptabulate stoptextrule stoptyping \
-stopunpacked stopversion stretched sub subject subsection \
-subsubject subsubsection subsubsubject switchtobodyfont sym symbol \
-synchronizationbar synchronize synonym tab tex textreference \
-textrule thinrule thinrules title tooltip translate \
-typ type typebuffer typefile underbar underbars \
-useURL useblocks usecommands usedirectory useencoding useexternaldocument \
-useexternalfigure useexternalfile useexternalfiles useexternalsoundtrack usemodule usereferences \
-usespecials usesymbols version vl weekday whitespace \
+definetabletemplate definetabulate definetext definetype definetypeface definetyping \
+defineversion description determineheadnumber determinelistcharacteristics disableinteractionmenu emptylines \
+enumeration externalfigure field fieldstack fillinfield fillinline \
+fillinrules fillintext fitfield fixedspaces followprofile followprofileversion \
+followversion footnote footnotetext forceblocks fraction framed \
+framedtext from getbuffer getmarking godown goto \
+gotobox graycolor grid hairline head headnumber \
+headtext hideblocks high hl in indentation \
+indenting inframed ininner inleft inline inmargin \
+inothermargin inouter inright installlanguage interactionbar interactionbuttons \
+item items its keepblocks labeling labels \
+labeltext language leftaligned listsymbol loadsorts loadsynonyms \
+logfields lohi low mainlanguage mapfontsize mar \
+marginrule margintext marking markversion mathematics mediaeval \
+midaligned mirror month moveongrid name nextsection \
+nocap noheaderandfooterlines noindenting nolist nomarking nomoreblocks \
+nomorefiles nop nospace note notopandbottomlines nowhitespace \
+numbers overbar overbars overstrike overstrikes packed \
+page pagereference pagetype paragraph part periods \
+placebookmarks placecombinedlist placecombinedlist placefloat placefootnotes placeformula \
+placelegend placelist placelistoffloats placelistofsorts placelistofsynonyms placelocalfootnotes \
+placelogos placeongrid placeontopofeachother placereferencelist placeregister placeregister \
+placesidebyside placesubformula position processblocks processpage program \
+publication quotation quote ran ref reference \
+referral referraldate register reservefloat reset resetmarking \
+resettextcontent rightaligned romannumerals rotate scale screen \
+section seeregister selectblocks selectpaper selectversion settextcontent \
+setupalign setuparranging setupbackground setupbackgrounds setupblackrules setupblank \
+setupblock setupbodyfont setupbodyfontenvironment setupbottom setupbottomtexts setupbuffer \
+setupbuttons setupcapitals setupcaption setupcaptions setupclipping setupcolor \
+setupcolors setupcolumns setupcombinations setupcombinedlist setupcomment setupdescriptions \
+setupenumerations setupexternalfigures setupfield setupfields setupfillinlines setupfillinrules \
+setupfloat setupfloats setupfloatsplitting setupfonthandling setupfontsynonym setupfooter \
+setupfootertexts setupfootnotedefinition setupfootnotes setupforms setupformulae setupframed \
+setupframedtexts setuphead setupheader setupheadertexts setupheadnumber setupheads \
+setupheadtext setuphyphenmark setupindentations setupindenting setupinmargin setupinteraction \
+setupinteractionbar setupinteractionmenu setupinteractionscreen setupinterlinespace setupinterlinespace2 setupitemgroup \
+setupitems setuplabeltext setuplanguage setuplayout setuplegend setuplinenumbering \
+setuplines setuplinewidth setuplist setuplistalternative setupmakeup setupmarginblocks \
+setupmarginrules setupmarking setupnarrower setupnumbering setupoppositeplacing setupoutput \
+setuppagenumber setuppagenumbering setuppagetransitions setuppalet setuppaper setuppapersize \
+setupparagraphnumbering setupparagraphs setuppositioning setupprofiles setupprograms setuppublications \
+setupquote setupreferencelist setupreferencing setupregister setuprotate setupscreens \
+setupsection setupsectionblock setupsorting setupspacing setupstrut setupsubpagenumber \
+setupsymbolset setupsynchronization setupsynchronizationbar setupsynonyms setupsystem setuptab \
+setuptables setuptabulate setuptext setuptextrules setuptexttexts setupthinrules \
+setuptolerance setuptop setuptoptexts setuptype setuptyping setupunderbar \
+setupurl setupversions setupwhitespace showbodyfont showbodyfontenvironment showcolor \
+showcolorgroup showexternalfigures showfields showframe showgrid showlayout \
+showmakeup showpalet showprint showsetups showstruts showsymbolset \
+someline somewhere sort space splitfloat startalignment \
+startbackground startbuffer startbuffer startcolor startcolumns startcombination \
+startcomment startcomponent startdescription startdocument startenumeration startenvironment \
+startfact startfigure startfloattext startformula startframedtext starthiding \
+startinteractionmenu startitemgroup startlegend startline startlinecorrection startlinenumbering \
+startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock \
+startmarginrule startnamemakeup startnarrower startopposite startoverlay startoverview \
+startpacked startparagraph startpositioning startpostponing startproduct startprofile \
+startproject startquotation startregister startsymbolset startsynchronization starttable \
+starttables starttabulate starttextrule starttyping startunpacked startversion \
+stopalignment stopbackground stopbuffer stopbuffer stopcolor stopcolumns \
+stopcombination stopcomment stopcomponent stopdescription stopdocument stopenumeration \
+stopenvironment stopfact stopfigure stopfloattext stopformula stopframedtext \
+stophiding stopinteractionmenu stopitemgroup stoplegend stopline stoplinecorrection \
+stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup \
+stopmarginblock stopmarginrule stopnamemakeup stopnarrower stopopposite stopoverlay \
+stopoverview stoppacked stopparagraph stoppositioning stoppostponing stopproduct \
+stopprofile stopproject stopquotation stopsymbolset stopsynchronization stoptable \
+stoptables stoptabulate stoptextrule stoptyping stopunpacked stopversion \
+stretched sub subject subsection subsubject subsubsection \
+subsubsubject switchtobodyfont sym symbol synchronizationbar synchronize \
+synonym tab tex textreference textrule thinrule \
+thinrules title tooltip translate typ type \
+typebuffer typefile underbar underbars useURL useblocks \
+usecommands usedirectory useencoding useexternaldocument useexternalfigure useexternalfile \
+useexternalfiles useexternalsoundtrack usemodule usereferences usespecials usesymbols \
+usetypescript usetypescriptfile version vl weekday whitespace \
wordright writebetweenlist writetolist writetoreferencelist writetoregister
\ No newline at end of file
diff --git a/context/data/cont-fr-scite.properties b/context/data/cont-fr-scite.properties
index a7c27d95d..caa7069db 100644
--- a/context/data/cont-fr-scite.properties
+++ b/context/data/cont-fr-scite.properties
@@ -11,85 +11,87 @@ completelistofsorts completelistofsynonyms completeregistre composeenalinea conc
copitchamp corrigeespaceblanc couleur couleurgrise coupledocument coupledregister \
couplemarquage couplepapier coupleregistre crlf dactylographier dans \
dansautremarge dansdroite dansgauche dansmarge date datecourante \
-daterecommandation de decouplemarquage defineframed defineframedtext definit \
+daterecommandation de decouplemarquage definebodyfontDEF definebodyfontREF definedfont \
+definefontfeature definefonthandling defineframed defineframedtext definetypeface definit \
definitbloc definitblocsection definitbuffer definitchamp definitcompoalinea definitconversion \
definitcouleur definitdactylo definitdemarrestoppe definitdescription definitenumeration definitenvironnementpolicecorps \
definitetiquette definitflottant definitformatreference definitgroupecouleur definitliste definitlisteimbriquee \
definitlistereference definitlogo definitmakeup definitmarquage definitmenuinteraction definitmenuinteraction \
definitnotepdp definitpalette definitparagraphes definitpilechamp definitpolice definitpolicecorps \
definitprofil definitprogramme definitreference definitregistre definitrevetement definitsection \
-definitsortie definitsouschamp definitsymbole definitsymbolefigure definitsynonymes definittabulation \
-definittaillepapier definittete definittexte definittrametableau definittri definittype \
-definitversion definitvide definitvide demarreciter deplacesurgrille description \
-determinecaracteristiqueliste determinenumerotete echelle ecran ecritdansliste ecritdanslistereference \
-ecritentreliste ecritregistre el element elements emptylines \
-enumeration espace espaceblanc espacesfixes etiquettes etire \
-fichierdactylo figureexterne forceblocs fraction framed framedtext \
-gardeblocs grille groupe haut hl indentation \
-inframed inhibemenuinteraction ininner inouter installelangue joursemaine \
-labeling labeltexte langue langueprincipale ligneh lignenoire \
-ligneregleetexte lignesnoires listesymbole loadsorts loadsynonyms logchamp \
-mar margereglee marquage marquageversion marquepage mathematique \
-mediaeval mois montrecadre montrechamps montrecouleur montredisposition \
-montreedition montreenvironnementpolicecorps montrefiguresexternes montregrille montregroupecouleur montrejeusymboles \
-montremakeup montrepalette montrepolicecorps montrereglages montrestruts motdroit \
-name nextsection nocap nop note notepdp \
-numeros numerotete numerotetecourant obtientmarquage oriente overbar \
-overbars page pagedouble paragraph part pasplusdeblocs \
-pasplusdefichiers periodes pilechamp placecoteacote placeflottant placeformule \
-placelegende placelesunsaudessusdesautres placeliste placelisteinmbriquee placelisteinmbriquee placelistereference \
-placelistoffloats placelistofsorts placelistofsynonyms placelogos placemarquespages placenotespdp \
-placenotespdplocales placeregistre placeregistre placesousformule placesurgrille position \
-prendbuffer programme publication qqpart ran raz \
-razmarquage recommandation ref reference referencepage referencetexte \
-reflete register reglealignement reglealineas reglearrangement reglearriereplan \
-reglearriereplans reglebarreinteraction reglebarresynchronisation reglebloc regleblocmarge regleblocsection \
-regleboutons reglebuffer reglecapitales reglechamp reglechamps regleclipping \
-reglecolonnes reglecombinaisons reglecommentaire reglecompoetroite reglecomposeenalinea reglecouleur \
-reglecouleurs regledactylo regledansmarge regledescriptions regledisposition regleecraninteraction \
-regleecrans regleelements regleencadre regleentete regleenumerations regleenvironnementpolicecorps \
-regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne regleespacementinterligne reglefiguresexternes \
-regleflottant regleflottants regleformulaires regleformules regleinf regleinteraction \
-regleintitule regleintitules reglejeusymboles reglelabeltexte reglelangue reglelegende \
-reglelignes reglelignesnoires reglelignesreglestexte regleliste reglelisteimbriquee reglelistereference \
-reglemakeup reglemargereglee reglemarquage reglemarquagehyphenation reglemenuinteraction reglenotepdp \
-reglenumeropage reglenumerotation reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe reglenumerotete \
-regleoriente reglepalette reglepapier regleparagraphes reglepdp regleplacementopposition \
-reglepolicecorps reglepositionnement regleprofils regleprogrammes reglepublications reglereferencage \
-regleregistre regleremplitligne regleremplitlignesreglees reglesection regleseparationflottant reglesortie \
-reglesouslignage reglesousnumeropage reglestrut reglesup reglesynchronisation reglesynonymes \
-reglesysteme regletab regletableaux regletabulation regletaillepapier regletete \
-regletetes regletexte regletextesentete regletextesinf regletextespdp regletextessup \
-regletextestexte regletextetete regletolerance regletraitsfins regletransitionspage regletri \
-regletype regleurl regleversions remplitchamp remplitligne remplitlignesreglees \
-remplittexte reservefloat resettextcontent sansalinea sansespace sansespaceblanc \
-sanslignesenteteetpdp sanslignessupetinf sansliste sansmarquage sauteblocs section \
-seeregister selectionneblocs selectionnepapier selectionneversion separeflottant settext \
-setupframedtexts setupitemgroup setuplistalternative sort sousligne souslignetout \
-startalignment startarriereplan startbuffer startbuffer startcitation startcolumns \
-startcombination startcommentaire startcomposant startcouleur startdescription startdocument \
-startenumeration startenvironement startfait startfigure startfloattext startformula \
-startframedtext startgroupe starthiding startitemgroup startlegend startligneregleetexte \
-startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment \
-startlocalfootnotes startmakeup startmargereglee startmarginblock startmenuinteraction startnamemakeup \
-startnarrower startopposite startoverlay startoverview startparagraph startpositioning \
-startpostponing startproduit startprofile startprojet startregister startsymbolset \
-startsynchronization starttable starttables starttabulate starttyping startunpacked \
-startversion stopalignment stoparriereplan stopbuffer stopbuffer stopcitation \
-stopcolumns stopcombination stopcommentaire stopcomposant stopcouleur stopdescription \
-stopdocument stopenumeration stopenvironement stopfait stopfigure stopfloattext \
-stopformula stopframedtext stopgroupe stophiding stopitemgroup stoplegend \
-stopligneregleetexte stopline stoplinecorrection stoplinenumbering stoplines stoplocal \
-stoplocalenvironment stoplocalfootnotes stopmakeup stopmargereglee stopmarginblock stopmenuinteraction \
-stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph \
-stoppositioning stoppostponing stopproduit stopprofile stopprojet stopsymbolset \
-stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked \
-stopversion sub subject subsection subsubject subsubsection \
-subsubsubject suggestion suivantprofil suivantversion suivantversionprofil surligne \
-surlignetout sym symbole synchronise synonym tab \
-tapebuffer tapepage tete tex textemarge textenotepdp \
-textetete title traduire traiteblocs traitepage traitfin \
-traitsfins typ uneligne usedirectory utiliseURL utiliseblocs \
+definitsortie definitsouschamp definitsymbole definitsymbolefigure definitsynonymepolice definitsynonymes \
+definittabulation definittaillepapier definittete definittexte definittrametableau definittri \
+definittype definitversion definitvide definitvide demarreciter deplacesurgrille \
+description determinecaracteristiqueliste determinenumerotete echelle ecran ecritdansliste \
+ecritdanslistereference ecritentreliste ecritregistre el element elements \
+emptylines enumeration espace espaceblanc espacesfixes etiquettes \
+etire fichierdactylo figureexterne forceblocs fraction framed \
+framedtext gardeblocs grille groupe haut hl \
+indentation inframed inhibemenuinteraction ininner inouter installelangue \
+joursemaine labeling labeltexte langue langueprincipale ligneh \
+lignenoire ligneregleetexte lignesnoires listesymbole loadsorts loadsynonyms \
+logchamp mapfontsize mar margereglee marquage marquageversion \
+marquepage mathematique mediaeval mois montrecadre montrechamps \
+montrecouleur montredisposition montreedition montreenvironnementpolicecorps montrefiguresexternes montregrille \
+montregroupecouleur montrejeusymboles montremakeup montrepalette montrepolicecorps montrereglages \
+montrestruts motdroit name nextsection nocap nop \
+note notepdp numeros numerotete numerotetecourant obtientmarquage \
+oriente overbar overbars page pagedouble paragraph \
+part pasplusdeblocs pasplusdefichiers periodes pilechamp placecoteacote \
+placeflottant placeformule placelegende placelesunsaudessusdesautres placeliste placelisteinmbriquee \
+placelisteinmbriquee placelistereference placelistoffloats placelistofsorts placelistofsynonyms placelogos \
+placemarquespages placenotespdp placenotespdplocales placeregistre placeregistre placesousformule \
+placesurgrille position prendbuffer programme publication qqpart \
+ran raz razmarquage recommandation ref reference \
+referencepage referencetexte reflete register reglealignement reglealineas \
+reglearrangement reglearriereplan reglearriereplans reglebarreinteraction reglebarresynchronisation reglebloc \
+regleblocmarge regleblocsection regleboutons reglebuffer reglecapitales reglechamp \
+reglechamps regleclipping reglecolonnes reglecombinaisons reglecommentaire reglecompoetroite \
+reglecomposeenalinea reglecouleur reglecouleurs regledactylo regledansmarge regledescriptions \
+regledisposition regleecraninteraction regleecrans regleelements regleencadre regleentete \
+regleenumerations regleenvironnementpolicecorps regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne \
+reglefiguresexternes regleflottant regleflottants regleformulaires regleformules regleinf \
+regleinteraction regleintitule regleintitules reglejeusymboles reglelabeltexte reglelangue \
+reglelegende reglelignes reglelignesnoires reglelignesreglestexte regleliste reglelisteimbriquee \
+reglelistereference reglemakeup reglemargereglee reglemarquage reglemarquagehyphenation reglemenuinteraction \
+reglenotepdp reglenumeropage reglenumerotation reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe \
+reglenumerotete regleoriente reglepalette reglepapier regleparagraphes reglepdp \
+regleplacementopposition reglepolicecorps reglepositionnement regleprofils regleprogrammes reglepublications \
+reglereferencage regleregistre regleremplitligne regleremplitlignesreglees reglesection regleseparationflottant \
+reglesortie reglesouslignage reglesousnumeropage reglestrut reglesup reglesynchronisation \
+reglesynonymes reglesysteme regletab regletableaux regletabulation regletaillepapier \
+regletete regletetes regletexte regletextesentete regletextesinf regletextespdp \
+regletextessup regletextestexte regletextetete regletolerance regletraitsfins regletransitionspage \
+regletri regletype regleurl regleversions remplitchamp remplitligne \
+remplitlignesreglees remplittexte reservefloat resettextcontent sansalinea sansespace \
+sansespaceblanc sanslignesenteteetpdp sanslignessupetinf sansliste sansmarquage sauteblocs \
+section seeregister selectionneblocs selectionnepapier selectionneversion separeflottant \
+settext setupfonthandling setupfontsynonym setupframedtexts setupinterlinespace2 setupitemgroup \
+setuplistalternative sort sousligne souslignetout startalignment startarriereplan \
+startbuffer startbuffer startcitation startcolumns startcombination startcommentaire \
+startcomposant startcouleur startdescription startdocument startenumeration startenvironement \
+startfait startfigure startfloattext startformula startframedtext startgroupe \
+starthiding startitemgroup startlegend startligneregleetexte startline startlinecorrection \
+startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup \
+startmargereglee startmarginblock startmenuinteraction startnamemakeup startnarrower startopposite \
+startoverlay startoverview startparagraph startpositioning startpostponing startproduit \
+startprofile startprojet startregister startsymbolset startsynchronization starttable \
+starttables starttabulate starttyping startunpacked startversion stopalignment \
+stoparriereplan stopbuffer stopbuffer stopcitation stopcolumns stopcombination \
+stopcommentaire stopcomposant stopcouleur stopdescription stopdocument stopenumeration \
+stopenvironement stopfait stopfigure stopfloattext stopformula stopframedtext \
+stopgroupe stophiding stopitemgroup stoplegend stopligneregleetexte stopline \
+stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes \
+stopmakeup stopmargereglee stopmarginblock stopmenuinteraction stopnamemakeup stopnarrower \
+stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing \
+stopproduit stopprofile stopprojet stopsymbolset stopsynchronization stoptable \
+stoptables stoptabulate stoptyping stopunpacked stopversion sub \
+subject subsection subsubject subsubsection subsubsubject suggestion \
+suivantprofil suivantversion suivantversionprofil surligne surlignetout sym \
+symbole synchronise synonym tab tapebuffer tapepage \
+tete tex textemarge textenotepdp textetete title \
+traduire traiteblocs traitepage traitfin traitsfins typ \
+uneligne usedirectory usetypescript usetypescriptfile utiliseURL utiliseblocs \
utilisecommandes utilisedocumentexterne utiliseencodage utilisefichierexterne utilisefichiersexternes utilisefigureexterne \
utilisemodule utilisepsiteaudioexterne utilisereferences utilisespecialites utilisesymboles va \
vaalaboite vaenbas version vide vl
\ No newline at end of file
diff --git a/context/data/cont-it-scite.properties b/context/data/cont-it-scite.properties
index c8c5cb796..0a6a31425 100644
--- a/context/data/cont-it-scite.properties
+++ b/context/data/cont-it-scite.properties
@@ -9,25 +9,26 @@ chim circondato citazione clip clonacampo colonna \
colore coloregrigio commento completecombinedlist completelistoffloats completelistofsorts \
completelistofsynonyms completeregister confrontagruppocolori confrontatavolozza convertinumero copiacampo \
correggispaziobianco coupledregister crlf da daqualcheparte data \
-datadioggi datareferral definisci definisciambientefontdeltesto definisciblocco definiscibloccosezione \
+datadioggi datareferral definebodyfontDEF definebodyfontREF definedfont definefontfeature \
+definefonthandling definetypeface definisci definisciambientefontdeltesto definisciblocco definiscibloccosezione \
definiscibuffer definiscicampo definiscicapoversi definiscicolore definisciconversione definiscidescrizione \
definiscidimensionicarta definiscielenco definiscielencocombinato definiscienumerazione definiscietichetta definiscifigurasimbolo \
definiscifont definiscifontdeltesto definisciformatoriferimento definiscigruppocolori definisciincorniciato definisciiniziatermina \
definiscilistariferimenti definiscilogo definiscimakeup definiscimarcatura definiscimenuinterazione definiscimenuinterazione \
definiscimodellotabella definiscioggettomobile definisciordinamento definiscioutput definisciprofilo definisciprogramma \
definisciregistro definiscirientro definisciriferimento definiscirigovuoto definiscisezione definiscisimbolo \
-definiscisinonimi definiscisottocampo definiscisovrapposizione definiscistackcampi definiscitabulato definiscitavolozza \
-definiscitesta definiscitesto definiscitestoincorniciato definiscitype definiscityping definisciversion \
-description determinacarattersticheelenco determinanumerotesta disabilitamenuinterazione el elaborablocchi \
-elaborapagina elementi elemento emptylines enumeration etichette \
-figuraesterna fondo forzablocchi framedtext frazione giornosettimana \
-griglia hl impaccato impostaallineamento impostaambientefontdeltesto impostaampiezzariga \
-impostabarrainterazione impostabarrasincronizzazione impostablocchimargine impostablocco impostabloccosezione impostabuffer \
-impostacampi impostacampo impostacapoversi impostacaption impostacaptions impostacima \
-impostaclippling impostacolonne impostacolore impostacolori impostacombinazioni impostacommento \
-impostadefinizionenotepdp impostadescrizioni impostadimensionicarta impostaelementi impostaelenco impostaelencocombinato \
-impostaenumerazioni impostafigureesterne impostafondo impostafontdeltesto impostaforms impostaformule \
-impostaincorniciato impostainmargine impostainstestazione impostainterazione impostainterlinea impostainterlinea \
+definiscisinonimi definiscisinonimofont definiscisottocampo definiscisovrapposizione definiscistackcampi definiscitabulato \
+definiscitavolozza definiscitesta definiscitesto definiscitestoincorniciato definiscitype definiscityping \
+definisciversion description determinacarattersticheelenco determinanumerotesta disabilitamenuinterazione el \
+elaborablocchi elaborapagina elementi elemento emptylines enumeration \
+etichette figuraesterna fondo forzablocchi framedtext frazione \
+giornosettimana griglia hl impaccato impostaallineamento impostaambientefontdeltesto \
+impostaampiezzariga impostabarrainterazione impostabarrasincronizzazione impostablocchimargine impostablocco impostabloccosezione \
+impostabuffer impostacampi impostacampo impostacapoversi impostacaption impostacaptions \
+impostacima impostaclippling impostacolonne impostacolore impostacolori impostacombinazioni \
+impostacommento impostadefinizionenotepdp impostadescrizioni impostadimensionicarta impostaelementi impostaelenco \
+impostaelencocombinato impostaenumerazioni impostafigureesterne impostafondo impostafontdeltesto impostaforms \
+impostaformule impostaincorniciato impostainmargine impostainstestazione impostainterazione impostainterlinea \
impostalayout impostalegenda impostalineemargine impostalineenere impostalineeriempimento impostalineesottili \
impostalineetesto impostalingua impostalistariferimenti impostamaiuscole impostamakeup impostamarcatura \
impostamenuinterazione impostamenzione impostanotepdp impostanumerazione impostanumerazionecapoversi impostanumerazionepagina \
@@ -45,51 +46,52 @@ impostaversioni in inaltromargine incorniciato indentation indestra \
ininner inmargine inouter inriga insinistra installalingua \
intorno labeling lettera lettere lineamargine lineanera \
lineasottile lineatesto lineenere lineeriempimento lineesottili lingua \
-linguaprincipale listsymbol loadsorts loadsynonyms logcampi mar \
-marcatura marcaversione matematica mediaeval menzione mese \
-mettielenco mettielencocombinato mettielencocombinato mettifiancoafianco mettiformula mettiingriglia \
-mettilegenda mettiloghi mettinotepdp mettinotepdplocali mettiregistro mettiregistro \
-mettisegnalibro mettisottoformula mettiunosullaltro mostraambientefontdeltesto mostracampi mostracolore \
-mostracornice mostrafiguresterne mostrafontdeltesto mostragriglia mostragruppocolori mostraimpostazioni \
-mostralyout mostramakeup mostrasetsimboli mostrastampa mostrastruts mostratavolozza \
-name nascondiblocchi nextsection nienteelenco nientelineecimafondo nientelineintestazionepdp \
-nientemarcatura nienterientro nientespazio nientespaziobianco nocap nop \
-nota notapdp numeri numeriromani numerotesta numerotestacorrente \
-pagina paragraph paroladestra part ped pedap \
-placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist posizione \
-prendibuffer prendimarcatura programma pubblicazione pulsante pulsantinterazione \
-punti qualcheriga ran referral register reimposta \
-reimpostamarcatura reservefloat resettextcontent rientro rif riferimento \
-riferimentopagina riferimentotesto riflessione rigariempimento rigovuoto ruota \
-saltablocchi sbarrati sbarrato scala schermo scrividentroelenco \
-scriviinelenco scriviinlistariferimenti scriviinregistro section seeregister segnalibro \
-seguiprofilo seguiversione seguiversioneprofilo selezionablocchi selezionacarta selezionaversione \
-separamarcatura settext setupitemgroup setuplistalternative setuppaper sfondo \
-sim simbolo sincronizza sopralinea sopralinee sort \
-sottolinea sottolinee spazifissi spazio spaziobianco spezzaoggettomobile \
-spostaagriglia stackcampi startalignment startambiente startbuffer startbuffer \
-startcitazione startcolore startcolumns startcombination startcommento startcomponenet \
-startdescription startdocument startenumeration startfatto startfigure startfloattext \
-startformula startframedtext starthiding startimpaccato startitemgroup startlegend \
-startline startlineamargine startlineatesto startlinecorrection startlinenumbering startlines \
-startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmenuinterattivo \
-startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph \
-startpositioning startpostponing startprodotto startprofile startprogetto startregister \
-startsfondo startsymbolset startsynchronization starttable starttables starttabulate \
-starttyping startunpacked startversione stirato stopalignment stopambiente \
-stopbuffer stopbuffer stopcitazione stopcolore stopcolumns stopcombination \
-stopcommento stopcomponenet stopdescription stopdocument stopenumeration stopfatto \
-stopfigure stopfloattext stopformula stopframedtext stophiding stopimpaccato \
-stopitemgroup stoplegend stopline stoplineamargine stoplineatesto stoplinecorrection \
-stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup \
-stopmarginblock stopmenuinterattivo stopnamemakeup stopnarrower stopopposite stopoverlay \
-stopoverview stopparagraph stoppositioning stoppostponing stopprodotto stopprofile \
-stopprogetto stopsfondo stopsymbolset stopsynchronization stoptable stoptables \
-stoptabulate stoptyping stopunpacked stopversione sub subject \
-subsection subsubject subsubsection subsubsubject synonym tab \
-testa testoetichetta testoinmargine testoinstestazioni testonotapdp testoriempimento \
-tex tieniblocchi tipopagina title tooltip traduci \
-typ type typebuffer typefile usaURL usablocco \
-usacodifica usacolonnasonoraesterna usacomandi usadocumentoesterno usafiguraesterna usafileesterni \
-usafileesterno usamodulo usariferimenti usasimboli usaspecialita usedirectory \
+linguaprincipale listsymbol loadsorts loadsynonyms logcampi mapfontsize \
+mar marcatura marcaversione matematica mediaeval menzione \
+mese mettielenco mettielencocombinato mettielencocombinato mettifiancoafianco mettiformula \
+mettiingriglia mettilegenda mettiloghi mettinotepdp mettinotepdplocali mettiregistro \
+mettiregistro mettisegnalibro mettisottoformula mettiunosullaltro mostraambientefontdeltesto mostracampi \
+mostracolore mostracornice mostrafiguresterne mostrafontdeltesto mostragriglia mostragruppocolori \
+mostraimpostazioni mostralyout mostramakeup mostrasetsimboli mostrastampa mostrastruts \
+mostratavolozza name nascondiblocchi nextsection nienteelenco nientelineecimafondo \
+nientelineintestazionepdp nientemarcatura nienterientro nientespazio nientespaziobianco nocap \
+nop nota notapdp numeri numeriromani numerotesta \
+numerotestacorrente pagina paragraph paroladestra part ped \
+pedap placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist \
+posizione prendibuffer prendimarcatura programma pubblicazione pulsante \
+pulsantinterazione punti qualcheriga ran referral register \
+reimposta reimpostamarcatura reservefloat resettextcontent rientro rif \
+riferimento riferimentopagina riferimentotesto riflessione rigariempimento rigovuoto \
+ruota saltablocchi sbarrati sbarrato scala schermo \
+scrividentroelenco scriviinelenco scriviinlistariferimenti scriviinregistro section seeregister \
+segnalibro seguiprofilo seguiversione seguiversioneprofilo selezionablocchi selezionacarta \
+selezionaversione separamarcatura settext setupfonthandling setupfontsynonym setupinterlinespace2 \
+setupitemgroup setuplistalternative setuppaper sfondo sim simbolo \
+sincronizza sopralinea sopralinee sort sottolinea sottolinee \
+spazifissi spazio spaziobianco spezzaoggettomobile spostaagriglia stackcampi \
+startalignment startambiente startbuffer startbuffer startcitazione startcolore \
+startcolumns startcombination startcommento startcomponenet startdescription startdocument \
+startenumeration startfatto startfigure startfloattext startformula startframedtext \
+starthiding startimpaccato startitemgroup startlegend startline startlineamargine \
+startlineatesto startlinecorrection startlinenumbering startlines startlocal startlocalenvironment \
+startlocalfootnotes startmakeup startmarginblock startmenuinterattivo startnamemakeup startnarrower \
+startopposite startoverlay startoverview startparagraph startpositioning startpostponing \
+startprodotto startprofile startprogetto startregister startsfondo startsymbolset \
+startsynchronization starttable starttables starttabulate starttyping startunpacked \
+startversione stirato stopalignment stopambiente stopbuffer stopbuffer \
+stopcitazione stopcolore stopcolumns stopcombination stopcommento stopcomponenet \
+stopdescription stopdocument stopenumeration stopfatto stopfigure stopfloattext \
+stopformula stopframedtext stophiding stopimpaccato stopitemgroup stoplegend \
+stopline stoplineamargine stoplineatesto stoplinecorrection stoplinenumbering stoplines \
+stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmenuinterattivo \
+stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph \
+stoppositioning stoppostponing stopprodotto stopprofile stopprogetto stopsfondo \
+stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping \
+stopunpacked stopversione sub subject subsection subsubject \
+subsubsection subsubsubject synonym tab testa testoetichetta \
+testoinmargine testoinstestazioni testonotapdp testoriempimento tex tieniblocchi \
+tipopagina title tooltip traduci typ type \
+typebuffer typefile usaURL usablocco usacodifica usacolonnasonoraesterna \
+usacomandi usadocumentoesterno usafiguraesterna usafileesterni usafileesterno usamodulo \
+usariferimenti usasimboli usaspecialita usedirectory usetypescript usetypescriptfile \
vaia vaiabox vaigiu versione vl
\ No newline at end of file
diff --git a/context/data/cont-nl-scite.properties b/context/data/cont-nl-scite.properties
index 5b278b2a1..e3254a5b4 100644
--- a/context/data/cont-nl-scite.properties
+++ b/context/data/cont-nl-scite.properties
@@ -6,59 +6,61 @@ blokje blokjes blokkeerinteractiemenu bookmark breuk but \
button cap chapter chem cijfers citaat \
citeer clip commentaar completecombinedlist completelistoffloats completelistofsorts \
completelistofsynonyms converteernummer copieerveld corrigeerwitruimte coupledregister crlf \
-datum definieer definieeralineas definieerbeeldmerk definieerblanko definieerblok \
-definieerbuffer definieerconversie definieerfiguursymbool definieerfont definieerinteractiemenu definieerinteractiemenu \
-definieerkadertekst definieerkleur definieerkleurgroep definieerkop definieerkorps definieerkorpsomgeving \
-definieerlijst definieermarkering definieeromlijnd definieeropmaak definieeroverlay definieerpalet \
-definieerpapierformaat definieerplaatsblok definieerprofiel definieerprogramma definieerreferentie definieerreferentieformaat \
-definieerreferentielijst definieerregister definieersamengesteldelijst definieersectie definieersectieblok definieersorteren \
-definieerstartstop definieersubveld definieersymbool definieersynoniemen definieertabelvorm definieertabulatie \
-definieertekst definieertype definieertypen definieeruitvoer definieerveld definieerveldstapel \
-definieerversie description doordefinieren doorlabelen doornummeren doorspringen \
-doorstreep doorstrepen dunnelijn dunnelijnen eenregel enumeration \
-ergens externfiguur forceerblokken framedtext gebruikURL gebruikblokken \
-gebruikcommandos gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur gebruikexterngeluidsfragment \
-gebruikmodule gebruikreferenties gebruikspecials gebruiksymbolen geenblokkenmeer geenbovenenonderregels \
-geenfilesmeer geenhoofdenvoetregels geenlijst geenmarkering geenspatie geenwitruimte \
-grijskleur haalbuffer haalmarkering haarlijn handhaafblokken hl \
-hoofdtaal hoog huidigedatum huidigekopnummer in inanderemarge \
-inbinnen inbuiten indentation inlijnd inlinker inmarge \
-inrechter inregel inspringen installeertaal interactiebalk interactiebuttons \
-invullijnen invulregel invultekst invulveld items its \
-kantlijn kenmerk kenmerkdatum kleur kloonveld kolom \
-kop kopnummer koppeldocument koppelmarkering koppelpagina koppelpapier \
-koppelregister koptekst laag labeling labels labeltekst \
-laho legeregels letter letters lijstsymbool loadsorts \
-loadsynonyms maand mar margetekst markeer markeerversie \
-mediaeval naar naarbox name nextsection nietinspringen \
-nocap noot nop omlaag omlijnd onderstreep \
-onderstrepen ontkoppelmarkering op opelkaar oppagina overstreep \
-overstrepen pagina paginareferentie paragraph part paslayoutaan \
-passeerblokken passendveld plaatsbeeldmerken plaatsbookmarks plaatsformule plaatslegenda \
-plaatslijst plaatslokalevoetnoten plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatsplaatsblok \
-plaatsreferentielijst plaatsregister plaatsregister plaatssamengesteldelijst plaatssamengesteldelijst plaatssubformule \
-plaatsvoetnoten placelistoffloats placelistofsorts placelistofsynonyms positioneer programma \
-publicatie punten ran ref referentie regellinks \
-regelmidden regelrechts register registreervelden reservefloat reset \
-resetmarkering resettextcontent romeins rooster roteer schaal \
-scherm schrijfnaarlijst schrijfnaarreferentielijst schrijfnaarregister schrijftussenlijst section \
-seeregister selecteerblokken selecteerpapier selecteerversie setuplistalternative som \
-soortpagina sort spatie spiegel splitsplaatsblok startachtergrond \
-startalignment startbuffer startbuffer startcitaat startcolumns startcombination \
-startcommentaar startdescription startdocument startenumeration startfigure startfloattext \
-startformula startframedtext startgeg starthiding startinteractiemenu startitemgroup \
-startkantlijn startkleur startlegend startline startlinecorrection startlinenumbering \
-startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock \
-startnamemakeup startnarrower startomgeving startonderdeel startopelkaar startopposite \
-startoverlay startoverview startparagraph startpositioning startpostponing startprodukt \
-startprofile startprojekt startregister startsymbolset startsynchronization starttable \
-starttables starttabulate starttekstlijn starttyping startunpacked startversie \
-stelachtergrondenin stelachtergrondin stelalineasin stelarrangerenin stelblankoin stelblokin \
-stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin stelboventekstenin stelbufferin \
-stelbuttonsin stelciterenin stelclipin stelcombinatiesin stelcommentaarin steldoordefinierenin \
-steldoornummerenin steldoorspringenin steldunnelijnenin stelexternefigurenin stelformulesin stelformulierenin \
-stelhoofdin stelhoofdtekstenin stelinmargein stelinspringenin stelinteractiebalkin stelinteractiein \
-stelinteractiemenuin stelinteractieschermin stelinterliniein stelinterliniein stelinvullijnenin stelinvulregelsin \
+datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling \
+definetypeface definieer definieeralineas definieerbeeldmerk definieerblanko definieerblok \
+definieerbuffer definieerconversie definieerfiguursymbool definieerfont definieerfontsynoniem definieerinteractiemenu \
+definieerinteractiemenu definieerkadertekst definieerkleur definieerkleurgroep definieerkop definieerkorps \
+definieerkorpsomgeving definieerlijst definieermarkering definieeromlijnd definieeropmaak definieeroverlay \
+definieerpalet definieerpapierformaat definieerplaatsblok definieerprofiel definieerprogramma definieerreferentie \
+definieerreferentieformaat definieerreferentielijst definieerregister definieersamengesteldelijst definieersectie definieersectieblok \
+definieersorteren definieerstartstop definieersubveld definieersymbool definieersynoniemen definieertabelvorm \
+definieertabulatie definieertekst definieertype definieertypen definieeruitvoer definieerveld \
+definieerveldstapel definieerversie description doordefinieren doorlabelen doornummeren \
+doorspringen doorstreep doorstrepen dunnelijn dunnelijnen eenregel \
+enumeration ergens externfiguur forceerblokken framedtext gebruikURL \
+gebruikblokken gebruikcommandos gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur \
+gebruikexterngeluidsfragment gebruikmodule gebruikreferenties gebruikspecials gebruiksymbolen gebruiktypescript \
+gebruiktypescriptfile geenblokkenmeer geenbovenenonderregels geenfilesmeer geenhoofdenvoetregels geenlijst \
+geenmarkering geenspatie geenwitruimte grijskleur haalbuffer haalmarkering \
+haarlijn handhaafblokken hl hoofdtaal hoog huidigedatum \
+huidigekopnummer in inanderemarge inbinnen inbuiten indentation \
+inlijnd inlinker inmarge inrechter inregel inspringen \
+installeertaal interactiebalk interactiebuttons invullijnen invulregel invultekst \
+invulveld items its kantlijn kenmerk kenmerkdatum \
+kleur kloonveld kolom kop kopnummer koppeldocument \
+koppelmarkering koppelpagina koppelpapier koppelregister koptekst laag \
+labeling labels labeltekst laho legeregels letter \
+letters lijstsymbool loadsorts loadsynonyms maand mapfontsize \
+mar margetekst markeer markeerversie mediaeval naar \
+naarbox name nextsection nietinspringen nocap noot \
+nop omlaag omlijnd onderstreep onderstrepen ontkoppelmarkering \
+op opelkaar oppagina overstreep overstrepen pagina \
+paginareferentie paragraph part paslayoutaan passeerblokken passendveld \
+plaatsbeeldmerken plaatsbookmarks plaatsformule plaatslegenda plaatslijst plaatslokalevoetnoten \
+plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatsplaatsblok plaatsreferentielijst plaatsregister \
+plaatsregister plaatssamengesteldelijst plaatssamengesteldelijst plaatssubformule plaatsvoetnoten placelistoffloats \
+placelistofsorts placelistofsynonyms positioneer programma publicatie punten \
+ran ref referentie regellinks regelmidden regelrechts \
+register registreervelden reservefloat reset resetmarkering resettextcontent \
+romeins rooster roteer schaal scherm schrijfnaarlijst \
+schrijfnaarreferentielijst schrijfnaarregister schrijftussenlijst section seeregister selecteerblokken \
+selecteerpapier selecteerversie setupfonthandling setupfontsynonym setupinterlinespace2 setuplistalternative \
+som soortpagina sort spatie spiegel splitsplaatsblok \
+startachtergrond startalignment startbuffer startbuffer startcitaat startcolumns \
+startcombination startcommentaar startdescription startdocument startenumeration startfigure \
+startfloattext startformula startframedtext startgeg starthiding startinteractiemenu \
+startitemgroup startkantlijn startkleur startlegend startline startlinecorrection \
+startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup \
+startmarginblock startnamemakeup startnarrower startomgeving startonderdeel startopelkaar \
+startopposite startoverlay startoverview startparagraph startpositioning startpostponing \
+startprodukt startprofile startprojekt startregister startsymbolset startsynchronization \
+starttable starttables starttabulate starttekstlijn starttyping startunpacked \
+startversie stelachtergrondenin stelachtergrondin stelalineasin stelarrangerenin stelblankoin \
+stelblokin stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin stelboventekstenin \
+stelbufferin stelbuttonsin stelciterenin stelclipin stelcombinatiesin stelcommentaarin \
+steldoordefinierenin steldoornummerenin steldoorspringenin steldunnelijnenin stelexternefigurenin stelformulesin \
+stelformulierenin stelhoofdin stelhoofdtekstenin stelinmargein stelinspringenin stelinteractiebalkin \
+stelinteractiein stelinteractiemenuin stelinteractieschermin stelinterliniein stelinvullijnenin stelinvulregelsin \
stelitemgroepin stelitemsin stelkadertekstenin stelkantlijnin stelkapitalenin stelkleurenin \
stelkleurin stelkolommenin stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin \
stelkoptekstin stelkorpsin stelkorpsomgevingin stellabeltekstin stellayoutin stellegendain \
diff --git a/context/data/cont-ro-scite.properties b/context/data/cont-ro-scite.properties
index 3691933a5..da9af1b3a 100644
--- a/context/data/cont-ro-scite.properties
+++ b/context/data/cont-ro-scite.properties
@@ -11,85 +11,87 @@ citat clip cloneazacamp coloana comentariu comparagrupculoare \
comparapaleta completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister \
convertestenumar copiazacamp corecteazaspatiualb coupledregister crlf culoare \
culoaregri cupleazadocument cupleazamarcaje cupleazaregistru cuvantdreapta data \
-datacurenta datareferit decupleazamarcaje defineste definestealiat definesteantet \
-definesteblanc definestebloc definesteblocsectiune definestebuffer definestecamp definesteconversie \
-definesteculoare definestedescriere definestedimensiunehartie definesteenumerare definesteeticheta definestefloat \
-definestefont definestefonttext definesteformatreferinte definestegrupculori definesteinconjurare definestelista \
-definestelistacombinata definestelistareferinte definestelogo definestemakeup definestemarcaje definestemediulfonttext \
-definestemeniuinteractiune definestemeniuinteractiune definesteoutput definesteoverlay definestepaleta definesteparagraf \
-definesteprofil definesteprogram definestereferinte definesteregistru definestesablontabel definestesectiune \
-definestesimbol definestesimbolfigura definestesinonim definestesortare definestestartstop definestestivacampuri \
+datacurenta datareferit decupleazamarcaje definebodyfontDEF definebodyfontREF definedfont \
+definefontfeature definefonthandling defineste definestealiat definesteantet definesteblanc \
+definestebloc definesteblocsectiune definestebuffer definestecamp definesteconversie definesteculoare \
+definestedescriere definestedimensiunehartie definesteenumerare definesteeticheta definestefloat definestefont \
+definestefonttext definesteformatreferinte definestegrupculori definesteinconjurare definestelista definestelistacombinata \
+definestelistareferinte definestelogo definestemakeup definestemarcaje definestemediulfonttext definestemeniuinteractiune \
+definestemeniuinteractiune definesteoutput definesteoverlay definestepaleta definesteparagraf definesteprofil \
+definesteprogram definestereferinte definesteregistru definestesablontabel definestesectiune definestesimbol \
+definestesimbolfigura definestesinonim definestesinonimfont definestesortare definestestartstop definestestivacampuri \
definestesubcamp definestetabulatori definestetext definestetexteinconjurate definestetextinconjurat definestetyping \
-definesteversiune definetype description despre determinacaracteristicilelistei determinanumartitlu \
-dezactiveazameniuinteractiune din dute dutebox ecran el \
-element element emptylines enumeration etichete faraaliniat \
-farafisiere faraliniiantetsisubsol faraliniisussijos faralista faramarcaje faraspatiu \
-faraspatiualb figuraexterna firdepar folosesteURL folosestebloc folosestecodificarea \
-folosestecomenzi folosestedocumentextern folosestefiguraexterna folosestefisiereexterne folosestefisierextern folosestemodul \
-folosestemuzicaexterna folosestereferinte folosestesimboluri folosestespeciale footnotetext forteazablocuri \
-fractie framed framedtext fundal gatablocuri grid \
-hartiedubla hl impachetat impartefloat in inalt \
-inaltamargine indentation indreapta inframed ininner injos \
-inlinie inouter instalarelimba instanga intins jos \
-jossus la labeling lapagina limba limbaprincipala \
-liniemargine linieneagra liniepeste liniesubtire linieumplere liniinegre \
-liniipeste liniisubtiri listsymbol litera litere loadsorts \
-loadsynonyms logcampuri luna mar marcaje marcheazaversiune \
-marginal matematica mediaeval minicitat mutapegrid name \
-nextsection nocap nop nota notasubsol numartitlu \
-numartitlucurent numere numereromane olinie pagina paginadubla \
-paragraph part pastreazablocuri placefloat placelistoffloats placelistofsorts \
-placelistofsynonyms placereferencelist plaseazapegrid plaseazasemnecarte potrivestecamp pozitie \
-proceseazabloc proceseazapagina program publicatie puncte punedeasuprafiecareia \
-punefatainfata puneformula punelegenda punelista punelistacombinata punelistacombinata \
-punelogouri punenotesubsol punenotesubsollocale puneregistru puneregistru punesubformula \
-ran ref referinta referintapagina referintatext referit \
-reflexie register reservefloat reset reseteazamarcaje resettextcontent \
-riglatext rigleumplere roteste saripesteblocuri scala scriebuffer \
-scrieinlista scrieinlistareferinte scrieinregistru scrieintreliste section seeregister \
-selecteazablocuri selecteazahartie selecteazaversiune semncarte setarebarasincronizare setarelimba \
-setareoutput setarepozitie setaresincronizare seteazaaliniat seteazaaliniate seteazaalinierea \
-seteazaantet seteazaaranjareapag seteazaaspect seteazabarainteractiune seteazablanc seteazabloc \
-seteazablocsectiune seteazablocurimarginale seteazabuffer seteazabutoane seteazacamp seteazacampuri \
-seteazaclipping seteazacoloane seteazacombinari seteazacomentariu seteazaculoare seteazaculori \
-seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie seteazaecrane seteazaecraninteractiune seteazaelemente \
-seteazaenumerare seteazafiguriexterne seteazafloat seteazafloats seteazafonttext seteazaformulare \
-seteazaformule seteazafundal seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat \
-seteazaingust seteazainteractiunea seteazajos seteazalegenda seteazalegenda seteazalegendele \
-seteazaliniesilabe seteazaliniesubtire seteazalinii seteazaliniimargine seteazaliniinegre seteazaliniiumplere \
-seteazalista seteazalistacombinata seteazalistareferinte seteazamajuscule seteazamakeup seteazamarcaje \
-seteazamarginal seteazamediulfonttext seteazameniuinteractiune seteazaminicitat seteazanotasubsol seteazanumarpagina \
-seteazanumarsubpagina seteazanumartitlu seteazanumerotare seteazanumerotarelinii seteazanumerotarepagina seteazanumerotareparagrafe \
-seteazapaleta seteazaparagrafe seteazaplasareaopozita seteazaprofile seteazaprograme seteazapublicatii \
-seteazareferinte seteazaregistru seteazarigletext seteazarigleumplere seteazarotare seteazasectiune \
-seteazasimbol seteazasinonime seteazasistem seteazasortare seteazaspatiu seteazaspatiualb \
-seteazaspatiuinterliniar seteazaspatiuinterliniar seteazastrut seteazasublinie seteazasubsol seteazasus \
-seteazatab seteazatabele seteazatabulatori seteazatext seteazatexteantet seteazatextejos \
-seteazatextesubsol seteazatextesus seteazatextetext seteazatexteticheta seteazatexttitlu seteazatitlu \
-seteazatitluri seteazatoleranta seteazatranzitiepagina seteazatype seteazatyping seteazaurl \
-seteazaversiuni settextcontent setupitemgroup setuplistalternative setuppaper sim \
-simbol sincronizeaza sort spatiifixate spatiu spatiualb \
-startalignment startbuffer startbuffer startcitat startcolumns startcombination \
-startcomentariu startcomponenta startculoare startdescription startdocument startenumeration \
-startfact startfigure startfloattext startformula startframedtext startfundal \
-starthiding startimpachetat startitemgroup startlegend startline startlinecorrection \
-startlinenumbering startlines startliniemargine startlocal startlocalenvironment startlocalfootnotes \
-startmakeup startmarginblock startmediu startmeniuinteractiune startnamemakeup startnarrower \
-startopposite startoverlay startoverview startparagraph startpositioning startpostponing \
-startprodus startprofile startproiect startregister startriglatext startsymbolset \
-startsynchronization starttable starttables starttabulate starttyping startunpacked \
-startversiune stivacampuri stopalignment stopbuffer stopbuffer stopcitat \
-stopcolumns stopcombination stopcomentariu stopcomponenta stopculoare stopdescription \
-stopdocument stopenumeration stopfact stopfigure stopfloattext stopformula \
-stopframedtext stopfundal stophiding stopimpachetat stopitemgroup stoplegend \
-stopline stoplinecorrection stoplinenumbering stoplines stopliniemargine stoplocal \
-stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmediu stopmeniuinteractiune \
-stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph \
-stoppositioning stoppostponing stopprodus stopprofile stopproiect stopriglatext \
-stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping \
-stopunpacked stopversiune sub subject sublinie sublinii \
-subsection subsubject subsubsection subsubsubject supralinie synonym \
-tab tex texteticheta textmarginal texttitlu textumplere \
-tippagina title titlu tooltip traduce trecilafonttext \
-typ type typefile undeva urmeazaprofil urmeazaversiune \
-urmeazaversiuneprofil usedirectory versiune vl zidinsaptamana
\ No newline at end of file
+definesteversiune definetype definetypeface description despre determinacaracteristicilelistei \
+determinanumartitlu dezactiveazameniuinteractiune din dute dutebox ecran \
+el element element emptylines enumeration etichete \
+faraaliniat farafisiere faraliniiantetsisubsol faraliniisussijos faralista faramarcaje \
+faraspatiu faraspatiualb figuraexterna firdepar folosesteURL folosestebloc \
+folosestecodificarea folosestecomenzi folosestedocumentextern folosestefiguraexterna folosestefisiereexterne folosestefisierextern \
+folosestemodul folosestemuzicaexterna folosestereferinte folosestesimboluri folosestespeciale footnotetext \
+forteazablocuri fractie framed framedtext fundal gatablocuri \
+grid hartiedubla hl impachetat impartefloat in \
+inalt inaltamargine indentation indreapta inframed ininner \
+injos inlinie inouter instalarelimba instanga intins \
+jos jossus la labeling lapagina limba \
+limbaprincipala liniemargine linieneagra liniepeste liniesubtire linieumplere \
+liniinegre liniipeste liniisubtiri listsymbol litera litere \
+loadsorts loadsynonyms logcampuri luna mapfontsize mar \
+marcaje marcheazaversiune marginal matematica mediaeval minicitat \
+mutapegrid name nextsection nocap nop nota \
+notasubsol numartitlu numartitlucurent numere numereromane olinie \
+pagina paginadubla paragraph part pastreazablocuri placefloat \
+placelistoffloats placelistofsorts placelistofsynonyms placereferencelist plaseazapegrid plaseazasemnecarte \
+potrivestecamp pozitie proceseazabloc proceseazapagina program publicatie \
+puncte punedeasuprafiecareia punefatainfata puneformula punelegenda punelista \
+punelistacombinata punelistacombinata punelogouri punenotesubsol punenotesubsollocale puneregistru \
+puneregistru punesubformula ran ref referinta referintapagina \
+referintatext referit reflexie register reservefloat reset \
+reseteazamarcaje resettextcontent riglatext rigleumplere roteste saripesteblocuri \
+scala scriebuffer scrieinlista scrieinlistareferinte scrieinregistru scrieintreliste \
+section seeregister selecteazablocuri selecteazahartie selecteazaversiune semncarte \
+setarebarasincronizare setarelimba setareoutput setarepozitie setaresincronizare seteazaaliniat \
+seteazaaliniate seteazaalinierea seteazaantet seteazaaranjareapag seteazaaspect seteazabarainteractiune \
+seteazablanc seteazabloc seteazablocsectiune seteazablocurimarginale seteazabuffer seteazabutoane \
+seteazacamp seteazacampuri seteazaclipping seteazacoloane seteazacombinari seteazacomentariu \
+seteazaculoare seteazaculori seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie seteazaecrane \
+seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafiguriexterne seteazafloat seteazafloats \
+seteazafonttext seteazaformulare seteazaformule seteazafundal seteazafundaluri seteazagrosimelinie \
+seteazaimpartireafloat seteazainconjurat seteazaingust seteazainteractiunea seteazajos seteazalegenda \
+seteazalegenda seteazalegendele seteazaliniesilabe seteazaliniesubtire seteazalinii seteazaliniimargine \
+seteazaliniinegre seteazaliniiumplere seteazalista seteazalistacombinata seteazalistareferinte seteazamajuscule \
+seteazamakeup seteazamarcaje seteazamarginal seteazamediulfonttext seteazameniuinteractiune seteazaminicitat \
+seteazanotasubsol seteazanumarpagina seteazanumarsubpagina seteazanumartitlu seteazanumerotare seteazanumerotarelinii \
+seteazanumerotarepagina seteazanumerotareparagrafe seteazapaleta seteazaparagrafe seteazaplasareaopozita seteazaprofile \
+seteazaprograme seteazapublicatii seteazareferinte seteazaregistru seteazarigletext seteazarigleumplere \
+seteazarotare seteazasectiune seteazasimbol seteazasinonime seteazasistem seteazasortare \
+seteazaspatiu seteazaspatiualb seteazaspatiuinterliniar seteazastrut seteazasublinie seteazasubsol \
+seteazasus seteazatab seteazatabele seteazatabulatori seteazatext seteazatexteantet \
+seteazatextejos seteazatextesubsol seteazatextesus seteazatextetext seteazatexteticheta seteazatexttitlu \
+seteazatitlu seteazatitluri seteazatoleranta seteazatranzitiepagina seteazatype seteazatyping \
+seteazaurl seteazaversiuni settextcontent setupfonthandling setupfontsynonym setupinterlinespace2 \
+setupitemgroup setuplistalternative setuppaper sim simbol sincronizeaza \
+sort spatiifixate spatiu spatiualb startalignment startbuffer \
+startbuffer startcitat startcolumns startcombination startcomentariu startcomponenta \
+startculoare startdescription startdocument startenumeration startfact startfigure \
+startfloattext startformula startframedtext startfundal starthiding startimpachetat \
+startitemgroup startlegend startline startlinecorrection startlinenumbering startlines \
+startliniemargine startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock \
+startmediu startmeniuinteractiune startnamemakeup startnarrower startopposite startoverlay \
+startoverview startparagraph startpositioning startpostponing startprodus startprofile \
+startproiect startregister startriglatext startsymbolset startsynchronization starttable \
+starttables starttabulate starttyping startunpacked startversiune stivacampuri \
+stopalignment stopbuffer stopbuffer stopcitat stopcolumns stopcombination \
+stopcomentariu stopcomponenta stopculoare stopdescription stopdocument stopenumeration \
+stopfact stopfigure stopfloattext stopformula stopframedtext stopfundal \
+stophiding stopimpachetat stopitemgroup stoplegend stopline stoplinecorrection \
+stoplinenumbering stoplines stopliniemargine stoplocal stoplocalenvironment stoplocalfootnotes \
+stopmakeup stopmarginblock stopmediu stopmeniuinteractiune stopnamemakeup stopnarrower \
+stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing \
+stopprodus stopprofile stopproiect stopriglatext stopsymbolset stopsynchronization \
+stoptable stoptables stoptabulate stoptyping stopunpacked stopversiune \
+sub subject sublinie sublinii subsection subsubject \
+subsubsection subsubsubject supralinie synonym tab tex \
+texteticheta textmarginal texttitlu textumplere tippagina title \
+titlu tooltip traduce trecilafonttext typ type \
+typefile undeva urmeazaprofil urmeazaversiune urmeazaversiuneprofil usedirectory \
+usetypescript usetypescriptfile versiune vl zidinsaptamana
\ No newline at end of file
diff --git a/context/data/context-bbedit-cs.xml b/context/data/context-bbedit-cs.xml
index 31a5a0ca8..3b0954419 100644
--- a/context/data/context-bbedit-cs.xml
+++ b/context/data/context-bbedit-cs.xml
@@ -1 +1 @@
-BBLMKeywordList \CAP \Cap \Caps \MESIC \Rimskecislice \SLOVA \SLOVO \Slova \Slovo \VSEDNIDEN \Znak \Znaky \aktualnicislonadpisu \aktualnidatum \appendix \barva \bilemisto \bublinkovanapoveda \bypassblocks \cap \cernalinka \cernelinky \chapter \chem \cisla \cislonadpisu \citace \citovat \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \coupledregister \crlf \datum \definetype \definuj \definujbarvu \definujblok \definujbloksekce \definujbuffer \definujfont \definujformatodkazu \definujinterakcnimenu \definujinterakcnimenu \definujkombinovanyseznam \definujkonverzi \definujlogo \definujnadpis \definujobrazeksymbol \definujodkaz \definujodsazovani \definujodstavce \definujopis \definujoramovani \definujoramovanytext \definujpaletu \definujplvouciobjekt \definujpodpole \definujpole \definujpopis \definujpopisek \definujprekryv \definujpreskok \definujprofil \definujprogram \definujprostredizakladnihofontu \definujrejstrik \definujsablonutabulky \definujsekci \definujseznam \definujseznamodkazu \definujskupinubarev \definujstartstop \definujsymbol \definujsynonyma \definujtabelaci \definujtext \definujtrideni \definujupravu \definujvelikostpapiru \definujverzi \definujvycet \definujvystup \definujzakladnifont \definujzasobnikpoli \definujznaceni \description \dodrzujprofil \dodrzujverzi \dodrzujverziprofilu \dvoustrannypapir \emptylines \enumeration \externiobraz \footnotetext \forceblocks \framedtext \hl \hlavnijazyk \indentation \ininner \inouter \instalacejazyka \interakcnilista \interakcnitlacitka \jazyk \jdidolu \jdina \jdinabox \klonujpole \komentar \konvertujcislo \kopirujpole \korekcebilehomista \labeling \listsymbol \loadsorts \loadsynonyms \marginalnilinka \marginalnitext \matematika \mediaeval \meritko \mesic \mezera \mrizka \nadpis \nadruhyokraj \nadtrzeni \nadtrzeno \name \naokraj \nastavbarvu \nastavbarvy \nastavbilamista \nastavblok \nastavbloksekce \nastavbuffer \nastavcernelinky \nastavcislonadpisu \nastavcislostrany \nastavcislovani \nastavcislovaniodstavcu \nastavcislovaniradku \nastavcislovanistran \nastavcitaci \nastavdefinicipoznamekpodcarou \nastavdeleniplvoucichobjektu \nastavdelitko \nastavdolnitexty \nastavexterniobrazy \nastavhorejsek \nastavhornitexty \nastavinterakci \nastavinterakcnilistu \nastavinterakcnimenu \nastavinterakcniobrazovku \nastavjazyk \nastavkapitalky \nastavkombinovanyseznam \nastavkomentar \nastavlegendu \nastavmarginalie \nastavmarginalniblok \nastavmarginalnilinky \nastavmeziradkovoumezeru \nastavmeziradkovoumezeru \nastavnadpis \nastavnadpisy \nastavodkazovani \nastavodsazeni \nastavodsazovani \nastavodstavce \nastavopis \nastavoramovanetexty \nastavoramovani \nastavorez \nastavotoceni \nastavpaletu \nastavplvouciobjekt \nastavplvouciobjekty \nastavpodcislostrany \nastavpodtrzeni \nastavpole \nastavpolozky \nastavpopisek \nastavpopisky \nastavpopisy \nastavpozadi \nastavpozadi \nastavpoznamkypodcarou \nastavprechodstrany \nastavpreskok \nastavprofily \nastavprogramy \nastavprostredizakladnihofontu \nastavpublikace \nastavradkovani \nastavradky \nastavrastr \nastavrejstrik \nastavrovnice \nastavsadusymbolu \nastavsekci \nastavseznam \nastavseznamodkazu \nastavsirkucary \nastavsloupce \nastavspodek \nastavspojeni \nastavsynchronizaci \nastavsynchronizacnilistu \nastavsynonyma \nastavsystem \nastavtab \nastavtabelaci \nastavtabulky \nastavtenkelinky \nastavtext \nastavtexthlavicky \nastavtextovelinky \nastavtextpopisku \nastavtexttexty \nastavtextyupati \nastavtextyzahlavi \nastavtlacitka \nastavtoleranci \nastavtrideni \nastavtype \nastavumisteniprotejsku \nastavumistovani \nastavupati \nastavupravu \nastavurl \nastavusporadani \nastavvelikostpapiru \nastavverze \nastavvsechnapole \nastavvycty \nastavvyplnovelinky \nastavvyplnoveradky \nastavvystup \nastavvzhled \nastavzahlavi \nastavzakladnifont \nastavzarovnani \nastavznaceni \nastavzuzeni \nastrane \nejakyradek \nekde \nextsection \nivy \nizky \nocap \nop \obrazovka \odkaz \odkaz \odkaznadatum \odkaznastranu \odkaznatext \odsazovani \okr \opis \opissoubor \oramovani \oref \orez \otocit \oznacverzi \paragraph \parovastrana \part \pis \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \podtrzeni \podtrzeno \pol \pole \polozka \polozky \popisky \porovnejpaletu \porovnejskupinubarev \pozadi \pozice \poznamka \poznamkapodcarou \pref \prelozit \premistinamrizku \prepninazakladnifont \preskoc \preskrtnuti \preskrtnuto \prizpusobivepole \prizpusobvzhled \program \propojeneznaceni \propojenydokument \propojenyrejstrik \publikace \ran \ref \register \reservefloat \reset \resettextcontent \resetznaceni \rimskecislice \rozdelplvouciobjekt \rozpojeneznaceni \roztazene \schovejbloky \section \sedabarva \seeregister \settextcontent \setupforms \setupitemgroup \setuplistalternative \setuppaper \setupstrut \sloupec \slovovpravo \sort \spodek \stanovcharakteristickuseznamu \stanovcislonadpisu \startalignment \startbarva \startbuffer \startbuffer \startcitace \startcolumns \startcombination \startdescription \startdocument \startenumeration \startfakt \startfigure \startfloattext \startformula \startframedtext \starthiding \startinteraktivnimenu \startitemgroup \startkomentar \startkomponenta \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginalnilinka \startmarginblock \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startpozadi \startprodukt \startprofile \startprojekt \startprostredi \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttextovalinka \starttyping \startunpacked \startverze \startzhustene \stopalignment \stopbarva \stopbuffer \stopbuffer \stopcitace \stopcolumns \stopcombination \stopdescription \stopdocument \stopenumeration \stopfakt \stopfigure \stopfloattext \stopformula \stopframedtext \stophiding \stopinteraktivnimenu \stopitemgroup \stopkomentar \stopkomponenta \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginalnilinka \stopmarginblock \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stoppozadi \stopprodukt \stopprofile \stopprojekt \stopprostredi \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptextovalinka \stoptyping \stopunpacked \stopverze \stopzhustene \strana \sub \subject \subsection \subsubject \subsubsection \subsubsubject \sym \symbol \synchronizacnilista \synchronizovat \synonym \tab \tecky \tenkalinka \tenkelinky \tex \texthlavicky \textovalinka \textpopisku \title \tlacitko \tref \tvrdemezery \typebuffer \typstrany \ukazbarvu \ukazexterniobrazy \ukazmrizku \ukaznastaveni \ukazpaletu \ukazpodpery \ukazpole \ukazpostredizakladnihofontu \ukazramecek \ukazsadusymbolu \ukazskupinubarev \ukazupravu \ukazvytisk \ukazvzhled \ukazzakladnifont \umistikombinovanyseznam \umistikombinovanyseznam \umistilegendu \umistiloga \umistilokalnipoznamkypodcarou \umistinadsebe \umistinamrizku \umistipodrovnici \umistipoznamkypodcarou \umistirejstrik \umistirejstrik \umistirovnici \umistiseznam \umistivedlesebe \umistizalozky \usedirectory \uzijURL \uzijbloky \uzijexternidokument \uzijexterniobraz \uzijexternisoubor \uzijexternisoubory \uzijexternizvuk \uzijkodovani \uzijmodul \uzijodkazy \uzijprikazy \uzijspeciality \uzijsymbol \verze \vl \vlasovalinka \vlevo \vpravo \vradku \vsedniden \vyberbloky \vyberpapir \vyberverzi \vyplnenytext \vyplnovelinky \vyplnovepole \vyplnovyradek \vysoky \zablokujinterakcnimenu \zachovejbloky \zadnamezera \zadnebilemisto \zadnedalsibloky \zadnedalsisoubory \zadnehorniadolniradky \zadneodsazovani \zadnezahlaviaupati \zadneznaceni \zadnyseznam \zalozka \zapisdorejstriku \zapisdoseznamu \zapisdoseznamuodkazu \zapismeziseznam \zaramovani \zarovnanonastred \zarovnanovlevo \zarovnanovpravo \zasobnikpoli \zaznamovepole \zhustene \ziskejbuffer \ziskejznaceni \zlomek \znaceni \znak \znaky \zpracujbloky \zpracujstranu \zrcadlit \zref
\ No newline at end of file
+BBLMKeywordList \CAP \Cap \Caps \MESIC \Rimskecislice \SLOVA \SLOVO \Slova \Slovo \VSEDNIDEN \Znak \Znaky \aktualnicislonadpisu \aktualnidatum \appendix \barva \bilemisto \bublinkovanapoveda \bypassblocks \cap \cernalinka \cernelinky \chapter \chem \cisla \cislonadpisu \citace \citovat \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \coupledregister \crlf \datum \definebodyfontDEF \definebodyfontREF \definedfont \definefontfeature \definefonthandling \definetype \definetypeface \definuj \definujbarvu \definujblok \definujbloksekce \definujbuffer \definujfont \definujformatodkazu \definujinterakcnimenu \definujinterakcnimenu \definujkombinovanyseznam \definujkonverzi \definujlogo \definujnadpis \definujobrazeksymbol \definujodkaz \definujodsazovani \definujodstavce \definujopis \definujoramovani \definujoramovanytext \definujpaletu \definujplvouciobjekt \definujpodpole \definujpole \definujpopis \definujpopisek \definujprekryv \definujpreskok \definujprofil \definujprogram \definujprostredizakladnihofontu \definujrejstrik \definujsablonutabulky \definujsekci \definujseznam \definujseznamodkazu \definujskupinubarev \definujstartstop \definujsymbol \definujsynonumumfontu \definujsynonyma \definujtabelaci \definujtext \definujtrideni \definujupravu \definujvelikostpapiru \definujverzi \definujvycet \definujvystup \definujzakladnifont \definujzasobnikpoli \definujznaceni \description \dodrzujprofil \dodrzujverzi \dodrzujverziprofilu \dvoustrannypapir \emptylines \enumeration \externiobraz \footnotetext \forceblocks \framedtext \hl \hlavnijazyk \indentation \ininner \inouter \instalacejazyka \interakcnilista \interakcnitlacitka \jazyk \jdidolu \jdina \jdinabox \klonujpole \komentar \konvertujcislo \kopirujpole \korekcebilehomista \labeling \listsymbol \loadsorts \loadsynonyms \mapfontsize \marginalnilinka \marginalnitext \matematika \mediaeval \meritko \mesic \mezera \mrizka \nadpis \nadruhyokraj \nadtrzeni \nadtrzeno \name \naokraj \nastavbarvu \nastavbarvy \nastavbilamista \nastavblok \nastavbloksekce \nastavbuffer \nastavcernelinky \nastavcislonadpisu \nastavcislostrany \nastavcislovani \nastavcislovaniodstavcu \nastavcislovaniradku \nastavcislovanistran \nastavcitaci \nastavdefinicipoznamekpodcarou \nastavdeleniplvoucichobjektu \nastavdelitko \nastavdolnitexty \nastavexterniobrazy \nastavhorejsek \nastavhornitexty \nastavinterakci \nastavinterakcnilistu \nastavinterakcnimenu \nastavinterakcniobrazovku \nastavjazyk \nastavkapitalky \nastavkombinovanyseznam \nastavkomentar \nastavlegendu \nastavmarginalie \nastavmarginalniblok \nastavmarginalnilinky \nastavmeziradkovoumezeru \nastavnadpis \nastavnadpisy \nastavodkazovani \nastavodsazeni \nastavodsazovani \nastavodstavce \nastavopis \nastavoramovanetexty \nastavoramovani \nastavorez \nastavotoceni \nastavpaletu \nastavplvouciobjekt \nastavplvouciobjekty \nastavpodcislostrany \nastavpodtrzeni \nastavpole \nastavpolozky \nastavpopisek \nastavpopisky \nastavpopisy \nastavpozadi \nastavpozadi \nastavpoznamkypodcarou \nastavprechodstrany \nastavpreskok \nastavprofily \nastavprogramy \nastavprostredizakladnihofontu \nastavpublikace \nastavradkovani \nastavradky \nastavrastr \nastavrejstrik \nastavrovnice \nastavsadusymbolu \nastavsekci \nastavseznam \nastavseznamodkazu \nastavsirkucary \nastavsloupce \nastavspodek \nastavspojeni \nastavsynchronizaci \nastavsynchronizacnilistu \nastavsynonyma \nastavsystem \nastavtab \nastavtabelaci \nastavtabulky \nastavtenkelinky \nastavtext \nastavtexthlavicky \nastavtextovelinky \nastavtextpopisku \nastavtexttexty \nastavtextyupati \nastavtextyzahlavi \nastavtlacitka \nastavtoleranci \nastavtrideni \nastavtype \nastavumisteniprotejsku \nastavumistovani \nastavupati \nastavupravu \nastavurl \nastavusporadani \nastavvelikostpapiru \nastavverze \nastavvsechnapole \nastavvycty \nastavvyplnovelinky \nastavvyplnoveradky \nastavvystup \nastavvzhled \nastavzahlavi \nastavzakladnifont \nastavzarovnani \nastavznaceni \nastavzuzeni \nastrane \nejakyradek \nekde \nextsection \nivy \nizky \nocap \nop \obrazovka \odkaz \odkaz \odkaznadatum \odkaznastranu \odkaznatext \odsazovani \okr \opis \opissoubor \oramovani \oref \orez \otocit \oznacverzi \paragraph \parovastrana \part \pis \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \podtrzeni \podtrzeno \pol \pole \polozka \polozky \popisky \porovnejpaletu \porovnejskupinubarev \pozadi \pozice \poznamka \poznamkapodcarou \pref \prelozit \premistinamrizku \prepninazakladnifont \preskoc \preskrtnuti \preskrtnuto \prizpusobivepole \prizpusobvzhled \program \propojeneznaceni \propojenydokument \propojenyrejstrik \publikace \ran \ref \register \reservefloat \reset \resettextcontent \resetznaceni \rimskecislice \rozdelplvouciobjekt \rozpojeneznaceni \roztazene \schovejbloky \section \sedabarva \seeregister \settextcontent \setupfonthandling \setupfontsynonym \setupforms \setupinterlinespace2 \setupitemgroup \setuplistalternative \setuppaper \setupstrut \sloupec \slovovpravo \sort \spodek \stanovcharakteristickuseznamu \stanovcislonadpisu \startalignment \startbarva \startbuffer \startbuffer \startcitace \startcolumns \startcombination \startdescription \startdocument \startenumeration \startfakt \startfigure \startfloattext \startformula \startframedtext \starthiding \startinteraktivnimenu \startitemgroup \startkomentar \startkomponenta \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginalnilinka \startmarginblock \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startpozadi \startprodukt \startprofile \startprojekt \startprostredi \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttextovalinka \starttyping \startunpacked \startverze \startzhustene \stopalignment \stopbarva \stopbuffer \stopbuffer \stopcitace \stopcolumns \stopcombination \stopdescription \stopdocument \stopenumeration \stopfakt \stopfigure \stopfloattext \stopformula \stopframedtext \stophiding \stopinteraktivnimenu \stopitemgroup \stopkomentar \stopkomponenta \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginalnilinka \stopmarginblock \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stoppozadi \stopprodukt \stopprofile \stopprojekt \stopprostredi \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptextovalinka \stoptyping \stopunpacked \stopverze \stopzhustene \strana \sub \subject \subsection \subsubject \subsubsection \subsubsubject \sym \symbol \synchronizacnilista \synchronizovat \synonym \tab \tecky \tenkalinka \tenkelinky \tex \texthlavicky \textovalinka \textpopisku \title \tlacitko \tref \tvrdemezery \typebuffer \typstrany \ukazbarvu \ukazexterniobrazy \ukazmrizku \ukaznastaveni \ukazpaletu \ukazpodpery \ukazpole \ukazpostredizakladnihofontu \ukazramecek \ukazsadusymbolu \ukazskupinubarev \ukazupravu \ukazvytisk \ukazvzhled \ukazzakladnifont \umistikombinovanyseznam \umistikombinovanyseznam \umistilegendu \umistiloga \umistilokalnipoznamkypodcarou \umistinadsebe \umistinamrizku \umistipodrovnici \umistipoznamkypodcarou \umistirejstrik \umistirejstrik \umistirovnici \umistiseznam \umistivedlesebe \umistizalozky \usedirectory \usetypescript \usetypescriptfile \uzijURL \uzijbloky \uzijexternidokument \uzijexterniobraz \uzijexternisoubor \uzijexternisoubory \uzijexternizvuk \uzijkodovani \uzijmodul \uzijodkazy \uzijprikazy \uzijspeciality \uzijsymbol \verze \vl \vlasovalinka \vlevo \vpravo \vradku \vsedniden \vyberbloky \vyberpapir \vyberverzi \vyplnenytext \vyplnovelinky \vyplnovepole \vyplnovyradek \vysoky \zablokujinterakcnimenu \zachovejbloky \zadnamezera \zadnebilemisto \zadnedalsibloky \zadnedalsisoubory \zadnehorniadolniradky \zadneodsazovani \zadnezahlaviaupati \zadneznaceni \zadnyseznam \zalozka \zapisdorejstriku \zapisdoseznamu \zapisdoseznamuodkazu \zapismeziseznam \zaramovani \zarovnanonastred \zarovnanovlevo \zarovnanovpravo \zasobnikpoli \zaznamovepole \zhustene \ziskejbuffer \ziskejznaceni \zlomek \znaceni \znak \znaky \zpracujbloky \zpracujstranu \zrcadlit \zref
\ No newline at end of file
diff --git a/context/data/context-bbedit-de.xml b/context/data/context-bbedit-de.xml
index f49d26cdf..06bfe071d 100644
--- a/context/data/context-bbedit-de.xml
+++ b/context/data/context-bbedit-de.xml
@@ -1 +1 @@
-BBLMKeywordList \Buchstabe \Buchstaben \CAP \Cap \Caps \MONAT \Roemischezahlen \WOCHENTAG \WOERTER \WORT \Woerter \Wort \amgitterausrichten \amgitterneuausrichten \appendix \aufseite \ausfuellfeld \ausfuelltext \ausschnitt \bearbeitebloecke \bearbeiteseite \behaltebloecke \bei \benutzekodierung \benutzespezielles \beschrifteversion \beschriftung \bestimmekopfnummer \bestimmelistencharakeristika \bildschirm \blanko \bookmark \bruch \buchstabe \buchstaben \but \bypassblocks \cap \chapter \chem \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \coupledregister \crlf \datum \defineoutput \definetype \definiereabbsymbol \definiereabsaetze \definiereabschnitt \definiereabschnittsblock \definierebeschreibung \definierebeschreibungen \definierebeschriftung \definiereblanko \definiereblock \definiereeinzug \definierefarbe \definierefarbengruppe \definierefeld \definierefeldstapel \definierefliesstext \definierefliesstextumgebung \definieregleitobjekt \definiereinteraktionsmenue \definiereinteraktionsmenue \definierekonversion \definierelabel \definiereliste \definierelogo \definieren \definierenummerierung \definiereoverlay \definierepalette \definierepapierformat \definiereprofil \definiereprogramme \definierepuffer \definierereferenz \definierereferenzformat \definierereferenzliste \definiereregister \definiereschrift \definieresortieren \definierestartstop \definieresubfeld \definieresymbol \definieresynonyme \definieretabellenvorlage \definieretabulator \definieretext \definieretippen \definiereueberschrift \definiereumbruch \definiereumrahmt \definiereumrahmtertext \definiereversion \definierezusammengestellteliste \description \doppelseite \doppelseitigespapier \drehen \duennelinie \duennerumriss \durchgestrichen \durchstreichen \einezeile \einziehen \emptylines \entknuepfebeschriftung \enumeration \externeabbildung \farbe \feld \feldstapel \festesspatium \folgeprofil \folgeprofilversion \folgeversion \footnotetext \forceblocks \format \framedtext \fussnote \gefuelltesrechteck \gefuelltezeile \gestreckt \gitter \graufarbe \haarlinie \hauptsprache \heutigesdatum \heutigeskopfnummer \hintergrund \hl \hoch \holebeschriftung \holepuffer \imlinken \imrechten \imumriss \in \inaktiviereinteraktionsmenue \inanderermarginale \indentation \ininner \inmarginalie \inouter \installieresprache \interaktionsbalken \interaktionsknopfe \inzeile \irgendwo \its \keinebeschriftung \keinebloeckemehr \keinedateienmehr \keinekopfundfusszeilen \keineliste \keinspatium \keinzeilenobenundunten \keinzwischenraum \kleinerdurchschuss \klonierefeld \knopf \kommentar \konvertierezahl \kopf \kopfnummer \kopierefeld \korrigierezwischenraum \labeling \labels \labeltext \linksbuendig \listsymbol \loadsorts \loadsynonyms \mar \marginallinie \marginaltext \mathematik \mediaeval \monat \nachunten \name \nextsection \nichteinziehen \nocap \nop \notiz \paragraph \part \passelayoutan \passendfeld \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \platzierebookmarks \platziereformel \platzierefussnoten \platzierelegende \platziereliste \platzierelogo \platzierelokalefussnoten \platzierenebeneinander \platziereregister \platziereregister \platziereuntereinander \platziereunterformel \platzierezusammengestellteliste \platzierezusammengestellteliste \pos \position \posten \programm \publikation \punkt \ran \rechteck \rechtecke \rechtsbuendig \ref \referenz \register \registrierefelder \reservefloat \resettextcontent \roemischezahlen \ruecksetzten \ruecksetztenbeschriftung \schreibezumregister \schreibezurliste \schreibezurreferenzliste \schreibezwischenliste \section \seeregister \seite \seitenreferenz \seitentyp \settext \setupforms \setupitemgroup \setuplistalternative \setuppaper \setupstrut \showsymbolset \sort \spalte \spatium \spiegeln \sprache \startalignment \startbuffer \startbuffer \startcolumns \startcombination \startdescription \startdocument \startenumeration \startfarbe \startfigure \startfloattext \startformula \startframedtext \startgeg \starthiding \starthintergrund \startinteraktionsmenue \startitemgroup \startkleinerdurchschuss \startkommentar \startkomponente \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginallinie \startmarginblock \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodukt \startprofile \startprojekt \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttextlinie \starttyping \startumgebung \startunpacked \startversion \startzitat \stelleabsaetzeein \stelleabsatznummerierungein \stelleabschnittein \stelleabschnittsblockein \stelleanordnenein \stelleausgabeein \stelleausrichtungein \stelleausschnittein \stellebeschreibungein \stellebeschriftungein \stellebilderunterschriftein \stellebildunterschriftein \stellebindestrichein \stelleblankoein \stelleblockein \stelledrehenein \stelleduennerumrissein \stelleeinziehenein \stelleeinzuegein \stelleengerein \stelleexterneabbildungenein \stellefarbeein \stellefarbenein \stellefeldein \stellefelderin \stellefliesstextein \stellefliesstextumgebungein \stelleformelnein \stellefussnotendefinitionein \stellefussnotenein \stellefusszeileein \stellefusszeilentextein \stellegefuelltesrechteckein \stellegefuelltezeileein \stellegegenueberplatzierenein \stellegleitobjekteein \stellegleitobjektein \stellehintergruendeein \stellehintergrundein \stelleinmarginalieein \stelleinteraktionein \stelleinteraktionsbalkenein \stelleinteraktionsbildschirmein \stelleinteraktionsmenueein \stelleknopfein \stellekombinationein \stellekommentarein \stellekopfzahlein \stellekopfzeileein \stellekopfzeilentextein \stellelabeltextein \stellelayoutein \stellelegendeein \stellelinienbreiteein \stellelisteein \stellemarginalblockein \stellemarginallinieein \stellenobenein \stellenummerierungein \stellepaletteein \stellepapierformatein \stelleplatziegeteiltegleitobjekt \stellepositionierenein \stellepostenein \stelleprofilein \stelleprogrammein \stellepublikationein \stellepufferein \stellerasterein \stellerechteckein \stellereferenzierenein \stellereferenzlisteein \stelleregisterein \stelleseitennummerein \stelleseitennummeriernungein \stelleseitenuebergangein \stellesortierenein \stellespaltenein \stellespatiumein \stellespracheein \stellesymbolsetein \stellesynchronisationein \stellesynchronisationsbalkenein \stellesynonymein \stellesystemein \stelletabein \stelletabellenein \stelletabulatorein \stelletextein \stelletextobenein \stelletexttexteein \stelletextumrissein \stelletextuntenein \stelletipein \stelletippenein \stelletoleranzein \stelleueberschriftein \stelleueberschriftenein \stelleueberschrifttextein \stelleumbruchein \stelleumrahmtein \stelleumrahmtetexteein \stelleuntenein \stelleunterseitennummerein \stelleunterstreichenein \stelleurlein \stelleversalienein \stelleversionein \stellezeilenabstandein \stellezeilenabstandein \stellezeilenein \stellezeilennumerierungein \stellezitierenein \stellezusammengestelltelisteein \stellezwischenraumein \stopalignment \stopbuffer \stopbuffer \stopcolumns \stopcombination \stopdescription \stopdocument \stopenumeration \stopfarbe \stopfigure \stopfloattext \stopformula \stopframedtext \stopgeg \stophiding \stophintergrund \stopinteraktionsmenue \stopitemgroup \stopkleinerdurchschuss \stopkommentar \stopkomponente \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginallinie \stopmarginblock \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodukt \stopprofile \stopprojekt \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptextlinie \stoptyping \stopumgebung \stopunpacked \stopversion \stopzitat \sub \subject \subsection \subsubject \subsubsection \subsubsubject \sym \symbol \synchronisationsbalken \synchronisieren \synonym \tab \teilegleitobjekt \tex \textlinie \textreferenz \tief \tiho \tip \tippedatei \tippen \tippepuffer \title \tooltip \ueber \ueberschrifttext \uebersetzten \ueberstreichen \ueberstrichen \umrahmt \unterstreichen \unterstrichen \usedirectory \verbergebloecke \vergleichefarbengruppe \vergleichepalette \verknuepfebeschriftung \verknuepfedokument \verknuepfregister \version \verweis \verweisdatum \verwendeURL \verwendebefehl \verwendebloecke \verwendeexteresdokument \verwendeexterneabbildung \verwendeexternedatei \verwendeexternedateien \verwendeexternestonstueck \verwendemodul \verwendereferenzen \verwendesymbole \vl \von \waehlebloeckeaus \waehlepapieraus \waehleversionaus \wechselezumfliesstext \wochentag \wortrechts \zeigedruck \zeigeeinstellungen \zeigeexterneabbildungen \zeigefarbe \zeigefarbengruppe \zeigefelder \zeigefliesstext \zeigefliesstextumgebung \zeigegitter \zeigelayout \zeigepalette \zeigerahmen \zeigestruts \zeigeumbruch \zentriert \ziffern \zitat \zitieren \zu \zurbox \zwischenraum
\ No newline at end of file
+BBLMKeywordList \Buchstabe \Buchstaben \CAP \Cap \Caps \MONAT \Roemischezahlen \WOCHENTAG \WOERTER \WORT \Woerter \Wort \amgitterausrichten \amgitterneuausrichten \appendix \aufseite \ausfuellfeld \ausfuelltext \ausschnitt \bearbeitebloecke \bearbeiteseite \behaltebloecke \bei \benutzekodierung \benutzespezielles \beschrifteversion \beschriftung \bestimmekopfnummer \bestimmelistencharakeristika \bildschirm \blanko \bookmark \bruch \buchstabe \buchstaben \but \bypassblocks \cap \chapter \chem \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \coupledregister \crlf \datum \definebodyfontDEF \definebodyfontREF \definedfont \definefontfeature \definefonthandling \defineoutput \defineschriftsynonym \definetype \definetypeface \definiereabbsymbol \definiereabsaetze \definiereabschnitt \definiereabschnittsblock \definierebeschreibung \definierebeschreibungen \definierebeschriftung \definiereblanko \definiereblock \definiereeinzug \definierefarbe \definierefarbengruppe \definierefeld \definierefeldstapel \definierefliesstext \definierefliesstextumgebung \definieregleitobjekt \definiereinteraktionsmenue \definiereinteraktionsmenue \definierekonversion \definierelabel \definiereliste \definierelogo \definieren \definierenummerierung \definiereoverlay \definierepalette \definierepapierformat \definiereprofil \definiereprogramme \definierepuffer \definierereferenz \definierereferenzformat \definierereferenzliste \definiereregister \definiereschrift \definieresortieren \definierestartstop \definieresubfeld \definieresymbol \definieresynonyme \definieretabellenvorlage \definieretabulator \definieretext \definieretippen \definiereueberschrift \definiereumbruch \definiereumrahmt \definiereumrahmtertext \definiereversion \definierezusammengestellteliste \description \doppelseite \doppelseitigespapier \drehen \duennelinie \duennerumriss \durchgestrichen \durchstreichen \einezeile \einziehen \emptylines \entknuepfebeschriftung \enumeration \externeabbildung \farbe \feld \feldstapel \festesspatium \folgeprofil \folgeprofilversion \folgeversion \footnotetext \forceblocks \format \framedtext \fussnote \gefuelltesrechteck \gefuelltezeile \gestreckt \gitter \graufarbe \haarlinie \hauptsprache \heutigesdatum \heutigeskopfnummer \hintergrund \hl \hoch \holebeschriftung \holepuffer \imlinken \imrechten \imumriss \in \inaktiviereinteraktionsmenue \inanderermarginale \indentation \ininner \inmarginalie \inouter \installieresprache \interaktionsbalken \interaktionsknopfe \inzeile \irgendwo \its \keinebeschriftung \keinebloeckemehr \keinedateienmehr \keinekopfundfusszeilen \keineliste \keinspatium \keinzeilenobenundunten \keinzwischenraum \kleinerdurchschuss \klonierefeld \knopf \kommentar \konvertierezahl \kopf \kopfnummer \kopierefeld \korrigierezwischenraum \labeling \labels \labeltext \linksbuendig \listsymbol \loadsorts \loadsynonyms \mapfontsize \mar \marginallinie \marginaltext \mathematik \mediaeval \monat \nachunten \name \nextsection \nichteinziehen \nocap \nop \notiz \paragraph \part \passelayoutan \passendfeld \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \platzierebookmarks \platziereformel \platzierefussnoten \platzierelegende \platziereliste \platzierelogo \platzierelokalefussnoten \platzierenebeneinander \platziereregister \platziereregister \platziereuntereinander \platziereunterformel \platzierezusammengestellteliste \platzierezusammengestellteliste \pos \position \posten \programm \publikation \punkt \ran \rechteck \rechtecke \rechtsbuendig \ref \referenz \register \registrierefelder \reservefloat \resettextcontent \roemischezahlen \ruecksetzten \ruecksetztenbeschriftung \schreibezumregister \schreibezurliste \schreibezurreferenzliste \schreibezwischenliste \section \seeregister \seite \seitenreferenz \seitentyp \settext \setupfonthandling \setupfontsynonym \setupforms \setupinterlinespace2 \setupitemgroup \setuplistalternative \setuppaper \setupstrut \showsymbolset \sort \spalte \spatium \spiegeln \sprache \startalignment \startbuffer \startbuffer \startcolumns \startcombination \startdescription \startdocument \startenumeration \startfarbe \startfigure \startfloattext \startformula \startframedtext \startgeg \starthiding \starthintergrund \startinteraktionsmenue \startitemgroup \startkleinerdurchschuss \startkommentar \startkomponente \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginallinie \startmarginblock \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodukt \startprofile \startprojekt \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttextlinie \starttyping \startumgebung \startunpacked \startversion \startzitat \stelleabsaetzeein \stelleabsatznummerierungein \stelleabschnittein \stelleabschnittsblockein \stelleanordnenein \stelleausgabeein \stelleausrichtungein \stelleausschnittein \stellebeschreibungein \stellebeschriftungein \stellebilderunterschriftein \stellebildunterschriftein \stellebindestrichein \stelleblankoein \stelleblockein \stelledrehenein \stelleduennerumrissein \stelleeinziehenein \stelleeinzuegein \stelleengerein \stelleexterneabbildungenein \stellefarbeein \stellefarbenein \stellefeldein \stellefelderin \stellefliesstextein \stellefliesstextumgebungein \stelleformelnein \stellefussnotendefinitionein \stellefussnotenein \stellefusszeileein \stellefusszeilentextein \stellegefuelltesrechteckein \stellegefuelltezeileein \stellegegenueberplatzierenein \stellegleitobjekteein \stellegleitobjektein \stellehintergruendeein \stellehintergrundein \stelleinmarginalieein \stelleinteraktionein \stelleinteraktionsbalkenein \stelleinteraktionsbildschirmein \stelleinteraktionsmenueein \stelleknopfein \stellekombinationein \stellekommentarein \stellekopfzahlein \stellekopfzeileein \stellekopfzeilentextein \stellelabeltextein \stellelayoutein \stellelegendeein \stellelinienbreiteein \stellelisteein \stellemarginalblockein \stellemarginallinieein \stellenobenein \stellenummerierungein \stellepaletteein \stellepapierformatein \stelleplatziegeteiltegleitobjekt \stellepositionierenein \stellepostenein \stelleprofilein \stelleprogrammein \stellepublikationein \stellepufferein \stellerasterein \stellerechteckein \stellereferenzierenein \stellereferenzlisteein \stelleregisterein \stelleseitennummerein \stelleseitennummeriernungein \stelleseitenuebergangein \stellesortierenein \stellespaltenein \stellespatiumein \stellespracheein \stellesymbolsetein \stellesynchronisationein \stellesynchronisationsbalkenein \stellesynonymein \stellesystemein \stelletabein \stelletabellenein \stelletabulatorein \stelletextein \stelletextobenein \stelletexttexteein \stelletextumrissein \stelletextuntenein \stelletipein \stelletippenein \stelletoleranzein \stelleueberschriftein \stelleueberschriftenein \stelleueberschrifttextein \stelleumbruchein \stelleumrahmtein \stelleumrahmtetexteein \stelleuntenein \stelleunterseitennummerein \stelleunterstreichenein \stelleurlein \stelleversalienein \stelleversionein \stellezeilenabstandein \stellezeilenein \stellezeilennumerierungein \stellezitierenein \stellezusammengestelltelisteein \stellezwischenraumein \stopalignment \stopbuffer \stopbuffer \stopcolumns \stopcombination \stopdescription \stopdocument \stopenumeration \stopfarbe \stopfigure \stopfloattext \stopformula \stopframedtext \stopgeg \stophiding \stophintergrund \stopinteraktionsmenue \stopitemgroup \stopkleinerdurchschuss \stopkommentar \stopkomponente \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginallinie \stopmarginblock \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodukt \stopprofile \stopprojekt \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptextlinie \stoptyping \stopumgebung \stopunpacked \stopversion \stopzitat \sub \subject \subsection \subsubject \subsubsection \subsubsubject \sym \symbol \synchronisationsbalken \synchronisieren \synonym \tab \teilegleitobjekt \tex \textlinie \textreferenz \tief \tiho \tip \tippedatei \tippen \tippepuffer \title \tooltip \ueber \ueberschrifttext \uebersetzten \ueberstreichen \ueberstrichen \umrahmt \unterstreichen \unterstrichen \usedirectory \usetypescript \usetypescriptfile \verbergebloecke \vergleichefarbengruppe \vergleichepalette \verknuepfebeschriftung \verknuepfedokument \verknuepfregister \version \verweis \verweisdatum \verwendeURL \verwendebefehl \verwendebloecke \verwendeexteresdokument \verwendeexterneabbildung \verwendeexternedatei \verwendeexternedateien \verwendeexternestonstueck \verwendemodul \verwendereferenzen \verwendesymbole \vl \von \waehlebloeckeaus \waehlepapieraus \waehleversionaus \wechselezumfliesstext \wochentag \wortrechts \zeigedruck \zeigeeinstellungen \zeigeexterneabbildungen \zeigefarbe \zeigefarbengruppe \zeigefelder \zeigefliesstext \zeigefliesstextumgebung \zeigegitter \zeigelayout \zeigepalette \zeigerahmen \zeigestruts \zeigeumbruch \zentriert \ziffern \zitat \zitieren \zu \zurbox \zwischenraum
\ No newline at end of file
diff --git a/context/data/context-bbedit-en.xml b/context/data/context-bbedit-en.xml
index 7746865cf..41334d958 100644
--- a/context/data/context-bbedit-en.xml
+++ b/context/data/context-bbedit-en.xml
@@ -1 +1 @@
-BBLMKeywordList \CAP \Cap \Caps \Character \Characters \MONTH \Romannumerals \WEEKDAY \WORD \WORDS \Word \Words \about \adaptlayout \appendix \at \atpage \background \blackrule \blackrules \blank \bookmark \but \button \bypassblocks \cap \chapter \character \characters \chem \clip \clonefield \color \column \comment \comparecolorgroup \comparepalet \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \convertnumber \copyfield \correctwhitespace \coupledocument \coupledregister \couplemarking \couplepage \couplepaper \coupleregister \crlf \currentdate \currentheadnumber \date \decouplemarking \define \defineblank \defineblock \definebodyfont \definebodyfontenvironment \definebuffer \definecolor \definecolorgroup \definecombinedlist \defineconversion \definedescription \defineenumeration \definefield \definefieldstack \definefiguresymbol \definefloat \definefont \defineframed \defineframedtext \definehead \defineindenting \defineinteractionmenu \defineinteractionmenu \definelabel \definelist \definelogo \definemakeup \definemarking \defineoutput \defineoverlay \definepalet \definepapersize \defineparagraphs \defineprofile \defineprogram \definereference \definereferenceformat \definereferencelist \defineregister \definesection \definesectionblock \definesorting \definestartstop \definesubfield \definesymbol \definesynonyms \definetabletemplate \definetabulate \definetext \definetype \definetyping \defineversion \description \determineheadnumber \determinelistcharacteristics \disableinteractionmenu \emptylines \enumeration \externalfigure \field \fieldstack \fillinfield \fillinline \fillinrules \fillintext \fitfield \fixedspaces \followprofile \followprofileversion \followversion \footnote \footnotetext \forceblocks \fraction \framed \framedtext \from \getbuffer \getmarking \godown \goto \gotobox \graycolor \grid \hairline \head \headnumber \headtext \hideblocks \high \hl \in \indentation \indenting \inframed \ininner \inleft \inline \inmargin \inothermargin \inouter \inright \installlanguage \interactionbar \interactionbuttons \item \items \its \keepblocks \labeling \labels \labeltext \language \leftaligned \listsymbol \loadsorts \loadsynonyms \logfields \lohi \low \mainlanguage \mar \marginrule \margintext \marking \markversion \mathematics \mediaeval \midaligned \mirror \month \moveongrid \name \nextsection \nocap \noheaderandfooterlines \noindenting \nolist \nomarking \nomoreblocks \nomorefiles \nop \nospace \note \notopandbottomlines \nowhitespace \numbers \overbar \overbars \overstrike \overstrikes \packed \page \pagereference \pagetype \paragraph \part \periods \placebookmarks \placecombinedlist \placecombinedlist \placefloat \placefootnotes \placeformula \placelegend \placelist \placelistoffloats \placelistofsorts \placelistofsynonyms \placelocalfootnotes \placelogos \placeongrid \placeontopofeachother \placereferencelist \placeregister \placeregister \placesidebyside \placesubformula \position \processblocks \processpage \program \publication \quotation \quote \ran \ref \reference \referral \referraldate \register \reservefloat \reset \resetmarking \resettextcontent \rightaligned \romannumerals \rotate \scale \screen \section \seeregister \selectblocks \selectpaper \selectversion \settextcontent \setupalign \setuparranging \setupbackground \setupbackgrounds \setupblackrules \setupblank \setupblock \setupbodyfont \setupbodyfontenvironment \setupbottom \setupbottomtexts \setupbuffer \setupbuttons \setupcapitals \setupcaption \setupcaptions \setupclipping \setupcolor \setupcolors \setupcolumns \setupcombinations \setupcombinedlist \setupcomment \setupdescriptions \setupenumerations \setupexternalfigures \setupfield \setupfields \setupfillinlines \setupfillinrules \setupfloat \setupfloats \setupfloatsplitting \setupfooter \setupfootertexts \setupfootnotedefinition \setupfootnotes \setupforms \setupformulae \setupframed \setupframedtexts \setuphead \setupheader \setupheadertexts \setupheadnumber \setupheads \setupheadtext \setuphyphenmark \setupindentations \setupindenting \setupinmargin \setupinteraction \setupinteractionbar \setupinteractionmenu \setupinteractionscreen \setupinterlinespace \setupinterlinespace \setupitemgroup \setupitems \setuplabeltext \setuplanguage \setuplayout \setuplegend \setuplinenumbering \setuplines \setuplinewidth \setuplist \setuplistalternative \setupmakeup \setupmarginblocks \setupmarginrules \setupmarking \setupnarrower \setupnumbering \setupoppositeplacing \setupoutput \setuppagenumber \setuppagenumbering \setuppagetransitions \setuppalet \setuppaper \setuppapersize \setupparagraphnumbering \setupparagraphs \setuppositioning \setupprofiles \setupprograms \setuppublications \setupquote \setupreferencelist \setupreferencing \setupregister \setuprotate \setupscreens \setupsection \setupsectionblock \setupsorting \setupspacing \setupstrut \setupsubpagenumber \setupsymbolset \setupsynchronization \setupsynchronizationbar \setupsynonyms \setupsystem \setuptab \setuptables \setuptabulate \setuptext \setuptextrules \setuptexttexts \setupthinrules \setuptolerance \setuptop \setuptoptexts \setuptype \setuptyping \setupunderbar \setupurl \setupversions \setupwhitespace \showbodyfont \showbodyfontenvironment \showcolor \showcolorgroup \showexternalfigures \showfields \showframe \showgrid \showlayout \showmakeup \showpalet \showprint \showsetups \showstruts \showsymbolset \someline \somewhere \sort \space \splitfloat \startalignment \startbackground \startbuffer \startbuffer \startcolor \startcolumns \startcombination \startcomment \startcomponent \startdescription \startdocument \startenumeration \startenvironment \startfact \startfigure \startfloattext \startformula \startframedtext \starthiding \startinteractionmenu \startitemgroup \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startmarginrule \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startpacked \startparagraph \startpositioning \startpostponing \startproduct \startprofile \startproject \startquotation \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttextrule \starttyping \startunpacked \startversion \stopalignment \stopbackground \stopbuffer \stopbuffer \stopcolor \stopcolumns \stopcombination \stopcomment \stopcomponent \stopdescription \stopdocument \stopenumeration \stopenvironment \stopfact \stopfigure \stopfloattext \stopformula \stopframedtext \stophiding \stopinteractionmenu \stopitemgroup \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopmarginrule \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stoppacked \stopparagraph \stoppositioning \stoppostponing \stopproduct \stopprofile \stopproject \stopquotation \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptextrule \stoptyping \stopunpacked \stopversion \stretched \sub \subject \subsection \subsubject \subsubsection \subsubsubject \switchtobodyfont \sym \symbol \synchronizationbar \synchronize \synonym \tab \tex \textreference \textrule \thinrule \thinrules \title \tooltip \translate \typ \type \typebuffer \typefile \underbar \underbars \useURL \useblocks \usecommands \usedirectory \useencoding \useexternaldocument \useexternalfigure \useexternalfile \useexternalfiles \useexternalsoundtrack \usemodule \usereferences \usespecials \usesymbols \version \vl \weekday \whitespace \wordright \writebetweenlist \writetolist \writetoreferencelist \writetoregister
\ No newline at end of file
+BBLMKeywordList \CAP \Cap \Caps \Character \Characters \MONTH \Romannumerals \WEEKDAY \WORD \WORDS \Word \Words \about \adaptlayout \appendix \at \atpage \background \blackrule \blackrules \blank \bookmark \but \button \bypassblocks \cap \chapter \character \characters \chem \clip \clonefield \color \column \comment \comparecolorgroup \comparepalet \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \convertnumber \copyfield \correctwhitespace \coupledocument \coupledregister \couplemarking \couplepage \couplepaper \coupleregister \crlf \currentdate \currentheadnumber \date \decouplemarking \define \defineblank \defineblock \definebodyfont \definebodyfontDEF \definebodyfontREF \definebodyfontenvironment \definebuffer \definecolor \definecolorgroup \definecombinedlist \defineconversion \definedescription \definedfont \defineenumeration \definefield \definefieldstack \definefiguresymbol \definefloat \definefont \definefontfeature \definefonthandling \definefontsynonym \defineframed \defineframedtext \definehead \defineindenting \defineinteractionmenu \defineinteractionmenu \definelabel \definelist \definelogo \definemakeup \definemarking \defineoutput \defineoverlay \definepalet \definepapersize \defineparagraphs \defineprofile \defineprogram \definereference \definereferenceformat \definereferencelist \defineregister \definesection \definesectionblock \definesorting \definestartstop \definesubfield \definesymbol \definesynonyms \definetabletemplate \definetabulate \definetext \definetype \definetypeface \definetyping \defineversion \description \determineheadnumber \determinelistcharacteristics \disableinteractionmenu \emptylines \enumeration \externalfigure \field \fieldstack \fillinfield \fillinline \fillinrules \fillintext \fitfield \fixedspaces \followprofile \followprofileversion \followversion \footnote \footnotetext \forceblocks \fraction \framed \framedtext \from \getbuffer \getmarking \godown \goto \gotobox \graycolor \grid \hairline \head \headnumber \headtext \hideblocks \high \hl \in \indentation \indenting \inframed \ininner \inleft \inline \inmargin \inothermargin \inouter \inright \installlanguage \interactionbar \interactionbuttons \item \items \its \keepblocks \labeling \labels \labeltext \language \leftaligned \listsymbol \loadsorts \loadsynonyms \logfields \lohi \low \mainlanguage \mapfontsize \mar \marginrule \margintext \marking \markversion \mathematics \mediaeval \midaligned \mirror \month \moveongrid \name \nextsection \nocap \noheaderandfooterlines \noindenting \nolist \nomarking \nomoreblocks \nomorefiles \nop \nospace \note \notopandbottomlines \nowhitespace \numbers \overbar \overbars \overstrike \overstrikes \packed \page \pagereference \pagetype \paragraph \part \periods \placebookmarks \placecombinedlist \placecombinedlist \placefloat \placefootnotes \placeformula \placelegend \placelist \placelistoffloats \placelistofsorts \placelistofsynonyms \placelocalfootnotes \placelogos \placeongrid \placeontopofeachother \placereferencelist \placeregister \placeregister \placesidebyside \placesubformula \position \processblocks \processpage \program \publication \quotation \quote \ran \ref \reference \referral \referraldate \register \reservefloat \reset \resetmarking \resettextcontent \rightaligned \romannumerals \rotate \scale \screen \section \seeregister \selectblocks \selectpaper \selectversion \settextcontent \setupalign \setuparranging \setupbackground \setupbackgrounds \setupblackrules \setupblank \setupblock \setupbodyfont \setupbodyfontenvironment \setupbottom \setupbottomtexts \setupbuffer \setupbuttons \setupcapitals \setupcaption \setupcaptions \setupclipping \setupcolor \setupcolors \setupcolumns \setupcombinations \setupcombinedlist \setupcomment \setupdescriptions \setupenumerations \setupexternalfigures \setupfield \setupfields \setupfillinlines \setupfillinrules \setupfloat \setupfloats \setupfloatsplitting \setupfonthandling \setupfontsynonym \setupfooter \setupfootertexts \setupfootnotedefinition \setupfootnotes \setupforms \setupformulae \setupframed \setupframedtexts \setuphead \setupheader \setupheadertexts \setupheadnumber \setupheads \setupheadtext \setuphyphenmark \setupindentations \setupindenting \setupinmargin \setupinteraction \setupinteractionbar \setupinteractionmenu \setupinteractionscreen \setupinterlinespace \setupinterlinespace2 \setupitemgroup \setupitems \setuplabeltext \setuplanguage \setuplayout \setuplegend \setuplinenumbering \setuplines \setuplinewidth \setuplist \setuplistalternative \setupmakeup \setupmarginblocks \setupmarginrules \setupmarking \setupnarrower \setupnumbering \setupoppositeplacing \setupoutput \setuppagenumber \setuppagenumbering \setuppagetransitions \setuppalet \setuppaper \setuppapersize \setupparagraphnumbering \setupparagraphs \setuppositioning \setupprofiles \setupprograms \setuppublications \setupquote \setupreferencelist \setupreferencing \setupregister \setuprotate \setupscreens \setupsection \setupsectionblock \setupsorting \setupspacing \setupstrut \setupsubpagenumber \setupsymbolset \setupsynchronization \setupsynchronizationbar \setupsynonyms \setupsystem \setuptab \setuptables \setuptabulate \setuptext \setuptextrules \setuptexttexts \setupthinrules \setuptolerance \setuptop \setuptoptexts \setuptype \setuptyping \setupunderbar \setupurl \setupversions \setupwhitespace \showbodyfont \showbodyfontenvironment \showcolor \showcolorgroup \showexternalfigures \showfields \showframe \showgrid \showlayout \showmakeup \showpalet \showprint \showsetups \showstruts \showsymbolset \someline \somewhere \sort \space \splitfloat \startalignment \startbackground \startbuffer \startbuffer \startcolor \startcolumns \startcombination \startcomment \startcomponent \startdescription \startdocument \startenumeration \startenvironment \startfact \startfigure \startfloattext \startformula \startframedtext \starthiding \startinteractionmenu \startitemgroup \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startmarginrule \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startpacked \startparagraph \startpositioning \startpostponing \startproduct \startprofile \startproject \startquotation \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttextrule \starttyping \startunpacked \startversion \stopalignment \stopbackground \stopbuffer \stopbuffer \stopcolor \stopcolumns \stopcombination \stopcomment \stopcomponent \stopdescription \stopdocument \stopenumeration \stopenvironment \stopfact \stopfigure \stopfloattext \stopformula \stopframedtext \stophiding \stopinteractionmenu \stopitemgroup \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopmarginrule \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stoppacked \stopparagraph \stoppositioning \stoppostponing \stopproduct \stopprofile \stopproject \stopquotation \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptextrule \stoptyping \stopunpacked \stopversion \stretched \sub \subject \subsection \subsubject \subsubsection \subsubsubject \switchtobodyfont \sym \symbol \synchronizationbar \synchronize \synonym \tab \tex \textreference \textrule \thinrule \thinrules \title \tooltip \translate \typ \type \typebuffer \typefile \underbar \underbars \useURL \useblocks \usecommands \usedirectory \useencoding \useexternaldocument \useexternalfigure \useexternalfile \useexternalfiles \useexternalsoundtrack \usemodule \usereferences \usespecials \usesymbols \usetypescript \usetypescriptfile \version \vl \weekday \whitespace \wordright \writebetweenlist \writetolist \writetoreferencelist \writetoregister
\ No newline at end of file
diff --git a/context/data/context-bbedit-fr.xml b/context/data/context-bbedit-fr.xml
index 1aa875d3e..9f3f3be7d 100644
--- a/context/data/context-bbedit-fr.xml
+++ b/context/data/context-bbedit-fr.xml
@@ -1 +1 @@
-BBLMKeywordList \CAP \Cap \Caps \Caractere \Caracteres \Chiffresromains \JOURSEMAINE \MOIS \MOT \MOTS \Mot \Mots \a \adaptedisposition \ajustechamp \alaligne \alapage \aligneadroite \aligneagauche \aligneaumilieu \appendix \arriereplan \baha \barreinteraction \barresynchronisation \bas \bouton \boutonsinteraction \but \cacheblocs \cap \caractere \caracteres \champ \changepolicecorps \chapter \chem \chiffresromains \citation \citer \clip \clonechamp \colonne \commentaire \comparegroupecouleur \comparepalette \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregistre \composeenalinea \concernant \convertitnumero \copitchamp \corrigeespaceblanc \couleur \couleurgrise \coupledocument \coupledregister \couplemarquage \couplepapier \coupleregistre \crlf \dactylographier \dans \dansautremarge \dansdroite \dansgauche \dansmarge \date \datecourante \daterecommandation \de \decouplemarquage \defineframed \defineframedtext \definit \definitbloc \definitblocsection \definitbuffer \definitchamp \definitcompoalinea \definitconversion \definitcouleur \definitdactylo \definitdemarrestoppe \definitdescription \definitenumeration \definitenvironnementpolicecorps \definitetiquette \definitflottant \definitformatreference \definitgroupecouleur \definitliste \definitlisteimbriquee \definitlistereference \definitlogo \definitmakeup \definitmarquage \definitmenuinteraction \definitmenuinteraction \definitnotepdp \definitpalette \definitparagraphes \definitpilechamp \definitpolice \definitpolicecorps \definitprofil \definitprogramme \definitreference \definitregistre \definitrevetement \definitsection \definitsortie \definitsouschamp \definitsymbole \definitsymbolefigure \definitsynonymes \definittabulation \definittaillepapier \definittete \definittexte \definittrametableau \definittri \definittype \definitversion \definitvide \definitvide \demarreciter \deplacesurgrille \description \determinecaracteristiqueliste \determinenumerotete \echelle \ecran \ecritdansliste \ecritdanslistereference \ecritentreliste \ecritregistre \el \element \elements \emptylines \enumeration \espace \espaceblanc \espacesfixes \etiquettes \etire \fichierdactylo \figureexterne \forceblocs \fraction \framed \framedtext \gardeblocs \grille \groupe \haut \hl \indentation \inframed \inhibemenuinteraction \ininner \inouter \installelangue \joursemaine \labeling \labeltexte \langue \langueprincipale \ligneh \lignenoire \ligneregleetexte \lignesnoires \listesymbole \loadsorts \loadsynonyms \logchamp \mar \margereglee \marquage \marquageversion \marquepage \mathematique \mediaeval \mois \montrecadre \montrechamps \montrecouleur \montredisposition \montreedition \montreenvironnementpolicecorps \montrefiguresexternes \montregrille \montregroupecouleur \montrejeusymboles \montremakeup \montrepalette \montrepolicecorps \montrereglages \montrestruts \motdroit \name \nextsection \nocap \nop \note \notepdp \numeros \numerotete \numerotetecourant \obtientmarquage \oriente \overbar \overbars \page \pagedouble \paragraph \part \pasplusdeblocs \pasplusdefichiers \periodes \pilechamp \placecoteacote \placeflottant \placeformule \placelegende \placelesunsaudessusdesautres \placeliste \placelisteinmbriquee \placelisteinmbriquee \placelistereference \placelistoffloats \placelistofsorts \placelistofsynonyms \placelogos \placemarquespages \placenotespdp \placenotespdplocales \placeregistre \placeregistre \placesousformule \placesurgrille \position \prendbuffer \programme \publication \qqpart \ran \raz \razmarquage \recommandation \ref \reference \referencepage \referencetexte \reflete \register \reglealignement \reglealineas \reglearrangement \reglearriereplan \reglearriereplans \reglebarreinteraction \reglebarresynchronisation \reglebloc \regleblocmarge \regleblocsection \regleboutons \reglebuffer \reglecapitales \reglechamp \reglechamps \regleclipping \reglecolonnes \reglecombinaisons \reglecommentaire \reglecompoetroite \reglecomposeenalinea \reglecouleur \reglecouleurs \regledactylo \regledansmarge \regledescriptions \regledisposition \regleecraninteraction \regleecrans \regleelements \regleencadre \regleentete \regleenumerations \regleenvironnementpolicecorps \regleepaisseurligne \regleespaceblanc \regleespacement \regleespacementinterligne \regleespacementinterligne \reglefiguresexternes \regleflottant \regleflottants \regleformulaires \regleformules \regleinf \regleinteraction \regleintitule \regleintitules \reglejeusymboles \reglelabeltexte \reglelangue \reglelegende \reglelignes \reglelignesnoires \reglelignesreglestexte \regleliste \reglelisteimbriquee \reglelistereference \reglemakeup \reglemargereglee \reglemarquage \reglemarquagehyphenation \reglemenuinteraction \reglenotepdp \reglenumeropage \reglenumerotation \reglenumerotationligne \reglenumerotationpage \reglenumerotationparagraphe \reglenumerotete \regleoriente \reglepalette \reglepapier \regleparagraphes \reglepdp \regleplacementopposition \reglepolicecorps \reglepositionnement \regleprofils \regleprogrammes \reglepublications \reglereferencage \regleregistre \regleremplitligne \regleremplitlignesreglees \reglesection \regleseparationflottant \reglesortie \reglesouslignage \reglesousnumeropage \reglestrut \reglesup \reglesynchronisation \reglesynonymes \reglesysteme \regletab \regletableaux \regletabulation \regletaillepapier \regletete \regletetes \regletexte \regletextesentete \regletextesinf \regletextespdp \regletextessup \regletextestexte \regletextetete \regletolerance \regletraitsfins \regletransitionspage \regletri \regletype \regleurl \regleversions \remplitchamp \remplitligne \remplitlignesreglees \remplittexte \reservefloat \resettextcontent \sansalinea \sansespace \sansespaceblanc \sanslignesenteteetpdp \sanslignessupetinf \sansliste \sansmarquage \sauteblocs \section \seeregister \selectionneblocs \selectionnepapier \selectionneversion \separeflottant \settext \setupframedtexts \setupitemgroup \setuplistalternative \sort \sousligne \souslignetout \startalignment \startarriereplan \startbuffer \startbuffer \startcitation \startcolumns \startcombination \startcommentaire \startcomposant \startcouleur \startdescription \startdocument \startenumeration \startenvironement \startfait \startfigure \startfloattext \startformula \startframedtext \startgroupe \starthiding \startitemgroup \startlegend \startligneregleetexte \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmargereglee \startmarginblock \startmenuinteraction \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startproduit \startprofile \startprojet \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttyping \startunpacked \startversion \stopalignment \stoparriereplan \stopbuffer \stopbuffer \stopcitation \stopcolumns \stopcombination \stopcommentaire \stopcomposant \stopcouleur \stopdescription \stopdocument \stopenumeration \stopenvironement \stopfait \stopfigure \stopfloattext \stopformula \stopframedtext \stopgroupe \stophiding \stopitemgroup \stoplegend \stopligneregleetexte \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmargereglee \stopmarginblock \stopmenuinteraction \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopproduit \stopprofile \stopprojet \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptyping \stopunpacked \stopversion \sub \subject \subsection \subsubject \subsubsection \subsubsubject \suggestion \suivantprofil \suivantversion \suivantversionprofil \surligne \surlignetout \sym \symbole \synchronise \synonym \tab \tapebuffer \tapepage \tete \tex \textemarge \textenotepdp \textetete \title \traduire \traiteblocs \traitepage \traitfin \traitsfins \typ \uneligne \usedirectory \utiliseURL \utiliseblocs \utilisecommandes \utilisedocumentexterne \utiliseencodage \utilisefichierexterne \utilisefichiersexternes \utilisefigureexterne \utilisemodule \utilisepsiteaudioexterne \utilisereferences \utilisespecialites \utilisesymboles \va \vaalaboite \vaenbas \version \vide \vl
\ No newline at end of file
+BBLMKeywordList \CAP \Cap \Caps \Caractere \Caracteres \Chiffresromains \JOURSEMAINE \MOIS \MOT \MOTS \Mot \Mots \a \adaptedisposition \ajustechamp \alaligne \alapage \aligneadroite \aligneagauche \aligneaumilieu \appendix \arriereplan \baha \barreinteraction \barresynchronisation \bas \bouton \boutonsinteraction \but \cacheblocs \cap \caractere \caracteres \champ \changepolicecorps \chapter \chem \chiffresromains \citation \citer \clip \clonechamp \colonne \commentaire \comparegroupecouleur \comparepalette \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregistre \composeenalinea \concernant \convertitnumero \copitchamp \corrigeespaceblanc \couleur \couleurgrise \coupledocument \coupledregister \couplemarquage \couplepapier \coupleregistre \crlf \dactylographier \dans \dansautremarge \dansdroite \dansgauche \dansmarge \date \datecourante \daterecommandation \de \decouplemarquage \definebodyfontDEF \definebodyfontREF \definedfont \definefontfeature \definefonthandling \defineframed \defineframedtext \definetypeface \definit \definitbloc \definitblocsection \definitbuffer \definitchamp \definitcompoalinea \definitconversion \definitcouleur \definitdactylo \definitdemarrestoppe \definitdescription \definitenumeration \definitenvironnementpolicecorps \definitetiquette \definitflottant \definitformatreference \definitgroupecouleur \definitliste \definitlisteimbriquee \definitlistereference \definitlogo \definitmakeup \definitmarquage \definitmenuinteraction \definitmenuinteraction \definitnotepdp \definitpalette \definitparagraphes \definitpilechamp \definitpolice \definitpolicecorps \definitprofil \definitprogramme \definitreference \definitregistre \definitrevetement \definitsection \definitsortie \definitsouschamp \definitsymbole \definitsymbolefigure \definitsynonymepolice \definitsynonymes \definittabulation \definittaillepapier \definittete \definittexte \definittrametableau \definittri \definittype \definitversion \definitvide \definitvide \demarreciter \deplacesurgrille \description \determinecaracteristiqueliste \determinenumerotete \echelle \ecran \ecritdansliste \ecritdanslistereference \ecritentreliste \ecritregistre \el \element \elements \emptylines \enumeration \espace \espaceblanc \espacesfixes \etiquettes \etire \fichierdactylo \figureexterne \forceblocs \fraction \framed \framedtext \gardeblocs \grille \groupe \haut \hl \indentation \inframed \inhibemenuinteraction \ininner \inouter \installelangue \joursemaine \labeling \labeltexte \langue \langueprincipale \ligneh \lignenoire \ligneregleetexte \lignesnoires \listesymbole \loadsorts \loadsynonyms \logchamp \mapfontsize \mar \margereglee \marquage \marquageversion \marquepage \mathematique \mediaeval \mois \montrecadre \montrechamps \montrecouleur \montredisposition \montreedition \montreenvironnementpolicecorps \montrefiguresexternes \montregrille \montregroupecouleur \montrejeusymboles \montremakeup \montrepalette \montrepolicecorps \montrereglages \montrestruts \motdroit \name \nextsection \nocap \nop \note \notepdp \numeros \numerotete \numerotetecourant \obtientmarquage \oriente \overbar \overbars \page \pagedouble \paragraph \part \pasplusdeblocs \pasplusdefichiers \periodes \pilechamp \placecoteacote \placeflottant \placeformule \placelegende \placelesunsaudessusdesautres \placeliste \placelisteinmbriquee \placelisteinmbriquee \placelistereference \placelistoffloats \placelistofsorts \placelistofsynonyms \placelogos \placemarquespages \placenotespdp \placenotespdplocales \placeregistre \placeregistre \placesousformule \placesurgrille \position \prendbuffer \programme \publication \qqpart \ran \raz \razmarquage \recommandation \ref \reference \referencepage \referencetexte \reflete \register \reglealignement \reglealineas \reglearrangement \reglearriereplan \reglearriereplans \reglebarreinteraction \reglebarresynchronisation \reglebloc \regleblocmarge \regleblocsection \regleboutons \reglebuffer \reglecapitales \reglechamp \reglechamps \regleclipping \reglecolonnes \reglecombinaisons \reglecommentaire \reglecompoetroite \reglecomposeenalinea \reglecouleur \reglecouleurs \regledactylo \regledansmarge \regledescriptions \regledisposition \regleecraninteraction \regleecrans \regleelements \regleencadre \regleentete \regleenumerations \regleenvironnementpolicecorps \regleepaisseurligne \regleespaceblanc \regleespacement \regleespacementinterligne \reglefiguresexternes \regleflottant \regleflottants \regleformulaires \regleformules \regleinf \regleinteraction \regleintitule \regleintitules \reglejeusymboles \reglelabeltexte \reglelangue \reglelegende \reglelignes \reglelignesnoires \reglelignesreglestexte \regleliste \reglelisteimbriquee \reglelistereference \reglemakeup \reglemargereglee \reglemarquage \reglemarquagehyphenation \reglemenuinteraction \reglenotepdp \reglenumeropage \reglenumerotation \reglenumerotationligne \reglenumerotationpage \reglenumerotationparagraphe \reglenumerotete \regleoriente \reglepalette \reglepapier \regleparagraphes \reglepdp \regleplacementopposition \reglepolicecorps \reglepositionnement \regleprofils \regleprogrammes \reglepublications \reglereferencage \regleregistre \regleremplitligne \regleremplitlignesreglees \reglesection \regleseparationflottant \reglesortie \reglesouslignage \reglesousnumeropage \reglestrut \reglesup \reglesynchronisation \reglesynonymes \reglesysteme \regletab \regletableaux \regletabulation \regletaillepapier \regletete \regletetes \regletexte \regletextesentete \regletextesinf \regletextespdp \regletextessup \regletextestexte \regletextetete \regletolerance \regletraitsfins \regletransitionspage \regletri \regletype \regleurl \regleversions \remplitchamp \remplitligne \remplitlignesreglees \remplittexte \reservefloat \resettextcontent \sansalinea \sansespace \sansespaceblanc \sanslignesenteteetpdp \sanslignessupetinf \sansliste \sansmarquage \sauteblocs \section \seeregister \selectionneblocs \selectionnepapier \selectionneversion \separeflottant \settext \setupfonthandling \setupfontsynonym \setupframedtexts \setupinterlinespace2 \setupitemgroup \setuplistalternative \sort \sousligne \souslignetout \startalignment \startarriereplan \startbuffer \startbuffer \startcitation \startcolumns \startcombination \startcommentaire \startcomposant \startcouleur \startdescription \startdocument \startenumeration \startenvironement \startfait \startfigure \startfloattext \startformula \startframedtext \startgroupe \starthiding \startitemgroup \startlegend \startligneregleetexte \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmargereglee \startmarginblock \startmenuinteraction \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startproduit \startprofile \startprojet \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttyping \startunpacked \startversion \stopalignment \stoparriereplan \stopbuffer \stopbuffer \stopcitation \stopcolumns \stopcombination \stopcommentaire \stopcomposant \stopcouleur \stopdescription \stopdocument \stopenumeration \stopenvironement \stopfait \stopfigure \stopfloattext \stopformula \stopframedtext \stopgroupe \stophiding \stopitemgroup \stoplegend \stopligneregleetexte \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmargereglee \stopmarginblock \stopmenuinteraction \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopproduit \stopprofile \stopprojet \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptyping \stopunpacked \stopversion \sub \subject \subsection \subsubject \subsubsection \subsubsubject \suggestion \suivantprofil \suivantversion \suivantversionprofil \surligne \surlignetout \sym \symbole \synchronise \synonym \tab \tapebuffer \tapepage \tete \tex \textemarge \textenotepdp \textetete \title \traduire \traiteblocs \traitepage \traitfin \traitsfins \typ \uneligne \usedirectory \usetypescript \usetypescriptfile \utiliseURL \utiliseblocs \utilisecommandes \utilisedocumentexterne \utiliseencodage \utilisefichierexterne \utilisefichiersexternes \utilisefigureexterne \utilisemodule \utilisepsiteaudioexterne \utilisereferences \utilisespecialites \utilisesymboles \va \vaalaboite \vaenbas \version \vide \vl
\ No newline at end of file
diff --git a/context/data/context-bbedit-it.xml b/context/data/context-bbedit-it.xml
index 74559a73a..38d626e2b 100644
--- a/context/data/context-bbedit-it.xml
+++ b/context/data/context-bbedit-it.xml
@@ -1 +1 @@
-BBLMKeywordList \CAP \Cap \Caps \GIORNOSETTIMANA \Lettera \Lettere \MESE \Numeriromani \PAROLA \PAROLE \Parola \Parole \accoppiacarta \accoppiadocumento \accoppiamarcatura \accoppiapagina \accoppiaregistro \adattacampo \adattalayout \al \allineacentro \allineadestra \allineasinistra \ap \apagina \appendix \barrainterazione \barrasincronizzazione \bastablocchi \bastafile \cambiaafontdeltesto \campi \camporiempimento \cap \capello \chapter \chim \circondato \citazione \clip \clonacampo \colonna \colore \coloregrigio \commento \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \confrontagruppocolori \confrontatavolozza \convertinumero \copiacampo \correggispaziobianco \coupledregister \crlf \da \daqualcheparte \data \datadioggi \datareferral \definisci \definisciambientefontdeltesto \definisciblocco \definiscibloccosezione \definiscibuffer \definiscicampo \definiscicapoversi \definiscicolore \definisciconversione \definiscidescrizione \definiscidimensionicarta \definiscielenco \definiscielencocombinato \definiscienumerazione \definiscietichetta \definiscifigurasimbolo \definiscifont \definiscifontdeltesto \definisciformatoriferimento \definiscigruppocolori \definisciincorniciato \definisciiniziatermina \definiscilistariferimenti \definiscilogo \definiscimakeup \definiscimarcatura \definiscimenuinterazione \definiscimenuinterazione \definiscimodellotabella \definiscioggettomobile \definisciordinamento \definiscioutput \definisciprofilo \definisciprogramma \definisciregistro \definiscirientro \definisciriferimento \definiscirigovuoto \definiscisezione \definiscisimbolo \definiscisinonimi \definiscisottocampo \definiscisovrapposizione \definiscistackcampi \definiscitabulato \definiscitavolozza \definiscitesta \definiscitesto \definiscitestoincorniciato \definiscitype \definiscityping \definisciversion \description \determinacarattersticheelenco \determinanumerotesta \disabilitamenuinterazione \el \elaborablocchi \elaborapagina \elementi \elemento \emptylines \enumeration \etichette \figuraesterna \fondo \forzablocchi \framedtext \frazione \giornosettimana \griglia \hl \impaccato \impostaallineamento \impostaambientefontdeltesto \impostaampiezzariga \impostabarrainterazione \impostabarrasincronizzazione \impostablocchimargine \impostablocco \impostabloccosezione \impostabuffer \impostacampi \impostacampo \impostacapoversi \impostacaption \impostacaptions \impostacima \impostaclippling \impostacolonne \impostacolore \impostacolori \impostacombinazioni \impostacommento \impostadefinizionenotepdp \impostadescrizioni \impostadimensionicarta \impostaelementi \impostaelenco \impostaelencocombinato \impostaenumerazioni \impostafigureesterne \impostafondo \impostafontdeltesto \impostaforms \impostaformule \impostaincorniciato \impostainmargine \impostainstestazione \impostainterazione \impostainterlinea \impostainterlinea \impostalayout \impostalegenda \impostalineemargine \impostalineenere \impostalineeriempimento \impostalineesottili \impostalineetesto \impostalingua \impostalistariferimenti \impostamaiuscole \impostamakeup \impostamarcatura \impostamenuinterazione \impostamenzione \impostanotepdp \impostanumerazione \impostanumerazionecapoversi \impostanumerazionepagina \impostanumerazionerighe \impostanumeropagina \impostanumerosottopagina \impostanumerotesta \impostaoggettimobili \impostaoggettomobile \impostaordinamento \impostaoutput \impostaparranging \impostapdp \impostapiustretto \impostaposizionamento \impostaposizionamentoopposti \impostaprofili \impostaprogrammi \impostapubblicazioni \impostapulsanti \impostaregistro \impostarientri \impostarientro \impostariferimento \impostarighe \impostarigheriempimento \impostarigovuoto \impostarotazione \impostaschermi \impostaschermointerazione \impostasegnosillabazione \impostasetsimboli \impostasezione \impostasfondi \impostasfondo \impostasincronizzazione \impostasinonimi \impostasistema \impostasottolinea \impostaspaziatura \impostaspaziobianco \impostaspezzamentooggettomobile \impostastrut \impostatab \impostatabelle \impostatabulato \impostatavolozza \impostatesta \impostateste \impostatesticima \impostatestifondo \impostatestiincorniciati \impostatestiintestazioni \impostatestipdp \impostatesto \impostatestoetichette \impostatestointestazioni \impostatestotesti \impostatolleranza \impostatransizionepagina \impostatype \impostatyping \impostaurl \impostaversioni \in \inaltromargine \incorniciato \indentation \indestra \ininner \inmargine \inouter \inriga \insinistra \installalingua \intorno \labeling \lettera \lettere \lineamargine \lineanera \lineasottile \lineatesto \lineenere \lineeriempimento \lineesottili \lingua \linguaprincipale \listsymbol \loadsorts \loadsynonyms \logcampi \mar \marcatura \marcaversione \matematica \mediaeval \menzione \mese \mettielenco \mettielencocombinato \mettielencocombinato \mettifiancoafianco \mettiformula \mettiingriglia \mettilegenda \mettiloghi \mettinotepdp \mettinotepdplocali \mettiregistro \mettiregistro \mettisegnalibro \mettisottoformula \mettiunosullaltro \mostraambientefontdeltesto \mostracampi \mostracolore \mostracornice \mostrafiguresterne \mostrafontdeltesto \mostragriglia \mostragruppocolori \mostraimpostazioni \mostralyout \mostramakeup \mostrasetsimboli \mostrastampa \mostrastruts \mostratavolozza \name \nascondiblocchi \nextsection \nienteelenco \nientelineecimafondo \nientelineintestazionepdp \nientemarcatura \nienterientro \nientespazio \nientespaziobianco \nocap \nop \nota \notapdp \numeri \numeriromani \numerotesta \numerotestacorrente \pagina \paragraph \paroladestra \part \ped \pedap \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \posizione \prendibuffer \prendimarcatura \programma \pubblicazione \pulsante \pulsantinterazione \punti \qualcheriga \ran \referral \register \reimposta \reimpostamarcatura \reservefloat \resettextcontent \rientro \rif \riferimento \riferimentopagina \riferimentotesto \riflessione \rigariempimento \rigovuoto \ruota \saltablocchi \sbarrati \sbarrato \scala \schermo \scrividentroelenco \scriviinelenco \scriviinlistariferimenti \scriviinregistro \section \seeregister \segnalibro \seguiprofilo \seguiversione \seguiversioneprofilo \selezionablocchi \selezionacarta \selezionaversione \separamarcatura \settext \setupitemgroup \setuplistalternative \setuppaper \sfondo \sim \simbolo \sincronizza \sopralinea \sopralinee \sort \sottolinea \sottolinee \spazifissi \spazio \spaziobianco \spezzaoggettomobile \spostaagriglia \stackcampi \startalignment \startambiente \startbuffer \startbuffer \startcitazione \startcolore \startcolumns \startcombination \startcommento \startcomponenet \startdescription \startdocument \startenumeration \startfatto \startfigure \startfloattext \startformula \startframedtext \starthiding \startimpaccato \startitemgroup \startlegend \startline \startlineamargine \startlineatesto \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startmenuinterattivo \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodotto \startprofile \startprogetto \startregister \startsfondo \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttyping \startunpacked \startversione \stirato \stopalignment \stopambiente \stopbuffer \stopbuffer \stopcitazione \stopcolore \stopcolumns \stopcombination \stopcommento \stopcomponenet \stopdescription \stopdocument \stopenumeration \stopfatto \stopfigure \stopfloattext \stopformula \stopframedtext \stophiding \stopimpaccato \stopitemgroup \stoplegend \stopline \stoplineamargine \stoplineatesto \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopmenuinterattivo \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodotto \stopprofile \stopprogetto \stopsfondo \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptyping \stopunpacked \stopversione \sub \subject \subsection \subsubject \subsubsection \subsubsubject \synonym \tab \testa \testoetichetta \testoinmargine \testoinstestazioni \testonotapdp \testoriempimento \tex \tieniblocchi \tipopagina \title \tooltip \traduci \typ \type \typebuffer \typefile \usaURL \usablocco \usacodifica \usacolonnasonoraesterna \usacomandi \usadocumentoesterno \usafiguraesterna \usafileesterni \usafileesterno \usamodulo \usariferimenti \usasimboli \usaspecialita \usedirectory \vaia \vaiabox \vaigiu \versione \vl
\ No newline at end of file
+BBLMKeywordList \CAP \Cap \Caps \GIORNOSETTIMANA \Lettera \Lettere \MESE \Numeriromani \PAROLA \PAROLE \Parola \Parole \accoppiacarta \accoppiadocumento \accoppiamarcatura \accoppiapagina \accoppiaregistro \adattacampo \adattalayout \al \allineacentro \allineadestra \allineasinistra \ap \apagina \appendix \barrainterazione \barrasincronizzazione \bastablocchi \bastafile \cambiaafontdeltesto \campi \camporiempimento \cap \capello \chapter \chim \circondato \citazione \clip \clonacampo \colonna \colore \coloregrigio \commento \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \confrontagruppocolori \confrontatavolozza \convertinumero \copiacampo \correggispaziobianco \coupledregister \crlf \da \daqualcheparte \data \datadioggi \datareferral \definebodyfontDEF \definebodyfontREF \definedfont \definefontfeature \definefonthandling \definetypeface \definisci \definisciambientefontdeltesto \definisciblocco \definiscibloccosezione \definiscibuffer \definiscicampo \definiscicapoversi \definiscicolore \definisciconversione \definiscidescrizione \definiscidimensionicarta \definiscielenco \definiscielencocombinato \definiscienumerazione \definiscietichetta \definiscifigurasimbolo \definiscifont \definiscifontdeltesto \definisciformatoriferimento \definiscigruppocolori \definisciincorniciato \definisciiniziatermina \definiscilistariferimenti \definiscilogo \definiscimakeup \definiscimarcatura \definiscimenuinterazione \definiscimenuinterazione \definiscimodellotabella \definiscioggettomobile \definisciordinamento \definiscioutput \definisciprofilo \definisciprogramma \definisciregistro \definiscirientro \definisciriferimento \definiscirigovuoto \definiscisezione \definiscisimbolo \definiscisinonimi \definiscisinonimofont \definiscisottocampo \definiscisovrapposizione \definiscistackcampi \definiscitabulato \definiscitavolozza \definiscitesta \definiscitesto \definiscitestoincorniciato \definiscitype \definiscityping \definisciversion \description \determinacarattersticheelenco \determinanumerotesta \disabilitamenuinterazione \el \elaborablocchi \elaborapagina \elementi \elemento \emptylines \enumeration \etichette \figuraesterna \fondo \forzablocchi \framedtext \frazione \giornosettimana \griglia \hl \impaccato \impostaallineamento \impostaambientefontdeltesto \impostaampiezzariga \impostabarrainterazione \impostabarrasincronizzazione \impostablocchimargine \impostablocco \impostabloccosezione \impostabuffer \impostacampi \impostacampo \impostacapoversi \impostacaption \impostacaptions \impostacima \impostaclippling \impostacolonne \impostacolore \impostacolori \impostacombinazioni \impostacommento \impostadefinizionenotepdp \impostadescrizioni \impostadimensionicarta \impostaelementi \impostaelenco \impostaelencocombinato \impostaenumerazioni \impostafigureesterne \impostafondo \impostafontdeltesto \impostaforms \impostaformule \impostaincorniciato \impostainmargine \impostainstestazione \impostainterazione \impostainterlinea \impostalayout \impostalegenda \impostalineemargine \impostalineenere \impostalineeriempimento \impostalineesottili \impostalineetesto \impostalingua \impostalistariferimenti \impostamaiuscole \impostamakeup \impostamarcatura \impostamenuinterazione \impostamenzione \impostanotepdp \impostanumerazione \impostanumerazionecapoversi \impostanumerazionepagina \impostanumerazionerighe \impostanumeropagina \impostanumerosottopagina \impostanumerotesta \impostaoggettimobili \impostaoggettomobile \impostaordinamento \impostaoutput \impostaparranging \impostapdp \impostapiustretto \impostaposizionamento \impostaposizionamentoopposti \impostaprofili \impostaprogrammi \impostapubblicazioni \impostapulsanti \impostaregistro \impostarientri \impostarientro \impostariferimento \impostarighe \impostarigheriempimento \impostarigovuoto \impostarotazione \impostaschermi \impostaschermointerazione \impostasegnosillabazione \impostasetsimboli \impostasezione \impostasfondi \impostasfondo \impostasincronizzazione \impostasinonimi \impostasistema \impostasottolinea \impostaspaziatura \impostaspaziobianco \impostaspezzamentooggettomobile \impostastrut \impostatab \impostatabelle \impostatabulato \impostatavolozza \impostatesta \impostateste \impostatesticima \impostatestifondo \impostatestiincorniciati \impostatestiintestazioni \impostatestipdp \impostatesto \impostatestoetichette \impostatestointestazioni \impostatestotesti \impostatolleranza \impostatransizionepagina \impostatype \impostatyping \impostaurl \impostaversioni \in \inaltromargine \incorniciato \indentation \indestra \ininner \inmargine \inouter \inriga \insinistra \installalingua \intorno \labeling \lettera \lettere \lineamargine \lineanera \lineasottile \lineatesto \lineenere \lineeriempimento \lineesottili \lingua \linguaprincipale \listsymbol \loadsorts \loadsynonyms \logcampi \mapfontsize \mar \marcatura \marcaversione \matematica \mediaeval \menzione \mese \mettielenco \mettielencocombinato \mettielencocombinato \mettifiancoafianco \mettiformula \mettiingriglia \mettilegenda \mettiloghi \mettinotepdp \mettinotepdplocali \mettiregistro \mettiregistro \mettisegnalibro \mettisottoformula \mettiunosullaltro \mostraambientefontdeltesto \mostracampi \mostracolore \mostracornice \mostrafiguresterne \mostrafontdeltesto \mostragriglia \mostragruppocolori \mostraimpostazioni \mostralyout \mostramakeup \mostrasetsimboli \mostrastampa \mostrastruts \mostratavolozza \name \nascondiblocchi \nextsection \nienteelenco \nientelineecimafondo \nientelineintestazionepdp \nientemarcatura \nienterientro \nientespazio \nientespaziobianco \nocap \nop \nota \notapdp \numeri \numeriromani \numerotesta \numerotestacorrente \pagina \paragraph \paroladestra \part \ped \pedap \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \posizione \prendibuffer \prendimarcatura \programma \pubblicazione \pulsante \pulsantinterazione \punti \qualcheriga \ran \referral \register \reimposta \reimpostamarcatura \reservefloat \resettextcontent \rientro \rif \riferimento \riferimentopagina \riferimentotesto \riflessione \rigariempimento \rigovuoto \ruota \saltablocchi \sbarrati \sbarrato \scala \schermo \scrividentroelenco \scriviinelenco \scriviinlistariferimenti \scriviinregistro \section \seeregister \segnalibro \seguiprofilo \seguiversione \seguiversioneprofilo \selezionablocchi \selezionacarta \selezionaversione \separamarcatura \settext \setupfonthandling \setupfontsynonym \setupinterlinespace2 \setupitemgroup \setuplistalternative \setuppaper \sfondo \sim \simbolo \sincronizza \sopralinea \sopralinee \sort \sottolinea \sottolinee \spazifissi \spazio \spaziobianco \spezzaoggettomobile \spostaagriglia \stackcampi \startalignment \startambiente \startbuffer \startbuffer \startcitazione \startcolore \startcolumns \startcombination \startcommento \startcomponenet \startdescription \startdocument \startenumeration \startfatto \startfigure \startfloattext \startformula \startframedtext \starthiding \startimpaccato \startitemgroup \startlegend \startline \startlineamargine \startlineatesto \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startmenuinterattivo \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodotto \startprofile \startprogetto \startregister \startsfondo \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttyping \startunpacked \startversione \stirato \stopalignment \stopambiente \stopbuffer \stopbuffer \stopcitazione \stopcolore \stopcolumns \stopcombination \stopcommento \stopcomponenet \stopdescription \stopdocument \stopenumeration \stopfatto \stopfigure \stopfloattext \stopformula \stopframedtext \stophiding \stopimpaccato \stopitemgroup \stoplegend \stopline \stoplineamargine \stoplineatesto \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopmenuinterattivo \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodotto \stopprofile \stopprogetto \stopsfondo \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptyping \stopunpacked \stopversione \sub \subject \subsection \subsubject \subsubsection \subsubsubject \synonym \tab \testa \testoetichetta \testoinmargine \testoinstestazioni \testonotapdp \testoriempimento \tex \tieniblocchi \tipopagina \title \tooltip \traduci \typ \type \typebuffer \typefile \usaURL \usablocco \usacodifica \usacolonnasonoraesterna \usacomandi \usadocumentoesterno \usafiguraesterna \usafileesterni \usafileesterno \usamodulo \usariferimenti \usasimboli \usaspecialita \usedirectory \usetypescript \usetypescriptfile \vaia \vaiabox \vaigiu \versione \vl
\ No newline at end of file
diff --git a/context/data/context-bbedit-nl.xml b/context/data/context-bbedit-nl.xml
index 68ca3a78f..9d1a36e16 100644
--- a/context/data/context-bbedit-nl.xml
+++ b/context/data/context-bbedit-nl.xml
@@ -1 +1 @@
-BBLMKeywordList \CAP \Cap \Caps \Letter \Letters \MAAND \Romeins \WEEKDAG \WOORD \WOORDEN \Woord \Woorden \about \achtergrond \appendix \bepaalkopnummer \bepaallijstkenmerken \blanko \blokje \blokjes \blokkeerinteractiemenu \bookmark \breuk \but \button \cap \chapter \chem \cijfers \citaat \citeer \clip \commentaar \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \converteernummer \copieerveld \corrigeerwitruimte \coupledregister \crlf \datum \definieer \definieeralineas \definieerbeeldmerk \definieerblanko \definieerblok \definieerbuffer \definieerconversie \definieerfiguursymbool \definieerfont \definieerinteractiemenu \definieerinteractiemenu \definieerkadertekst \definieerkleur \definieerkleurgroep \definieerkop \definieerkorps \definieerkorpsomgeving \definieerlijst \definieermarkering \definieeromlijnd \definieeropmaak \definieeroverlay \definieerpalet \definieerpapierformaat \definieerplaatsblok \definieerprofiel \definieerprogramma \definieerreferentie \definieerreferentieformaat \definieerreferentielijst \definieerregister \definieersamengesteldelijst \definieersectie \definieersectieblok \definieersorteren \definieerstartstop \definieersubveld \definieersymbool \definieersynoniemen \definieertabelvorm \definieertabulatie \definieertekst \definieertype \definieertypen \definieeruitvoer \definieerveld \definieerveldstapel \definieerversie \description \doordefinieren \doorlabelen \doornummeren \doorspringen \doorstreep \doorstrepen \dunnelijn \dunnelijnen \eenregel \enumeration \ergens \externfiguur \forceerblokken \framedtext \gebruikURL \gebruikblokken \gebruikcommandos \gebruikexterndocument \gebruikexternefile \gebruikexternefiles \gebruikexternfiguur \gebruikexterngeluidsfragment \gebruikmodule \gebruikreferenties \gebruikspecials \gebruiksymbolen \geenblokkenmeer \geenbovenenonderregels \geenfilesmeer \geenhoofdenvoetregels \geenlijst \geenmarkering \geenspatie \geenwitruimte \grijskleur \haalbuffer \haalmarkering \haarlijn \handhaafblokken \hl \hoofdtaal \hoog \huidigedatum \huidigekopnummer \in \inanderemarge \inbinnen \inbuiten \indentation \inlijnd \inlinker \inmarge \inrechter \inregel \inspringen \installeertaal \interactiebalk \interactiebuttons \invullijnen \invulregel \invultekst \invulveld \items \its \kantlijn \kenmerk \kenmerkdatum \kleur \kloonveld \kolom \kop \kopnummer \koppeldocument \koppelmarkering \koppelpagina \koppelpapier \koppelregister \koptekst \laag \labeling \labels \labeltekst \laho \legeregels \letter \letters \lijstsymbool \loadsorts \loadsynonyms \maand \mar \margetekst \markeer \markeerversie \mediaeval \naar \naarbox \name \nextsection \nietinspringen \nocap \noot \nop \omlaag \omlijnd \onderstreep \onderstrepen \ontkoppelmarkering \op \opelkaar \oppagina \overstreep \overstrepen \pagina \paginareferentie \paragraph \part \paslayoutaan \passeerblokken \passendveld \plaatsbeeldmerken \plaatsbookmarks \plaatsformule \plaatslegenda \plaatslijst \plaatslokalevoetnoten \plaatsnaastelkaar \plaatsonderelkaar \plaatsopgrid \plaatsplaatsblok \plaatsreferentielijst \plaatsregister \plaatsregister \plaatssamengesteldelijst \plaatssamengesteldelijst \plaatssubformule \plaatsvoetnoten \placelistoffloats \placelistofsorts \placelistofsynonyms \positioneer \programma \publicatie \punten \ran \ref \referentie \regellinks \regelmidden \regelrechts \register \registreervelden \reservefloat \reset \resetmarkering \resettextcontent \romeins \rooster \roteer \schaal \scherm \schrijfnaarlijst \schrijfnaarreferentielijst \schrijfnaarregister \schrijftussenlijst \section \seeregister \selecteerblokken \selecteerpapier \selecteerversie \setuplistalternative \som \soortpagina \sort \spatie \spiegel \splitsplaatsblok \startachtergrond \startalignment \startbuffer \startbuffer \startcitaat \startcolumns \startcombination \startcommentaar \startdescription \startdocument \startenumeration \startfigure \startfloattext \startformula \startframedtext \startgeg \starthiding \startinteractiemenu \startitemgroup \startkantlijn \startkleur \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startnamemakeup \startnarrower \startomgeving \startonderdeel \startopelkaar \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodukt \startprofile \startprojekt \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttekstlijn \starttyping \startunpacked \startversie \stelachtergrondenin \stelachtergrondin \stelalineasin \stelarrangerenin \stelblankoin \stelblokin \stelblokjesin \stelblokkopjein \stelblokkopjesin \stelbovenin \stelboventekstenin \stelbufferin \stelbuttonsin \stelciterenin \stelclipin \stelcombinatiesin \stelcommentaarin \steldoordefinierenin \steldoornummerenin \steldoorspringenin \steldunnelijnenin \stelexternefigurenin \stelformulesin \stelformulierenin \stelhoofdin \stelhoofdtekstenin \stelinmargein \stelinspringenin \stelinteractiebalkin \stelinteractiein \stelinteractiemenuin \stelinteractieschermin \stelinterliniein \stelinterliniein \stelinvullijnenin \stelinvulregelsin \stelitemgroepin \stelitemsin \stelkadertekstenin \stelkantlijnin \stelkapitalenin \stelkleurenin \stelkleurin \stelkolommenin \stelkopin \stelkopnummerin \stelkoppeltekenin \stelkoppenin \stelkoptekstin \stelkorpsin \stelkorpsomgevingin \stellabeltekstin \stellayoutin \stellegendain \stellijndiktein \stellijstin \stelmargeblokkenin \stelmarkeringin \stelnaastplaatsenin \stelnummerenin \stelomlijndin \stelonderin \stelonderstrepenin \stelondertekstenin \stelopmaakin \stelpaginanummerin \stelpaginanummeringin \stelpaginaovergangenin \stelpaletin \stelpapierformaatin \stelpapierin \stelparagraafnummerenin \stelplaatsblokin \stelplaatsblokkenin \stelplaatsbloksplitsenin \stelpositionerenin \stelprofielenin \stelprogrammasin \stelpublicatiesin \stelrastersin \stelreferentielijstin \stelrefererenin \stelregelnummerenin \stelregelsin \stelregisterin \stelroterenin \stelsamengesteldelijstin \stelsectieblokin \stelsectiein \stelsmallerin \stelsorterenin \stelspatieringin \stelstrutin \stelsubpaginanummerin \stelsymboolsetin \stelsynchronisatiebalkin \stelsynchronisatiein \stelsynoniemenin \stelsysteemin \steltaalin \steltabellenin \steltabin \steltabulatiein \steltekstin \steltekstinhoudin \steltekstlijnenin \stelteksttekstenin \steltolerantiein \steltypein \steltypenin \steluitlijnenin \steluitvoerin \stelurlin \stelveldenin \stelveldin \stelversiesin \stelvoetin \stelvoetnootdefinitiein \stelvoetnotenin \stelvoettekstenin \stelwitruimtein \stopachtergrond \stopalignment \stopbuffer \stopbuffer \stopcitaat \stopcolumns \stopcombination \stopcommentaar \stopdescription \stopdocument \stopenumeration \stopfigure \stopfloattext \stopformula \stopframedtext \stopgeg \stophiding \stopinteractiemenu \stopitemgroup \stopkantlijn \stopkleur \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopnamemakeup \stopnarrower \stopomgeving \stoponderdeel \stopopelkaar \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodukt \stopprofile \stopprojekt \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptekstlijn \stoptyping \stopunpacked \stopversie \sub \subject \subsection \subsubject \subsubsection \subsubsubject \suggestie \switchnaarkorps \sym \symbool \synchronisatiebalk \synchroniseer \synonym \taal \tab \tekstlijn \tekstreferentie \tex \title \toonexternefiguren \toongrid \tooninstellingen \toonkader \toonkleur \toonkleurgroep \toonkorps \toonkorpsomgeving \toonlayout \toonopmaak \toonpalet \toonprint \toonstruts \toonsymboolset \toonvelden \typ \type \typebuffer \typefile \uit \uitgerekt \usecodering \usedirectory \vastespaties \veld \veldstapel \verbergblokken \vergelijkkleurgroep \vergelijkpalet \verplaatsopgrid \versie \vertaal \verwerkblokken \verwerkpagina \vl \voetnoot \voetnoottekst \volgprofiel \volgprofielversie \volgversie \volledigregister \weekdag \wiskunde \witruimte \woordrechts
\ No newline at end of file
+BBLMKeywordList \CAP \Cap \Caps \Letter \Letters \MAAND \Romeins \WEEKDAG \WOORD \WOORDEN \Woord \Woorden \about \achtergrond \appendix \bepaalkopnummer \bepaallijstkenmerken \blanko \blokje \blokjes \blokkeerinteractiemenu \bookmark \breuk \but \button \cap \chapter \chem \cijfers \citaat \citeer \clip \commentaar \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \converteernummer \copieerveld \corrigeerwitruimte \coupledregister \crlf \datum \definebodyfontDEF \definebodyfontREF \definedfont \definefontfeature \definefonthandling \definetypeface \definieer \definieeralineas \definieerbeeldmerk \definieerblanko \definieerblok \definieerbuffer \definieerconversie \definieerfiguursymbool \definieerfont \definieerfontsynoniem \definieerinteractiemenu \definieerinteractiemenu \definieerkadertekst \definieerkleur \definieerkleurgroep \definieerkop \definieerkorps \definieerkorpsomgeving \definieerlijst \definieermarkering \definieeromlijnd \definieeropmaak \definieeroverlay \definieerpalet \definieerpapierformaat \definieerplaatsblok \definieerprofiel \definieerprogramma \definieerreferentie \definieerreferentieformaat \definieerreferentielijst \definieerregister \definieersamengesteldelijst \definieersectie \definieersectieblok \definieersorteren \definieerstartstop \definieersubveld \definieersymbool \definieersynoniemen \definieertabelvorm \definieertabulatie \definieertekst \definieertype \definieertypen \definieeruitvoer \definieerveld \definieerveldstapel \definieerversie \description \doordefinieren \doorlabelen \doornummeren \doorspringen \doorstreep \doorstrepen \dunnelijn \dunnelijnen \eenregel \enumeration \ergens \externfiguur \forceerblokken \framedtext \gebruikURL \gebruikblokken \gebruikcommandos \gebruikexterndocument \gebruikexternefile \gebruikexternefiles \gebruikexternfiguur \gebruikexterngeluidsfragment \gebruikmodule \gebruikreferenties \gebruikspecials \gebruiksymbolen \gebruiktypescript \gebruiktypescriptfile \geenblokkenmeer \geenbovenenonderregels \geenfilesmeer \geenhoofdenvoetregels \geenlijst \geenmarkering \geenspatie \geenwitruimte \grijskleur \haalbuffer \haalmarkering \haarlijn \handhaafblokken \hl \hoofdtaal \hoog \huidigedatum \huidigekopnummer \in \inanderemarge \inbinnen \inbuiten \indentation \inlijnd \inlinker \inmarge \inrechter \inregel \inspringen \installeertaal \interactiebalk \interactiebuttons \invullijnen \invulregel \invultekst \invulveld \items \its \kantlijn \kenmerk \kenmerkdatum \kleur \kloonveld \kolom \kop \kopnummer \koppeldocument \koppelmarkering \koppelpagina \koppelpapier \koppelregister \koptekst \laag \labeling \labels \labeltekst \laho \legeregels \letter \letters \lijstsymbool \loadsorts \loadsynonyms \maand \mapfontsize \mar \margetekst \markeer \markeerversie \mediaeval \naar \naarbox \name \nextsection \nietinspringen \nocap \noot \nop \omlaag \omlijnd \onderstreep \onderstrepen \ontkoppelmarkering \op \opelkaar \oppagina \overstreep \overstrepen \pagina \paginareferentie \paragraph \part \paslayoutaan \passeerblokken \passendveld \plaatsbeeldmerken \plaatsbookmarks \plaatsformule \plaatslegenda \plaatslijst \plaatslokalevoetnoten \plaatsnaastelkaar \plaatsonderelkaar \plaatsopgrid \plaatsplaatsblok \plaatsreferentielijst \plaatsregister \plaatsregister \plaatssamengesteldelijst \plaatssamengesteldelijst \plaatssubformule \plaatsvoetnoten \placelistoffloats \placelistofsorts \placelistofsynonyms \positioneer \programma \publicatie \punten \ran \ref \referentie \regellinks \regelmidden \regelrechts \register \registreervelden \reservefloat \reset \resetmarkering \resettextcontent \romeins \rooster \roteer \schaal \scherm \schrijfnaarlijst \schrijfnaarreferentielijst \schrijfnaarregister \schrijftussenlijst \section \seeregister \selecteerblokken \selecteerpapier \selecteerversie \setupfonthandling \setupfontsynonym \setupinterlinespace2 \setuplistalternative \som \soortpagina \sort \spatie \spiegel \splitsplaatsblok \startachtergrond \startalignment \startbuffer \startbuffer \startcitaat \startcolumns \startcombination \startcommentaar \startdescription \startdocument \startenumeration \startfigure \startfloattext \startformula \startframedtext \startgeg \starthiding \startinteractiemenu \startitemgroup \startkantlijn \startkleur \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startnamemakeup \startnarrower \startomgeving \startonderdeel \startopelkaar \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodukt \startprofile \startprojekt \startregister \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttekstlijn \starttyping \startunpacked \startversie \stelachtergrondenin \stelachtergrondin \stelalineasin \stelarrangerenin \stelblankoin \stelblokin \stelblokjesin \stelblokkopjein \stelblokkopjesin \stelbovenin \stelboventekstenin \stelbufferin \stelbuttonsin \stelciterenin \stelclipin \stelcombinatiesin \stelcommentaarin \steldoordefinierenin \steldoornummerenin \steldoorspringenin \steldunnelijnenin \stelexternefigurenin \stelformulesin \stelformulierenin \stelhoofdin \stelhoofdtekstenin \stelinmargein \stelinspringenin \stelinteractiebalkin \stelinteractiein \stelinteractiemenuin \stelinteractieschermin \stelinterliniein \stelinvullijnenin \stelinvulregelsin \stelitemgroepin \stelitemsin \stelkadertekstenin \stelkantlijnin \stelkapitalenin \stelkleurenin \stelkleurin \stelkolommenin \stelkopin \stelkopnummerin \stelkoppeltekenin \stelkoppenin \stelkoptekstin \stelkorpsin \stelkorpsomgevingin \stellabeltekstin \stellayoutin \stellegendain \stellijndiktein \stellijstin \stelmargeblokkenin \stelmarkeringin \stelnaastplaatsenin \stelnummerenin \stelomlijndin \stelonderin \stelonderstrepenin \stelondertekstenin \stelopmaakin \stelpaginanummerin \stelpaginanummeringin \stelpaginaovergangenin \stelpaletin \stelpapierformaatin \stelpapierin \stelparagraafnummerenin \stelplaatsblokin \stelplaatsblokkenin \stelplaatsbloksplitsenin \stelpositionerenin \stelprofielenin \stelprogrammasin \stelpublicatiesin \stelrastersin \stelreferentielijstin \stelrefererenin \stelregelnummerenin \stelregelsin \stelregisterin \stelroterenin \stelsamengesteldelijstin \stelsectieblokin \stelsectiein \stelsmallerin \stelsorterenin \stelspatieringin \stelstrutin \stelsubpaginanummerin \stelsymboolsetin \stelsynchronisatiebalkin \stelsynchronisatiein \stelsynoniemenin \stelsysteemin \steltaalin \steltabellenin \steltabin \steltabulatiein \steltekstin \steltekstinhoudin \steltekstlijnenin \stelteksttekstenin \steltolerantiein \steltypein \steltypenin \steluitlijnenin \steluitvoerin \stelurlin \stelveldenin \stelveldin \stelversiesin \stelvoetin \stelvoetnootdefinitiein \stelvoetnotenin \stelvoettekstenin \stelwitruimtein \stopachtergrond \stopalignment \stopbuffer \stopbuffer \stopcitaat \stopcolumns \stopcombination \stopcommentaar \stopdescription \stopdocument \stopenumeration \stopfigure \stopfloattext \stopformula \stopframedtext \stopgeg \stophiding \stopinteractiemenu \stopitemgroup \stopkantlijn \stopkleur \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopnamemakeup \stopnarrower \stopomgeving \stoponderdeel \stopopelkaar \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodukt \stopprofile \stopprojekt \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptekstlijn \stoptyping \stopunpacked \stopversie \sub \subject \subsection \subsubject \subsubsection \subsubsubject \suggestie \switchnaarkorps \sym \symbool \synchronisatiebalk \synchroniseer \synonym \taal \tab \tekstlijn \tekstreferentie \tex \title \toonexternefiguren \toongrid \tooninstellingen \toonkader \toonkleur \toonkleurgroep \toonkorps \toonkorpsomgeving \toonlayout \toonopmaak \toonpalet \toonprint \toonstruts \toonsymboolset \toonvelden \typ \type \typebuffer \typefile \uit \uitgerekt \usecodering \usedirectory \vastespaties \veld \veldstapel \verbergblokken \vergelijkkleurgroep \vergelijkpalet \verplaatsopgrid \versie \vertaal \verwerkblokken \verwerkpagina \vl \voetnoot \voetnoottekst \volgprofiel \volgprofielversie \volgversie \volledigregister \weekdag \wiskunde \witruimte \woordrechts
\ No newline at end of file
diff --git a/context/data/context-bbedit-ro.xml b/context/data/context-bbedit-ro.xml
index ebee13189..1ea0afbc7 100644
--- a/context/data/context-bbedit-ro.xml
+++ b/context/data/context-bbedit-ro.xml
@@ -1 +1 @@
-BBLMKeywordList \CAP \CUVANT \CUVINTE \Cap \Caps \Cuvant \Cuvinte \LUNA \Litera \Litere \Numereromane \ZIDINSAPTAMANA \adapteazaaspect \adubuffer \adumarcaje \afiseazaaspect \afiseazacampuri \afiseazaculoare \afiseazafiguriexterne \afiseazafonttext \afiseazagrid \afiseazagrupculoare \afiseazamakeup \afiseazamediufonttext \afiseazapaleta \afiseazarama \afiseazasetari \afiseazasetsimboluri \afiseazastruts \afiseazatiparire \aliniat \aliniatcentru \aliniatdreapta \aliniatstanga \appendix \ascundeblocuri \barainteractiune \barasincronizare \barasus \blanc \but \butoaneinteractiune \buton \camp \campumplere \cap \chapter \chem \citat \clip \cloneazacamp \coloana \comentariu \comparagrupculoare \comparapaleta \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \convertestenumar \copiazacamp \corecteazaspatiualb \coupledregister \crlf \culoare \culoaregri \cupleazadocument \cupleazamarcaje \cupleazaregistru \cuvantdreapta \data \datacurenta \datareferit \decupleazamarcaje \defineste \definestealiat \definesteantet \definesteblanc \definestebloc \definesteblocsectiune \definestebuffer \definestecamp \definesteconversie \definesteculoare \definestedescriere \definestedimensiunehartie \definesteenumerare \definesteeticheta \definestefloat \definestefont \definestefonttext \definesteformatreferinte \definestegrupculori \definesteinconjurare \definestelista \definestelistacombinata \definestelistareferinte \definestelogo \definestemakeup \definestemarcaje \definestemediulfonttext \definestemeniuinteractiune \definestemeniuinteractiune \definesteoutput \definesteoverlay \definestepaleta \definesteparagraf \definesteprofil \definesteprogram \definestereferinte \definesteregistru \definestesablontabel \definestesectiune \definestesimbol \definestesimbolfigura \definestesinonim \definestesortare \definestestartstop \definestestivacampuri \definestesubcamp \definestetabulatori \definestetext \definestetexteinconjurate \definestetextinconjurat \definestetyping \definesteversiune \definetype \description \despre \determinacaracteristicilelistei \determinanumartitlu \dezactiveazameniuinteractiune \din \dute \dutebox \ecran \el \element \element \emptylines \enumeration \etichete \faraaliniat \farafisiere \faraliniiantetsisubsol \faraliniisussijos \faralista \faramarcaje \faraspatiu \faraspatiualb \figuraexterna \firdepar \folosesteURL \folosestebloc \folosestecodificarea \folosestecomenzi \folosestedocumentextern \folosestefiguraexterna \folosestefisiereexterne \folosestefisierextern \folosestemodul \folosestemuzicaexterna \folosestereferinte \folosestesimboluri \folosestespeciale \footnotetext \forteazablocuri \fractie \framed \framedtext \fundal \gatablocuri \grid \hartiedubla \hl \impachetat \impartefloat \in \inalt \inaltamargine \indentation \indreapta \inframed \ininner \injos \inlinie \inouter \instalarelimba \instanga \intins \jos \jossus \la \labeling \lapagina \limba \limbaprincipala \liniemargine \linieneagra \liniepeste \liniesubtire \linieumplere \liniinegre \liniipeste \liniisubtiri \listsymbol \litera \litere \loadsorts \loadsynonyms \logcampuri \luna \mar \marcaje \marcheazaversiune \marginal \matematica \mediaeval \minicitat \mutapegrid \name \nextsection \nocap \nop \nota \notasubsol \numartitlu \numartitlucurent \numere \numereromane \olinie \pagina \paginadubla \paragraph \part \pastreazablocuri \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \plaseazapegrid \plaseazasemnecarte \potrivestecamp \pozitie \proceseazabloc \proceseazapagina \program \publicatie \puncte \punedeasuprafiecareia \punefatainfata \puneformula \punelegenda \punelista \punelistacombinata \punelistacombinata \punelogouri \punenotesubsol \punenotesubsollocale \puneregistru \puneregistru \punesubformula \ran \ref \referinta \referintapagina \referintatext \referit \reflexie \register \reservefloat \reset \reseteazamarcaje \resettextcontent \riglatext \rigleumplere \roteste \saripesteblocuri \scala \scriebuffer \scrieinlista \scrieinlistareferinte \scrieinregistru \scrieintreliste \section \seeregister \selecteazablocuri \selecteazahartie \selecteazaversiune \semncarte \setarebarasincronizare \setarelimba \setareoutput \setarepozitie \setaresincronizare \seteazaaliniat \seteazaaliniate \seteazaalinierea \seteazaantet \seteazaaranjareapag \seteazaaspect \seteazabarainteractiune \seteazablanc \seteazabloc \seteazablocsectiune \seteazablocurimarginale \seteazabuffer \seteazabutoane \seteazacamp \seteazacampuri \seteazaclipping \seteazacoloane \seteazacombinari \seteazacomentariu \seteazaculoare \seteazaculori \seteazadefinireanotasubsol \seteazadescriere \seteazadimensiunihartie \seteazaecrane \seteazaecraninteractiune \seteazaelemente \seteazaenumerare \seteazafiguriexterne \seteazafloat \seteazafloats \seteazafonttext \seteazaformulare \seteazaformule \seteazafundal \seteazafundaluri \seteazagrosimelinie \seteazaimpartireafloat \seteazainconjurat \seteazaingust \seteazainteractiunea \seteazajos \seteazalegenda \seteazalegenda \seteazalegendele \seteazaliniesilabe \seteazaliniesubtire \seteazalinii \seteazaliniimargine \seteazaliniinegre \seteazaliniiumplere \seteazalista \seteazalistacombinata \seteazalistareferinte \seteazamajuscule \seteazamakeup \seteazamarcaje \seteazamarginal \seteazamediulfonttext \seteazameniuinteractiune \seteazaminicitat \seteazanotasubsol \seteazanumarpagina \seteazanumarsubpagina \seteazanumartitlu \seteazanumerotare \seteazanumerotarelinii \seteazanumerotarepagina \seteazanumerotareparagrafe \seteazapaleta \seteazaparagrafe \seteazaplasareaopozita \seteazaprofile \seteazaprograme \seteazapublicatii \seteazareferinte \seteazaregistru \seteazarigletext \seteazarigleumplere \seteazarotare \seteazasectiune \seteazasimbol \seteazasinonime \seteazasistem \seteazasortare \seteazaspatiu \seteazaspatiualb \seteazaspatiuinterliniar \seteazaspatiuinterliniar \seteazastrut \seteazasublinie \seteazasubsol \seteazasus \seteazatab \seteazatabele \seteazatabulatori \seteazatext \seteazatexteantet \seteazatextejos \seteazatextesubsol \seteazatextesus \seteazatextetext \seteazatexteticheta \seteazatexttitlu \seteazatitlu \seteazatitluri \seteazatoleranta \seteazatranzitiepagina \seteazatype \seteazatyping \seteazaurl \seteazaversiuni \settextcontent \setupitemgroup \setuplistalternative \setuppaper \sim \simbol \sincronizeaza \sort \spatiifixate \spatiu \spatiualb \startalignment \startbuffer \startbuffer \startcitat \startcolumns \startcombination \startcomentariu \startcomponenta \startculoare \startdescription \startdocument \startenumeration \startfact \startfigure \startfloattext \startformula \startframedtext \startfundal \starthiding \startimpachetat \startitemgroup \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startliniemargine \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startmediu \startmeniuinteractiune \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodus \startprofile \startproiect \startregister \startriglatext \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttyping \startunpacked \startversiune \stivacampuri \stopalignment \stopbuffer \stopbuffer \stopcitat \stopcolumns \stopcombination \stopcomentariu \stopcomponenta \stopculoare \stopdescription \stopdocument \stopenumeration \stopfact \stopfigure \stopfloattext \stopformula \stopframedtext \stopfundal \stophiding \stopimpachetat \stopitemgroup \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stopliniemargine \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopmediu \stopmeniuinteractiune \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodus \stopprofile \stopproiect \stopriglatext \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptyping \stopunpacked \stopversiune \sub \subject \sublinie \sublinii \subsection \subsubject \subsubsection \subsubsubject \supralinie \synonym \tab \tex \texteticheta \textmarginal \texttitlu \textumplere \tippagina \title \titlu \tooltip \traduce \trecilafonttext \typ \type \typefile \undeva \urmeazaprofil \urmeazaversiune \urmeazaversiuneprofil \usedirectory \versiune \vl \zidinsaptamana
\ No newline at end of file
+BBLMKeywordList \CAP \CUVANT \CUVINTE \Cap \Caps \Cuvant \Cuvinte \LUNA \Litera \Litere \Numereromane \ZIDINSAPTAMANA \adapteazaaspect \adubuffer \adumarcaje \afiseazaaspect \afiseazacampuri \afiseazaculoare \afiseazafiguriexterne \afiseazafonttext \afiseazagrid \afiseazagrupculoare \afiseazamakeup \afiseazamediufonttext \afiseazapaleta \afiseazarama \afiseazasetari \afiseazasetsimboluri \afiseazastruts \afiseazatiparire \aliniat \aliniatcentru \aliniatdreapta \aliniatstanga \appendix \ascundeblocuri \barainteractiune \barasincronizare \barasus \blanc \but \butoaneinteractiune \buton \camp \campumplere \cap \chapter \chem \citat \clip \cloneazacamp \coloana \comentariu \comparagrupculoare \comparapaleta \completecombinedlist \completelistoffloats \completelistofsorts \completelistofsynonyms \completeregister \convertestenumar \copiazacamp \corecteazaspatiualb \coupledregister \crlf \culoare \culoaregri \cupleazadocument \cupleazamarcaje \cupleazaregistru \cuvantdreapta \data \datacurenta \datareferit \decupleazamarcaje \definebodyfontDEF \definebodyfontREF \definedfont \definefontfeature \definefonthandling \defineste \definestealiat \definesteantet \definesteblanc \definestebloc \definesteblocsectiune \definestebuffer \definestecamp \definesteconversie \definesteculoare \definestedescriere \definestedimensiunehartie \definesteenumerare \definesteeticheta \definestefloat \definestefont \definestefonttext \definesteformatreferinte \definestegrupculori \definesteinconjurare \definestelista \definestelistacombinata \definestelistareferinte \definestelogo \definestemakeup \definestemarcaje \definestemediulfonttext \definestemeniuinteractiune \definestemeniuinteractiune \definesteoutput \definesteoverlay \definestepaleta \definesteparagraf \definesteprofil \definesteprogram \definestereferinte \definesteregistru \definestesablontabel \definestesectiune \definestesimbol \definestesimbolfigura \definestesinonim \definestesinonimfont \definestesortare \definestestartstop \definestestivacampuri \definestesubcamp \definestetabulatori \definestetext \definestetexteinconjurate \definestetextinconjurat \definestetyping \definesteversiune \definetype \definetypeface \description \despre \determinacaracteristicilelistei \determinanumartitlu \dezactiveazameniuinteractiune \din \dute \dutebox \ecran \el \element \element \emptylines \enumeration \etichete \faraaliniat \farafisiere \faraliniiantetsisubsol \faraliniisussijos \faralista \faramarcaje \faraspatiu \faraspatiualb \figuraexterna \firdepar \folosesteURL \folosestebloc \folosestecodificarea \folosestecomenzi \folosestedocumentextern \folosestefiguraexterna \folosestefisiereexterne \folosestefisierextern \folosestemodul \folosestemuzicaexterna \folosestereferinte \folosestesimboluri \folosestespeciale \footnotetext \forteazablocuri \fractie \framed \framedtext \fundal \gatablocuri \grid \hartiedubla \hl \impachetat \impartefloat \in \inalt \inaltamargine \indentation \indreapta \inframed \ininner \injos \inlinie \inouter \instalarelimba \instanga \intins \jos \jossus \la \labeling \lapagina \limba \limbaprincipala \liniemargine \linieneagra \liniepeste \liniesubtire \linieumplere \liniinegre \liniipeste \liniisubtiri \listsymbol \litera \litere \loadsorts \loadsynonyms \logcampuri \luna \mapfontsize \mar \marcaje \marcheazaversiune \marginal \matematica \mediaeval \minicitat \mutapegrid \name \nextsection \nocap \nop \nota \notasubsol \numartitlu \numartitlucurent \numere \numereromane \olinie \pagina \paginadubla \paragraph \part \pastreazablocuri \placefloat \placelistoffloats \placelistofsorts \placelistofsynonyms \placereferencelist \plaseazapegrid \plaseazasemnecarte \potrivestecamp \pozitie \proceseazabloc \proceseazapagina \program \publicatie \puncte \punedeasuprafiecareia \punefatainfata \puneformula \punelegenda \punelista \punelistacombinata \punelistacombinata \punelogouri \punenotesubsol \punenotesubsollocale \puneregistru \puneregistru \punesubformula \ran \ref \referinta \referintapagina \referintatext \referit \reflexie \register \reservefloat \reset \reseteazamarcaje \resettextcontent \riglatext \rigleumplere \roteste \saripesteblocuri \scala \scriebuffer \scrieinlista \scrieinlistareferinte \scrieinregistru \scrieintreliste \section \seeregister \selecteazablocuri \selecteazahartie \selecteazaversiune \semncarte \setarebarasincronizare \setarelimba \setareoutput \setarepozitie \setaresincronizare \seteazaaliniat \seteazaaliniate \seteazaalinierea \seteazaantet \seteazaaranjareapag \seteazaaspect \seteazabarainteractiune \seteazablanc \seteazabloc \seteazablocsectiune \seteazablocurimarginale \seteazabuffer \seteazabutoane \seteazacamp \seteazacampuri \seteazaclipping \seteazacoloane \seteazacombinari \seteazacomentariu \seteazaculoare \seteazaculori \seteazadefinireanotasubsol \seteazadescriere \seteazadimensiunihartie \seteazaecrane \seteazaecraninteractiune \seteazaelemente \seteazaenumerare \seteazafiguriexterne \seteazafloat \seteazafloats \seteazafonttext \seteazaformulare \seteazaformule \seteazafundal \seteazafundaluri \seteazagrosimelinie \seteazaimpartireafloat \seteazainconjurat \seteazaingust \seteazainteractiunea \seteazajos \seteazalegenda \seteazalegenda \seteazalegendele \seteazaliniesilabe \seteazaliniesubtire \seteazalinii \seteazaliniimargine \seteazaliniinegre \seteazaliniiumplere \seteazalista \seteazalistacombinata \seteazalistareferinte \seteazamajuscule \seteazamakeup \seteazamarcaje \seteazamarginal \seteazamediulfonttext \seteazameniuinteractiune \seteazaminicitat \seteazanotasubsol \seteazanumarpagina \seteazanumarsubpagina \seteazanumartitlu \seteazanumerotare \seteazanumerotarelinii \seteazanumerotarepagina \seteazanumerotareparagrafe \seteazapaleta \seteazaparagrafe \seteazaplasareaopozita \seteazaprofile \seteazaprograme \seteazapublicatii \seteazareferinte \seteazaregistru \seteazarigletext \seteazarigleumplere \seteazarotare \seteazasectiune \seteazasimbol \seteazasinonime \seteazasistem \seteazasortare \seteazaspatiu \seteazaspatiualb \seteazaspatiuinterliniar \seteazastrut \seteazasublinie \seteazasubsol \seteazasus \seteazatab \seteazatabele \seteazatabulatori \seteazatext \seteazatexteantet \seteazatextejos \seteazatextesubsol \seteazatextesus \seteazatextetext \seteazatexteticheta \seteazatexttitlu \seteazatitlu \seteazatitluri \seteazatoleranta \seteazatranzitiepagina \seteazatype \seteazatyping \seteazaurl \seteazaversiuni \settextcontent \setupfonthandling \setupfontsynonym \setupinterlinespace2 \setupitemgroup \setuplistalternative \setuppaper \sim \simbol \sincronizeaza \sort \spatiifixate \spatiu \spatiualb \startalignment \startbuffer \startbuffer \startcitat \startcolumns \startcombination \startcomentariu \startcomponenta \startculoare \startdescription \startdocument \startenumeration \startfact \startfigure \startfloattext \startformula \startframedtext \startfundal \starthiding \startimpachetat \startitemgroup \startlegend \startline \startlinecorrection \startlinenumbering \startlines \startliniemargine \startlocal \startlocalenvironment \startlocalfootnotes \startmakeup \startmarginblock \startmediu \startmeniuinteractiune \startnamemakeup \startnarrower \startopposite \startoverlay \startoverview \startparagraph \startpositioning \startpostponing \startprodus \startprofile \startproiect \startregister \startriglatext \startsymbolset \startsynchronization \starttable \starttables \starttabulate \starttyping \startunpacked \startversiune \stivacampuri \stopalignment \stopbuffer \stopbuffer \stopcitat \stopcolumns \stopcombination \stopcomentariu \stopcomponenta \stopculoare \stopdescription \stopdocument \stopenumeration \stopfact \stopfigure \stopfloattext \stopformula \stopframedtext \stopfundal \stophiding \stopimpachetat \stopitemgroup \stoplegend \stopline \stoplinecorrection \stoplinenumbering \stoplines \stopliniemargine \stoplocal \stoplocalenvironment \stoplocalfootnotes \stopmakeup \stopmarginblock \stopmediu \stopmeniuinteractiune \stopnamemakeup \stopnarrower \stopopposite \stopoverlay \stopoverview \stopparagraph \stoppositioning \stoppostponing \stopprodus \stopprofile \stopproiect \stopriglatext \stopsymbolset \stopsynchronization \stoptable \stoptables \stoptabulate \stoptyping \stopunpacked \stopversiune \sub \subject \sublinie \sublinii \subsection \subsubject \subsubsection \subsubsubject \supralinie \synonym \tab \tex \texteticheta \textmarginal \texttitlu \textumplere \tippagina \title \titlu \tooltip \traduce \trecilafonttext \typ \type \typefile \undeva \urmeazaprofil \urmeazaversiune \urmeazaversiuneprofil \usedirectory \usetypescript \usetypescriptfile \versiune \vl \zidinsaptamana
\ No newline at end of file
diff --git a/context/data/context-jedit-cs.xml b/context/data/context-jedit-cs.xml
index 724485292..0ef3aede3 100644
--- a/context/data/context-jedit-cs.xml
+++ b/context/data/context-jedit-cs.xml
@@ -1,2 +1,2 @@
- CAP Cap Caps MESIC Rimskecislice SLOVA SLOVO Slova Slovo VSEDNIDEN Znak Znaky aktualnicislonadpisu aktualnidatum appendix barva bilemisto bublinkovanapoveda bypassblocks cap cernalinka cernelinky chapter chem cisla cislonadpisu citace citovat completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum definetype definuj definujbarvu definujblok definujbloksekce definujbuffer definujfont definujformatodkazu definujinterakcnimenu definujinterakcnimenu definujkombinovanyseznam definujkonverzi definujlogo definujnadpis definujobrazeksymbol definujodkaz definujodsazovani definujodstavce definujopis definujoramovani definujoramovanytext definujpaletu definujplvouciobjekt definujpodpole definujpole definujpopis definujpopisek definujprekryv definujpreskok definujprofil definujprogram definujprostredizakladnihofontu definujrejstrik definujsablonutabulky definujsekci definujseznam definujseznamodkazu definujskupinubarev definujstartstop definujsymbol definujsynonyma definujtabelaci definujtext definujtrideni definujupravu definujvelikostpapiru definujverzi definujvycet definujvystup definujzakladnifont definujzasobnikpoli definujznaceni description dodrzujprofil dodrzujverzi dodrzujverziprofilu dvoustrannypapir emptylines enumeration externiobraz footnotetext forceblocks framedtext hl hlavnijazyk indentation ininner inouter instalacejazyka interakcnilista interakcnitlacitka jazyk jdidolu jdina jdinabox klonujpole komentar konvertujcislo kopirujpole korekcebilehomista labeling listsymbol loadsorts loadsynonyms marginalnilinka marginalnitext matematika mediaeval meritko mesic mezera mrizka nadpis nadruhyokraj nadtrzeni nadtrzeno name naokraj nastavbarvu nastavbarvy nastavbilamista nastavblok nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu nastavcislostrany nastavcislovani nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran nastavcitaci nastavdefinicipoznamekpodcarou nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty nastavexterniobrazy nastavhorejsek nastavhornitexty nastavinterakci nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk nastavkapitalky nastavkombinovanyseznam nastavkomentar nastavlegendu nastavmarginalie nastavmarginalniblok nastavmarginalnilinky nastavmeziradkovoumezeru nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsazeni nastavodsazovani nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany nastavpodtrzeni nastavpole nastavpolozky nastavpopisek nastavpopisky nastavpopisy nastavpozadi nastavpozadi nastavpoznamkypodcarou nastavprechodstrany nastavpreskok nastavprofily nastavprogramy nastavprostredizakladnihofontu nastavpublikace nastavradkovani nastavradky nastavrastr nastavrejstrik nastavrovnice nastavsadusymbolu nastavsekci nastavseznam nastavseznamodkazu nastavsirkucary nastavsloupce nastavspodek nastavspojeni nastavsynchronizaci nastavsynchronizacnilistu nastavsynonyma nastavsystem nastavtab nastavtabelaci nastavtabulky nastavtenkelinky nastavtext nastavtexthlavicky nastavtextovelinky nastavtextpopisku nastavtexttexty nastavtextyupati nastavtextyzahlavi nastavtlacitka nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku nastavumistovani nastavupati nastavupravu nastavurl nastavusporadani nastavvelikostpapiru nastavverze nastavvsechnapole nastavvycty nastavvyplnovelinky nastavvyplnoveradky nastavvystup nastavvzhled nastavzahlavi nastavzakladnifont nastavzarovnani nastavznaceni nastavzuzeni nastrane nejakyradek nekde nextsection nivy nizky nocap nop obrazovka odkaz odkaz odkaznadatum odkaznastranu odkaznatext odsazovani okr opis opissoubor oramovani oref orez otocit oznacverzi paragraph parovastrana part pis placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist podtrzeni podtrzeno pol pole polozka polozky popisky porovnejpaletu porovnejskupinubarev pozadi pozice poznamka poznamkapodcarou pref prelozit premistinamrizku prepninazakladnifont preskoc preskrtnuti preskrtnuto prizpusobivepole prizpusobvzhled program propojeneznaceni propojenydokument propojenyrejstrik publikace ran ref register reservefloat reset resettextcontent resetznaceni rimskecislice rozdelplvouciobjekt rozpojeneznaceni roztazene schovejbloky section sedabarva seeregister settextcontent setupforms setupitemgroup setuplistalternative setuppaper setupstrut sloupec slovovpravo sort spodek stanovcharakteristickuseznamu stanovcislonadpisu startalignment startbarva startbuffer startbuffer startcitace startcolumns startcombination startdescription startdocument startenumeration startfakt startfigure startfloattext startformula startframedtext starthiding startinteraktivnimenu startitemgroup startkomentar startkomponenta startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginalnilinka startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startpozadi startprodukt startprofile startprojekt startprostredi startregister startsymbolset startsynchronization starttable starttables starttabulate starttextovalinka starttyping startunpacked startverze startzhustene stopalignment stopbarva stopbuffer stopbuffer stopcitace stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfakt stopfigure stopfloattext stopformula stopframedtext stophiding stopinteraktivnimenu stopitemgroup stopkomentar stopkomponenta stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginalnilinka stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stoppozadi stopprodukt stopprofile stopprojekt stopprostredi stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextovalinka stoptyping stopunpacked stopverze stopzhustene strana sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronizacnilista synchronizovat synonym tab tecky tenkalinka tenkelinky tex texthlavicky textovalinka textpopisku title tlacitko tref tvrdemezery typebuffer typstrany ukazbarvu ukazexterniobrazy ukazmrizku ukaznastaveni ukazpaletu ukazpodpery ukazpole ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk ukazvzhled ukazzakladnifont umistikombinovanyseznam umistikombinovanyseznam umistilegendu umistiloga umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici umistipoznamkypodcarou umistirejstrik umistirejstrik umistirovnici umistiseznam umistivedlesebe umistizalozky usedirectory uzijURL uzijbloky uzijexternidokument uzijexterniobraz uzijexternisoubor uzijexternisoubory uzijexternizvuk uzijkodovani uzijmodul uzijodkazy uzijprikazy uzijspeciality uzijsymbol verze vl vlasovalinka vlevo vpravo vradku vsedniden vyberbloky vyberpapir vyberverzi vyplnenytext vyplnovelinky vyplnovepole vyplnovyradek vysoky zablokujinterakcnimenu zachovejbloky zadnamezera zadnebilemisto zadnedalsibloky zadnedalsisoubory zadnehorniadolniradky zadneodsazovani zadnezahlaviaupati zadneznaceni zadnyseznam zalozka zapisdorejstriku zapisdoseznamu zapisdoseznamuodkazu zapismeziseznam zaramovani zarovnanonastred zarovnanovlevo zarovnanovpravo zasobnikpoli zaznamovepole zhustene ziskejbuffer ziskejznaceni zlomek znaceni znak znaky zpracujbloky zpracujstranu zrcadlit zref
\ No newline at end of file
+ CAP Cap Caps MESIC Rimskecislice SLOVA SLOVO Slova Slovo VSEDNIDEN Znak Znaky aktualnicislonadpisu aktualnidatum appendix barva bilemisto bublinkovanapoveda bypassblocks cap cernalinka cernelinky chapter chem cisla cislonadpisu citace citovat completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetype definetypeface definuj definujbarvu definujblok definujbloksekce definujbuffer definujfont definujformatodkazu definujinterakcnimenu definujinterakcnimenu definujkombinovanyseznam definujkonverzi definujlogo definujnadpis definujobrazeksymbol definujodkaz definujodsazovani definujodstavce definujopis definujoramovani definujoramovanytext definujpaletu definujplvouciobjekt definujpodpole definujpole definujpopis definujpopisek definujprekryv definujpreskok definujprofil definujprogram definujprostredizakladnihofontu definujrejstrik definujsablonutabulky definujsekci definujseznam definujseznamodkazu definujskupinubarev definujstartstop definujsymbol definujsynonumumfontu definujsynonyma definujtabelaci definujtext definujtrideni definujupravu definujvelikostpapiru definujverzi definujvycet definujvystup definujzakladnifont definujzasobnikpoli definujznaceni description dodrzujprofil dodrzujverzi dodrzujverziprofilu dvoustrannypapir emptylines enumeration externiobraz footnotetext forceblocks framedtext hl hlavnijazyk indentation ininner inouter instalacejazyka interakcnilista interakcnitlacitka jazyk jdidolu jdina jdinabox klonujpole komentar konvertujcislo kopirujpole korekcebilehomista labeling listsymbol loadsorts loadsynonyms mapfontsize marginalnilinka marginalnitext matematika mediaeval meritko mesic mezera mrizka nadpis nadruhyokraj nadtrzeni nadtrzeno name naokraj nastavbarvu nastavbarvy nastavbilamista nastavblok nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu nastavcislostrany nastavcislovani nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran nastavcitaci nastavdefinicipoznamekpodcarou nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty nastavexterniobrazy nastavhorejsek nastavhornitexty nastavinterakci nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk nastavkapitalky nastavkombinovanyseznam nastavkomentar nastavlegendu nastavmarginalie nastavmarginalniblok nastavmarginalnilinky nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsazeni nastavodsazovani nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany nastavpodtrzeni nastavpole nastavpolozky nastavpopisek nastavpopisky nastavpopisy nastavpozadi nastavpozadi nastavpoznamkypodcarou nastavprechodstrany nastavpreskok nastavprofily nastavprogramy nastavprostredizakladnihofontu nastavpublikace nastavradkovani nastavradky nastavrastr nastavrejstrik nastavrovnice nastavsadusymbolu nastavsekci nastavseznam nastavseznamodkazu nastavsirkucary nastavsloupce nastavspodek nastavspojeni nastavsynchronizaci nastavsynchronizacnilistu nastavsynonyma nastavsystem nastavtab nastavtabelaci nastavtabulky nastavtenkelinky nastavtext nastavtexthlavicky nastavtextovelinky nastavtextpopisku nastavtexttexty nastavtextyupati nastavtextyzahlavi nastavtlacitka nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku nastavumistovani nastavupati nastavupravu nastavurl nastavusporadani nastavvelikostpapiru nastavverze nastavvsechnapole nastavvycty nastavvyplnovelinky nastavvyplnoveradky nastavvystup nastavvzhled nastavzahlavi nastavzakladnifont nastavzarovnani nastavznaceni nastavzuzeni nastrane nejakyradek nekde nextsection nivy nizky nocap nop obrazovka odkaz odkaz odkaznadatum odkaznastranu odkaznatext odsazovani okr opis opissoubor oramovani oref orez otocit oznacverzi paragraph parovastrana part pis placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist podtrzeni podtrzeno pol pole polozka polozky popisky porovnejpaletu porovnejskupinubarev pozadi pozice poznamka poznamkapodcarou pref prelozit premistinamrizku prepninazakladnifont preskoc preskrtnuti preskrtnuto prizpusobivepole prizpusobvzhled program propojeneznaceni propojenydokument propojenyrejstrik publikace ran ref register reservefloat reset resettextcontent resetznaceni rimskecislice rozdelplvouciobjekt rozpojeneznaceni roztazene schovejbloky section sedabarva seeregister settextcontent setupfonthandling setupfontsynonym setupforms setupinterlinespace2 setupitemgroup setuplistalternative setuppaper setupstrut sloupec slovovpravo sort spodek stanovcharakteristickuseznamu stanovcislonadpisu startalignment startbarva startbuffer startbuffer startcitace startcolumns startcombination startdescription startdocument startenumeration startfakt startfigure startfloattext startformula startframedtext starthiding startinteraktivnimenu startitemgroup startkomentar startkomponenta startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginalnilinka startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startpozadi startprodukt startprofile startprojekt startprostredi startregister startsymbolset startsynchronization starttable starttables starttabulate starttextovalinka starttyping startunpacked startverze startzhustene stopalignment stopbarva stopbuffer stopbuffer stopcitace stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfakt stopfigure stopfloattext stopformula stopframedtext stophiding stopinteraktivnimenu stopitemgroup stopkomentar stopkomponenta stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginalnilinka stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stoppozadi stopprodukt stopprofile stopprojekt stopprostredi stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextovalinka stoptyping stopunpacked stopverze stopzhustene strana sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronizacnilista synchronizovat synonym tab tecky tenkalinka tenkelinky tex texthlavicky textovalinka textpopisku title tlacitko tref tvrdemezery typebuffer typstrany ukazbarvu ukazexterniobrazy ukazmrizku ukaznastaveni ukazpaletu ukazpodpery ukazpole ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk ukazvzhled ukazzakladnifont umistikombinovanyseznam umistikombinovanyseznam umistilegendu umistiloga umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici umistipoznamkypodcarou umistirejstrik umistirejstrik umistirovnici umistiseznam umistivedlesebe umistizalozky usedirectory usetypescript usetypescriptfile uzijURL uzijbloky uzijexternidokument uzijexterniobraz uzijexternisoubor uzijexternisoubory uzijexternizvuk uzijkodovani uzijmodul uzijodkazy uzijprikazy uzijspeciality uzijsymbol verze vl vlasovalinka vlevo vpravo vradku vsedniden vyberbloky vyberpapir vyberverzi vyplnenytext vyplnovelinky vyplnovepole vyplnovyradek vysoky zablokujinterakcnimenu zachovejbloky zadnamezera zadnebilemisto zadnedalsibloky zadnedalsisoubory zadnehorniadolniradky zadneodsazovani zadnezahlaviaupati zadneznaceni zadnyseznam zalozka zapisdorejstriku zapisdoseznamu zapisdoseznamuodkazu zapismeziseznam zaramovani zarovnanonastred zarovnanovlevo zarovnanovpravo zasobnikpoli zaznamovepole zhustene ziskejbuffer ziskejznaceni zlomek znaceni znak znaky zpracujbloky zpracujstranu zrcadlit zref
\ No newline at end of file
diff --git a/context/data/context-jedit-de.xml b/context/data/context-jedit-de.xml
index ae348d365..d63ce0b01 100644
--- a/context/data/context-jedit-de.xml
+++ b/context/data/context-jedit-de.xml
@@ -1,2 +1,2 @@
- Buchstabe Buchstaben CAP Cap Caps MONAT Roemischezahlen WOCHENTAG WOERTER WORT Woerter Wort amgitterausrichten amgitterneuausrichten appendix aufseite ausfuellfeld ausfuelltext ausschnitt bearbeitebloecke bearbeiteseite behaltebloecke bei benutzekodierung benutzespezielles beschrifteversion beschriftung bestimmekopfnummer bestimmelistencharakeristika bildschirm blanko bookmark bruch buchstabe buchstaben but bypassblocks cap chapter chem completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum defineoutput definetype definiereabbsymbol definiereabsaetze definiereabschnitt definiereabschnittsblock definierebeschreibung definierebeschreibungen definierebeschriftung definiereblanko definiereblock definiereeinzug definierefarbe definierefarbengruppe definierefeld definierefeldstapel definierefliesstext definierefliesstextumgebung definieregleitobjekt definiereinteraktionsmenue definiereinteraktionsmenue definierekonversion definierelabel definiereliste definierelogo definieren definierenummerierung definiereoverlay definierepalette definierepapierformat definiereprofil definiereprogramme definierepuffer definierereferenz definierereferenzformat definierereferenzliste definiereregister definiereschrift definieresortieren definierestartstop definieresubfeld definieresymbol definieresynonyme definieretabellenvorlage definieretabulator definieretext definieretippen definiereueberschrift definiereumbruch definiereumrahmt definiereumrahmtertext definiereversion definierezusammengestellteliste description doppelseite doppelseitigespapier drehen duennelinie duennerumriss durchgestrichen durchstreichen einezeile einziehen emptylines entknuepfebeschriftung enumeration externeabbildung farbe feld feldstapel festesspatium folgeprofil folgeprofilversion folgeversion footnotetext forceblocks format framedtext fussnote gefuelltesrechteck gefuelltezeile gestreckt gitter graufarbe haarlinie hauptsprache heutigesdatum heutigeskopfnummer hintergrund hl hoch holebeschriftung holepuffer imlinken imrechten imumriss in inaktiviereinteraktionsmenue inanderermarginale indentation ininner inmarginalie inouter installieresprache interaktionsbalken interaktionsknopfe inzeile irgendwo its keinebeschriftung keinebloeckemehr keinedateienmehr keinekopfundfusszeilen keineliste keinspatium keinzeilenobenundunten keinzwischenraum kleinerdurchschuss klonierefeld knopf kommentar konvertierezahl kopf kopfnummer kopierefeld korrigierezwischenraum labeling labels labeltext linksbuendig listsymbol loadsorts loadsynonyms mar marginallinie marginaltext mathematik mediaeval monat nachunten name nextsection nichteinziehen nocap nop notiz paragraph part passelayoutan passendfeld placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist platzierebookmarks platziereformel platzierefussnoten platzierelegende platziereliste platzierelogo platzierelokalefussnoten platzierenebeneinander platziereregister platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste platzierezusammengestellteliste pos position posten programm publikation punkt ran rechteck rechtecke rechtsbuendig ref referenz register registrierefelder reservefloat resettextcontent roemischezahlen ruecksetzten ruecksetztenbeschriftung schreibezumregister schreibezurliste schreibezurreferenzliste schreibezwischenliste section seeregister seite seitenreferenz seitentyp settext setupforms setupitemgroup setuplistalternative setuppaper setupstrut showsymbolset sort spalte spatium spiegeln sprache startalignment startbuffer startbuffer startcolumns startcombination startdescription startdocument startenumeration startfarbe startfigure startfloattext startformula startframedtext startgeg starthiding starthintergrund startinteraktionsmenue startitemgroup startkleinerdurchschuss startkommentar startkomponente startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginallinie startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttextlinie starttyping startumgebung startunpacked startversion startzitat stelleabsaetzeein stelleabsatznummerierungein stelleabschnittein stelleabschnittsblockein stelleanordnenein stelleausgabeein stelleausrichtungein stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein stellebindestrichein stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein stelleeinzuegein stelleengerein stelleexterneabbildungenein stellefarbeein stellefarbenein stellefeldein stellefelderin stellefliesstextein stellefliesstextumgebungein stelleformelnein stellefussnotendefinitionein stellefussnotenein stellefusszeileein stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein stellegleitobjektein stellehintergruendeein stellehintergrundein stelleinmarginalieein stelleinteraktionein stelleinteraktionsbalkenein stelleinteraktionsbildschirmein stelleinteraktionsmenueein stelleknopfein stellekombinationein stellekommentarein stellekopfzahlein stellekopfzeileein stellekopfzeilentextein stellelabeltextein stellelayoutein stellelegendeein stellelinienbreiteein stellelisteein stellemarginalblockein stellemarginallinieein stellenobenein stellenummerierungein stellepaletteein stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein stelleprofilein stelleprogrammein stellepublikationein stellepufferein stellerasterein stellerechteckein stellereferenzierenein stellereferenzlisteein stelleregisterein stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein stellespaltenein stellespatiumein stellespracheein stellesymbolsetein stellesynchronisationein stellesynchronisationsbalkenein stellesynonymein stellesystemein stelletabein stelletabellenein stelletabulatorein stelletextein stelletextobenein stelletexttexteein stelletextumrissein stelletextuntenein stelletipein stelletippenein stelletoleranzein stelleueberschriftein stelleueberschriftenein stelleueberschrifttextein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein stelleuntenein stelleunterseitennummerein stelleunterstreichenein stelleurlein stelleversalienein stelleversionein stellezeilenabstandein stellezeilenabstandein stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein stellezwischenraumein stopalignment stopbuffer stopbuffer stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfarbe stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stophintergrund stopinteraktionsmenue stopitemgroup stopkleinerdurchschuss stopkommentar stopkomponente stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginallinie stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextlinie stoptyping stopumgebung stopunpacked stopversion stopzitat sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronisationsbalken synchronisieren synonym tab teilegleitobjekt tex textlinie textreferenz tief tiho tip tippedatei tippen tippepuffer title tooltip ueber ueberschrifttext uebersetzten ueberstreichen ueberstrichen umrahmt unterstreichen unterstrichen usedirectory verbergebloecke vergleichefarbengruppe vergleichepalette verknuepfebeschriftung verknuepfedokument verknuepfregister version verweis verweisdatum verwendeURL verwendebefehl verwendebloecke verwendeexteresdokument verwendeexterneabbildung verwendeexternedatei verwendeexternedateien verwendeexternestonstueck verwendemodul verwendereferenzen verwendesymbole vl von waehlebloeckeaus waehlepapieraus waehleversionaus wechselezumfliesstext wochentag wortrechts zeigedruck zeigeeinstellungen zeigeexterneabbildungen zeigefarbe zeigefarbengruppe zeigefelder zeigefliesstext zeigefliesstextumgebung zeigegitter zeigelayout zeigepalette zeigerahmen zeigestruts zeigeumbruch zentriert ziffern zitat zitieren zu zurbox zwischenraum
\ No newline at end of file
+ Buchstabe Buchstaben CAP Cap Caps MONAT Roemischezahlen WOCHENTAG WOERTER WORT Woerter Wort amgitterausrichten amgitterneuausrichten appendix aufseite ausfuellfeld ausfuelltext ausschnitt bearbeitebloecke bearbeiteseite behaltebloecke bei benutzekodierung benutzespezielles beschrifteversion beschriftung bestimmekopfnummer bestimmelistencharakeristika bildschirm blanko bookmark bruch buchstabe buchstaben but bypassblocks cap chapter chem completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineoutput defineschriftsynonym definetype definetypeface definiereabbsymbol definiereabsaetze definiereabschnitt definiereabschnittsblock definierebeschreibung definierebeschreibungen definierebeschriftung definiereblanko definiereblock definiereeinzug definierefarbe definierefarbengruppe definierefeld definierefeldstapel definierefliesstext definierefliesstextumgebung definieregleitobjekt definiereinteraktionsmenue definiereinteraktionsmenue definierekonversion definierelabel definiereliste definierelogo definieren definierenummerierung definiereoverlay definierepalette definierepapierformat definiereprofil definiereprogramme definierepuffer definierereferenz definierereferenzformat definierereferenzliste definiereregister definiereschrift definieresortieren definierestartstop definieresubfeld definieresymbol definieresynonyme definieretabellenvorlage definieretabulator definieretext definieretippen definiereueberschrift definiereumbruch definiereumrahmt definiereumrahmtertext definiereversion definierezusammengestellteliste description doppelseite doppelseitigespapier drehen duennelinie duennerumriss durchgestrichen durchstreichen einezeile einziehen emptylines entknuepfebeschriftung enumeration externeabbildung farbe feld feldstapel festesspatium folgeprofil folgeprofilversion folgeversion footnotetext forceblocks format framedtext fussnote gefuelltesrechteck gefuelltezeile gestreckt gitter graufarbe haarlinie hauptsprache heutigesdatum heutigeskopfnummer hintergrund hl hoch holebeschriftung holepuffer imlinken imrechten imumriss in inaktiviereinteraktionsmenue inanderermarginale indentation ininner inmarginalie inouter installieresprache interaktionsbalken interaktionsknopfe inzeile irgendwo its keinebeschriftung keinebloeckemehr keinedateienmehr keinekopfundfusszeilen keineliste keinspatium keinzeilenobenundunten keinzwischenraum kleinerdurchschuss klonierefeld knopf kommentar konvertierezahl kopf kopfnummer kopierefeld korrigierezwischenraum labeling labels labeltext linksbuendig listsymbol loadsorts loadsynonyms mapfontsize mar marginallinie marginaltext mathematik mediaeval monat nachunten name nextsection nichteinziehen nocap nop notiz paragraph part passelayoutan passendfeld placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist platzierebookmarks platziereformel platzierefussnoten platzierelegende platziereliste platzierelogo platzierelokalefussnoten platzierenebeneinander platziereregister platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste platzierezusammengestellteliste pos position posten programm publikation punkt ran rechteck rechtecke rechtsbuendig ref referenz register registrierefelder reservefloat resettextcontent roemischezahlen ruecksetzten ruecksetztenbeschriftung schreibezumregister schreibezurliste schreibezurreferenzliste schreibezwischenliste section seeregister seite seitenreferenz seitentyp settext setupfonthandling setupfontsynonym setupforms setupinterlinespace2 setupitemgroup setuplistalternative setuppaper setupstrut showsymbolset sort spalte spatium spiegeln sprache startalignment startbuffer startbuffer startcolumns startcombination startdescription startdocument startenumeration startfarbe startfigure startfloattext startformula startframedtext startgeg starthiding starthintergrund startinteraktionsmenue startitemgroup startkleinerdurchschuss startkommentar startkomponente startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginallinie startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttextlinie starttyping startumgebung startunpacked startversion startzitat stelleabsaetzeein stelleabsatznummerierungein stelleabschnittein stelleabschnittsblockein stelleanordnenein stelleausgabeein stelleausrichtungein stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein stellebindestrichein stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein stelleeinzuegein stelleengerein stelleexterneabbildungenein stellefarbeein stellefarbenein stellefeldein stellefelderin stellefliesstextein stellefliesstextumgebungein stelleformelnein stellefussnotendefinitionein stellefussnotenein stellefusszeileein stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein stellegleitobjektein stellehintergruendeein stellehintergrundein stelleinmarginalieein stelleinteraktionein stelleinteraktionsbalkenein stelleinteraktionsbildschirmein stelleinteraktionsmenueein stelleknopfein stellekombinationein stellekommentarein stellekopfzahlein stellekopfzeileein stellekopfzeilentextein stellelabeltextein stellelayoutein stellelegendeein stellelinienbreiteein stellelisteein stellemarginalblockein stellemarginallinieein stellenobenein stellenummerierungein stellepaletteein stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein stelleprofilein stelleprogrammein stellepublikationein stellepufferein stellerasterein stellerechteckein stellereferenzierenein stellereferenzlisteein stelleregisterein stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein stellespaltenein stellespatiumein stellespracheein stellesymbolsetein stellesynchronisationein stellesynchronisationsbalkenein stellesynonymein stellesystemein stelletabein stelletabellenein stelletabulatorein stelletextein stelletextobenein stelletexttexteein stelletextumrissein stelletextuntenein stelletipein stelletippenein stelletoleranzein stelleueberschriftein stelleueberschriftenein stelleueberschrifttextein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein stelleuntenein stelleunterseitennummerein stelleunterstreichenein stelleurlein stelleversalienein stelleversionein stellezeilenabstandein stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein stellezwischenraumein stopalignment stopbuffer stopbuffer stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfarbe stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stophintergrund stopinteraktionsmenue stopitemgroup stopkleinerdurchschuss stopkommentar stopkomponente stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginallinie stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextlinie stoptyping stopumgebung stopunpacked stopversion stopzitat sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronisationsbalken synchronisieren synonym tab teilegleitobjekt tex textlinie textreferenz tief tiho tip tippedatei tippen tippepuffer title tooltip ueber ueberschrifttext uebersetzten ueberstreichen ueberstrichen umrahmt unterstreichen unterstrichen usedirectory usetypescript usetypescriptfile verbergebloecke vergleichefarbengruppe vergleichepalette verknuepfebeschriftung verknuepfedokument verknuepfregister version verweis verweisdatum verwendeURL verwendebefehl verwendebloecke verwendeexteresdokument verwendeexterneabbildung verwendeexternedatei verwendeexternedateien verwendeexternestonstueck verwendemodul verwendereferenzen verwendesymbole vl von waehlebloeckeaus waehlepapieraus waehleversionaus wechselezumfliesstext wochentag wortrechts zeigedruck zeigeeinstellungen zeigeexterneabbildungen zeigefarbe zeigefarbengruppe zeigefelder zeigefliesstext zeigefliesstextumgebung zeigegitter zeigelayout zeigepalette zeigerahmen zeigestruts zeigeumbruch zentriert ziffern zitat zitieren zu zurbox zwischenraum
\ No newline at end of file
diff --git a/context/data/context-jedit-en.xml b/context/data/context-jedit-en.xml
index 266334f3c..f74f5f268 100644
--- a/context/data/context-jedit-en.xml
+++ b/context/data/context-jedit-en.xml
@@ -1,2 +1,2 @@
- CAP Cap Caps Character Characters MONTH Romannumerals WEEKDAY WORD WORDS Word Words about adaptlayout appendix at atpage background blackrule blackrules blank bookmark but button bypassblocks cap chapter character characters chem clip clonefield color column comment comparecolorgroup comparepalet completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister convertnumber copyfield correctwhitespace coupledocument coupledregister couplemarking couplepage couplepaper coupleregister crlf currentdate currentheadnumber date decouplemarking define defineblank defineblock definebodyfont definebodyfontenvironment definebuffer definecolor definecolorgroup definecombinedlist defineconversion definedescription defineenumeration definefield definefieldstack definefiguresymbol definefloat definefont defineframed defineframedtext definehead defineindenting defineinteractionmenu defineinteractionmenu definelabel definelist definelogo definemakeup definemarking defineoutput defineoverlay definepalet definepapersize defineparagraphs defineprofile defineprogram definereference definereferenceformat definereferencelist defineregister definesection definesectionblock definesorting definestartstop definesubfield definesymbol definesynonyms definetabletemplate definetabulate definetext definetype definetyping defineversion description determineheadnumber determinelistcharacteristics disableinteractionmenu emptylines enumeration externalfigure field fieldstack fillinfield fillinline fillinrules fillintext fitfield fixedspaces followprofile followprofileversion followversion footnote footnotetext forceblocks fraction framed framedtext from getbuffer getmarking godown goto gotobox graycolor grid hairline head headnumber headtext hideblocks high hl in indentation indenting inframed ininner inleft inline inmargin inothermargin inouter inright installlanguage interactionbar interactionbuttons item items its keepblocks labeling labels labeltext language leftaligned listsymbol loadsorts loadsynonyms logfields lohi low mainlanguage mar marginrule margintext marking markversion mathematics mediaeval midaligned mirror month moveongrid name nextsection nocap noheaderandfooterlines noindenting nolist nomarking nomoreblocks nomorefiles nop nospace note notopandbottomlines nowhitespace numbers overbar overbars overstrike overstrikes packed page pagereference pagetype paragraph part periods placebookmarks placecombinedlist placecombinedlist placefloat placefootnotes placeformula placelegend placelist placelistoffloats placelistofsorts placelistofsynonyms placelocalfootnotes placelogos placeongrid placeontopofeachother placereferencelist placeregister placeregister placesidebyside placesubformula position processblocks processpage program publication quotation quote ran ref reference referral referraldate register reservefloat reset resetmarking resettextcontent rightaligned romannumerals rotate scale screen section seeregister selectblocks selectpaper selectversion settextcontent setupalign setuparranging setupbackground setupbackgrounds setupblackrules setupblank setupblock setupbodyfont setupbodyfontenvironment setupbottom setupbottomtexts setupbuffer setupbuttons setupcapitals setupcaption setupcaptions setupclipping setupcolor setupcolors setupcolumns setupcombinations setupcombinedlist setupcomment setupdescriptions setupenumerations setupexternalfigures setupfield setupfields setupfillinlines setupfillinrules setupfloat setupfloats setupfloatsplitting setupfooter setupfootertexts setupfootnotedefinition setupfootnotes setupforms setupformulae setupframed setupframedtexts setuphead setupheader setupheadertexts setupheadnumber setupheads setupheadtext setuphyphenmark setupindentations setupindenting setupinmargin setupinteraction setupinteractionbar setupinteractionmenu setupinteractionscreen setupinterlinespace setupinterlinespace setupitemgroup setupitems setuplabeltext setuplanguage setuplayout setuplegend setuplinenumbering setuplines setuplinewidth setuplist setuplistalternative setupmakeup setupmarginblocks setupmarginrules setupmarking setupnarrower setupnumbering setupoppositeplacing setupoutput setuppagenumber setuppagenumbering setuppagetransitions setuppalet setuppaper setuppapersize setupparagraphnumbering setupparagraphs setuppositioning setupprofiles setupprograms setuppublications setupquote setupreferencelist setupreferencing setupregister setuprotate setupscreens setupsection setupsectionblock setupsorting setupspacing setupstrut setupsubpagenumber setupsymbolset setupsynchronization setupsynchronizationbar setupsynonyms setupsystem setuptab setuptables setuptabulate setuptext setuptextrules setuptexttexts setupthinrules setuptolerance setuptop setuptoptexts setuptype setuptyping setupunderbar setupurl setupversions setupwhitespace showbodyfont showbodyfontenvironment showcolor showcolorgroup showexternalfigures showfields showframe showgrid showlayout showmakeup showpalet showprint showsetups showstruts showsymbolset someline somewhere sort space splitfloat startalignment startbackground startbuffer startbuffer startcolor startcolumns startcombination startcomment startcomponent startdescription startdocument startenumeration startenvironment startfact startfigure startfloattext startformula startframedtext starthiding startinteractionmenu startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmarginrule startnamemakeup startnarrower startopposite startoverlay startoverview startpacked startparagraph startpositioning startpostponing startproduct startprofile startproject startquotation startregister startsymbolset startsynchronization starttable starttables starttabulate starttextrule starttyping startunpacked startversion stopalignment stopbackground stopbuffer stopbuffer stopcolor stopcolumns stopcombination stopcomment stopcomponent stopdescription stopdocument stopenumeration stopenvironment stopfact stopfigure stopfloattext stopformula stopframedtext stophiding stopinteractionmenu stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmarginrule stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stoppacked stopparagraph stoppositioning stoppostponing stopproduct stopprofile stopproject stopquotation stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextrule stoptyping stopunpacked stopversion stretched sub subject subsection subsubject subsubsection subsubsubject switchtobodyfont sym symbol synchronizationbar synchronize synonym tab tex textreference textrule thinrule thinrules title tooltip translate typ type typebuffer typefile underbar underbars useURL useblocks usecommands usedirectory useencoding useexternaldocument useexternalfigure useexternalfile useexternalfiles useexternalsoundtrack usemodule usereferences usespecials usesymbols version vl weekday whitespace wordright writebetweenlist writetolist writetoreferencelist writetoregister
\ No newline at end of file
+ CAP Cap Caps Character Characters MONTH Romannumerals WEEKDAY WORD WORDS Word Words about adaptlayout appendix at atpage background blackrule blackrules blank bookmark but button bypassblocks cap chapter character characters chem clip clonefield color column comment comparecolorgroup comparepalet completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister convertnumber copyfield correctwhitespace coupledocument coupledregister couplemarking couplepage couplepaper coupleregister crlf currentdate currentheadnumber date decouplemarking define defineblank defineblock definebodyfont definebodyfontDEF definebodyfontREF definebodyfontenvironment definebuffer definecolor definecolorgroup definecombinedlist defineconversion definedescription definedfont defineenumeration definefield definefieldstack definefiguresymbol definefloat definefont definefontfeature definefonthandling definefontsynonym defineframed defineframedtext definehead defineindenting defineinteractionmenu defineinteractionmenu definelabel definelist definelogo definemakeup definemarking defineoutput defineoverlay definepalet definepapersize defineparagraphs defineprofile defineprogram definereference definereferenceformat definereferencelist defineregister definesection definesectionblock definesorting definestartstop definesubfield definesymbol definesynonyms definetabletemplate definetabulate definetext definetype definetypeface definetyping defineversion description determineheadnumber determinelistcharacteristics disableinteractionmenu emptylines enumeration externalfigure field fieldstack fillinfield fillinline fillinrules fillintext fitfield fixedspaces followprofile followprofileversion followversion footnote footnotetext forceblocks fraction framed framedtext from getbuffer getmarking godown goto gotobox graycolor grid hairline head headnumber headtext hideblocks high hl in indentation indenting inframed ininner inleft inline inmargin inothermargin inouter inright installlanguage interactionbar interactionbuttons item items its keepblocks labeling labels labeltext language leftaligned listsymbol loadsorts loadsynonyms logfields lohi low mainlanguage mapfontsize mar marginrule margintext marking markversion mathematics mediaeval midaligned mirror month moveongrid name nextsection nocap noheaderandfooterlines noindenting nolist nomarking nomoreblocks nomorefiles nop nospace note notopandbottomlines nowhitespace numbers overbar overbars overstrike overstrikes packed page pagereference pagetype paragraph part periods placebookmarks placecombinedlist placecombinedlist placefloat placefootnotes placeformula placelegend placelist placelistoffloats placelistofsorts placelistofsynonyms placelocalfootnotes placelogos placeongrid placeontopofeachother placereferencelist placeregister placeregister placesidebyside placesubformula position processblocks processpage program publication quotation quote ran ref reference referral referraldate register reservefloat reset resetmarking resettextcontent rightaligned romannumerals rotate scale screen section seeregister selectblocks selectpaper selectversion settextcontent setupalign setuparranging setupbackground setupbackgrounds setupblackrules setupblank setupblock setupbodyfont setupbodyfontenvironment setupbottom setupbottomtexts setupbuffer setupbuttons setupcapitals setupcaption setupcaptions setupclipping setupcolor setupcolors setupcolumns setupcombinations setupcombinedlist setupcomment setupdescriptions setupenumerations setupexternalfigures setupfield setupfields setupfillinlines setupfillinrules setupfloat setupfloats setupfloatsplitting setupfonthandling setupfontsynonym setupfooter setupfootertexts setupfootnotedefinition setupfootnotes setupforms setupformulae setupframed setupframedtexts setuphead setupheader setupheadertexts setupheadnumber setupheads setupheadtext setuphyphenmark setupindentations setupindenting setupinmargin setupinteraction setupinteractionbar setupinteractionmenu setupinteractionscreen setupinterlinespace setupinterlinespace2 setupitemgroup setupitems setuplabeltext setuplanguage setuplayout setuplegend setuplinenumbering setuplines setuplinewidth setuplist setuplistalternative setupmakeup setupmarginblocks setupmarginrules setupmarking setupnarrower setupnumbering setupoppositeplacing setupoutput setuppagenumber setuppagenumbering setuppagetransitions setuppalet setuppaper setuppapersize setupparagraphnumbering setupparagraphs setuppositioning setupprofiles setupprograms setuppublications setupquote setupreferencelist setupreferencing setupregister setuprotate setupscreens setupsection setupsectionblock setupsorting setupspacing setupstrut setupsubpagenumber setupsymbolset setupsynchronization setupsynchronizationbar setupsynonyms setupsystem setuptab setuptables setuptabulate setuptext setuptextrules setuptexttexts setupthinrules setuptolerance setuptop setuptoptexts setuptype setuptyping setupunderbar setupurl setupversions setupwhitespace showbodyfont showbodyfontenvironment showcolor showcolorgroup showexternalfigures showfields showframe showgrid showlayout showmakeup showpalet showprint showsetups showstruts showsymbolset someline somewhere sort space splitfloat startalignment startbackground startbuffer startbuffer startcolor startcolumns startcombination startcomment startcomponent startdescription startdocument startenumeration startenvironment startfact startfigure startfloattext startformula startframedtext starthiding startinteractionmenu startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmarginrule startnamemakeup startnarrower startopposite startoverlay startoverview startpacked startparagraph startpositioning startpostponing startproduct startprofile startproject startquotation startregister startsymbolset startsynchronization starttable starttables starttabulate starttextrule starttyping startunpacked startversion stopalignment stopbackground stopbuffer stopbuffer stopcolor stopcolumns stopcombination stopcomment stopcomponent stopdescription stopdocument stopenumeration stopenvironment stopfact stopfigure stopfloattext stopformula stopframedtext stophiding stopinteractionmenu stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmarginrule stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stoppacked stopparagraph stoppositioning stoppostponing stopproduct stopprofile stopproject stopquotation stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextrule stoptyping stopunpacked stopversion stretched sub subject subsection subsubject subsubsection subsubsubject switchtobodyfont sym symbol synchronizationbar synchronize synonym tab tex textreference textrule thinrule thinrules title tooltip translate typ type typebuffer typefile underbar underbars useURL useblocks usecommands usedirectory useencoding useexternaldocument useexternalfigure useexternalfile useexternalfiles useexternalsoundtrack usemodule usereferences usespecials usesymbols usetypescript usetypescriptfile version vl weekday whitespace wordright writebetweenlist writetolist writetoreferencelist writetoregister
\ No newline at end of file
diff --git a/context/data/context-jedit-fr.xml b/context/data/context-jedit-fr.xml
index 8b88aeec3..e86821b4c 100644
--- a/context/data/context-jedit-fr.xml
+++ b/context/data/context-jedit-fr.xml
@@ -1,2 +1,2 @@
- CAP Cap Caps Caractere Caracteres Chiffresromains JOURSEMAINE MOIS MOT MOTS Mot Mots a adaptedisposition ajustechamp alaligne alapage aligneadroite aligneagauche aligneaumilieu appendix arriereplan baha barreinteraction barresynchronisation bas bouton boutonsinteraction but cacheblocs cap caractere caracteres champ changepolicecorps chapter chem chiffresromains citation citer clip clonechamp colonne commentaire comparegroupecouleur comparepalette completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregistre composeenalinea concernant convertitnumero copitchamp corrigeespaceblanc couleur couleurgrise coupledocument coupledregister couplemarquage couplepapier coupleregistre crlf dactylographier dans dansautremarge dansdroite dansgauche dansmarge date datecourante daterecommandation de decouplemarquage defineframed defineframedtext definit definitbloc definitblocsection definitbuffer definitchamp definitcompoalinea definitconversion definitcouleur definitdactylo definitdemarrestoppe definitdescription definitenumeration definitenvironnementpolicecorps definitetiquette definitflottant definitformatreference definitgroupecouleur definitliste definitlisteimbriquee definitlistereference definitlogo definitmakeup definitmarquage definitmenuinteraction definitmenuinteraction definitnotepdp definitpalette definitparagraphes definitpilechamp definitpolice definitpolicecorps definitprofil definitprogramme definitreference definitregistre definitrevetement definitsection definitsortie definitsouschamp definitsymbole definitsymbolefigure definitsynonymes definittabulation definittaillepapier definittete definittexte definittrametableau definittri definittype definitversion definitvide definitvide demarreciter deplacesurgrille description determinecaracteristiqueliste determinenumerotete echelle ecran ecritdansliste ecritdanslistereference ecritentreliste ecritregistre el element elements emptylines enumeration espace espaceblanc espacesfixes etiquettes etire fichierdactylo figureexterne forceblocs fraction framed framedtext gardeblocs grille groupe haut hl indentation inframed inhibemenuinteraction ininner inouter installelangue joursemaine labeling labeltexte langue langueprincipale ligneh lignenoire ligneregleetexte lignesnoires listesymbole loadsorts loadsynonyms logchamp mar margereglee marquage marquageversion marquepage mathematique mediaeval mois montrecadre montrechamps montrecouleur montredisposition montreedition montreenvironnementpolicecorps montrefiguresexternes montregrille montregroupecouleur montrejeusymboles montremakeup montrepalette montrepolicecorps montrereglages montrestruts motdroit name nextsection nocap nop note notepdp numeros numerotete numerotetecourant obtientmarquage oriente overbar overbars page pagedouble paragraph part pasplusdeblocs pasplusdefichiers periodes pilechamp placecoteacote placeflottant placeformule placelegende placelesunsaudessusdesautres placeliste placelisteinmbriquee placelisteinmbriquee placelistereference placelistoffloats placelistofsorts placelistofsynonyms placelogos placemarquespages placenotespdp placenotespdplocales placeregistre placeregistre placesousformule placesurgrille position prendbuffer programme publication qqpart ran raz razmarquage recommandation ref reference referencepage referencetexte reflete register reglealignement reglealineas reglearrangement reglearriereplan reglearriereplans reglebarreinteraction reglebarresynchronisation reglebloc regleblocmarge regleblocsection regleboutons reglebuffer reglecapitales reglechamp reglechamps regleclipping reglecolonnes reglecombinaisons reglecommentaire reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs regledactylo regledansmarge regledescriptions regledisposition regleecraninteraction regleecrans regleelements regleencadre regleentete regleenumerations regleenvironnementpolicecorps regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne regleespacementinterligne reglefiguresexternes regleflottant regleflottants regleformulaires regleformules regleinf regleinteraction regleintitule regleintitules reglejeusymboles reglelabeltexte reglelangue reglelegende reglelignes reglelignesnoires reglelignesreglestexte regleliste reglelisteimbriquee reglelistereference reglemakeup reglemargereglee reglemarquage reglemarquagehyphenation reglemenuinteraction reglenotepdp reglenumeropage reglenumerotation reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe reglenumerotete regleoriente reglepalette reglepapier regleparagraphes reglepdp regleplacementopposition reglepolicecorps reglepositionnement regleprofils regleprogrammes reglepublications reglereferencage regleregistre regleremplitligne regleremplitlignesreglees reglesection regleseparationflottant reglesortie reglesouslignage reglesousnumeropage reglestrut reglesup reglesynchronisation reglesynonymes reglesysteme regletab regletableaux regletabulation regletaillepapier regletete regletetes regletexte regletextesentete regletextesinf regletextespdp regletextessup regletextestexte regletextetete regletolerance regletraitsfins regletransitionspage regletri regletype regleurl regleversions remplitchamp remplitligne remplitlignesreglees remplittexte reservefloat resettextcontent sansalinea sansespace sansespaceblanc sanslignesenteteetpdp sanslignessupetinf sansliste sansmarquage sauteblocs section seeregister selectionneblocs selectionnepapier selectionneversion separeflottant settext setupframedtexts setupitemgroup setuplistalternative sort sousligne souslignetout startalignment startarriereplan startbuffer startbuffer startcitation startcolumns startcombination startcommentaire startcomposant startcouleur startdescription startdocument startenumeration startenvironement startfait startfigure startfloattext startformula startframedtext startgroupe starthiding startitemgroup startlegend startligneregleetexte startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmargereglee startmarginblock startmenuinteraction startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startproduit startprofile startprojet startregister startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversion stopalignment stoparriereplan stopbuffer stopbuffer stopcitation stopcolumns stopcombination stopcommentaire stopcomposant stopcouleur stopdescription stopdocument stopenumeration stopenvironement stopfait stopfigure stopfloattext stopformula stopframedtext stopgroupe stophiding stopitemgroup stoplegend stopligneregleetexte stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmargereglee stopmarginblock stopmenuinteraction stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopproduit stopprofile stopprojet stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversion sub subject subsection subsubject subsubsection subsubsubject suggestion suivantprofil suivantversion suivantversionprofil surligne surlignetout sym symbole synchronise synonym tab tapebuffer tapepage tete tex textemarge textenotepdp textetete title traduire traiteblocs traitepage traitfin traitsfins typ uneligne usedirectory utiliseURL utiliseblocs utilisecommandes utilisedocumentexterne utiliseencodage utilisefichierexterne utilisefichiersexternes utilisefigureexterne utilisemodule utilisepsiteaudioexterne utilisereferences utilisespecialites utilisesymboles va vaalaboite vaenbas version vide vl
\ No newline at end of file
+ CAP Cap Caps Caractere Caracteres Chiffresromains JOURSEMAINE MOIS MOT MOTS Mot Mots a adaptedisposition ajustechamp alaligne alapage aligneadroite aligneagauche aligneaumilieu appendix arriereplan baha barreinteraction barresynchronisation bas bouton boutonsinteraction but cacheblocs cap caractere caracteres champ changepolicecorps chapter chem chiffresromains citation citer clip clonechamp colonne commentaire comparegroupecouleur comparepalette completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregistre composeenalinea concernant convertitnumero copitchamp corrigeespaceblanc couleur couleurgrise coupledocument coupledregister couplemarquage couplepapier coupleregistre crlf dactylographier dans dansautremarge dansdroite dansgauche dansmarge date datecourante daterecommandation de decouplemarquage definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineframed defineframedtext definetypeface definit definitbloc definitblocsection definitbuffer definitchamp definitcompoalinea definitconversion definitcouleur definitdactylo definitdemarrestoppe definitdescription definitenumeration definitenvironnementpolicecorps definitetiquette definitflottant definitformatreference definitgroupecouleur definitliste definitlisteimbriquee definitlistereference definitlogo definitmakeup definitmarquage definitmenuinteraction definitmenuinteraction definitnotepdp definitpalette definitparagraphes definitpilechamp definitpolice definitpolicecorps definitprofil definitprogramme definitreference definitregistre definitrevetement definitsection definitsortie definitsouschamp definitsymbole definitsymbolefigure definitsynonymepolice definitsynonymes definittabulation definittaillepapier definittete definittexte definittrametableau definittri definittype definitversion definitvide definitvide demarreciter deplacesurgrille description determinecaracteristiqueliste determinenumerotete echelle ecran ecritdansliste ecritdanslistereference ecritentreliste ecritregistre el element elements emptylines enumeration espace espaceblanc espacesfixes etiquettes etire fichierdactylo figureexterne forceblocs fraction framed framedtext gardeblocs grille groupe haut hl indentation inframed inhibemenuinteraction ininner inouter installelangue joursemaine labeling labeltexte langue langueprincipale ligneh lignenoire ligneregleetexte lignesnoires listesymbole loadsorts loadsynonyms logchamp mapfontsize mar margereglee marquage marquageversion marquepage mathematique mediaeval mois montrecadre montrechamps montrecouleur montredisposition montreedition montreenvironnementpolicecorps montrefiguresexternes montregrille montregroupecouleur montrejeusymboles montremakeup montrepalette montrepolicecorps montrereglages montrestruts motdroit name nextsection nocap nop note notepdp numeros numerotete numerotetecourant obtientmarquage oriente overbar overbars page pagedouble paragraph part pasplusdeblocs pasplusdefichiers periodes pilechamp placecoteacote placeflottant placeformule placelegende placelesunsaudessusdesautres placeliste placelisteinmbriquee placelisteinmbriquee placelistereference placelistoffloats placelistofsorts placelistofsynonyms placelogos placemarquespages placenotespdp placenotespdplocales placeregistre placeregistre placesousformule placesurgrille position prendbuffer programme publication qqpart ran raz razmarquage recommandation ref reference referencepage referencetexte reflete register reglealignement reglealineas reglearrangement reglearriereplan reglearriereplans reglebarreinteraction reglebarresynchronisation reglebloc regleblocmarge regleblocsection regleboutons reglebuffer reglecapitales reglechamp reglechamps regleclipping reglecolonnes reglecombinaisons reglecommentaire reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs regledactylo regledansmarge regledescriptions regledisposition regleecraninteraction regleecrans regleelements regleencadre regleentete regleenumerations regleenvironnementpolicecorps regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne reglefiguresexternes regleflottant regleflottants regleformulaires regleformules regleinf regleinteraction regleintitule regleintitules reglejeusymboles reglelabeltexte reglelangue reglelegende reglelignes reglelignesnoires reglelignesreglestexte regleliste reglelisteimbriquee reglelistereference reglemakeup reglemargereglee reglemarquage reglemarquagehyphenation reglemenuinteraction reglenotepdp reglenumeropage reglenumerotation reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe reglenumerotete regleoriente reglepalette reglepapier regleparagraphes reglepdp regleplacementopposition reglepolicecorps reglepositionnement regleprofils regleprogrammes reglepublications reglereferencage regleregistre regleremplitligne regleremplitlignesreglees reglesection regleseparationflottant reglesortie reglesouslignage reglesousnumeropage reglestrut reglesup reglesynchronisation reglesynonymes reglesysteme regletab regletableaux regletabulation regletaillepapier regletete regletetes regletexte regletextesentete regletextesinf regletextespdp regletextessup regletextestexte regletextetete regletolerance regletraitsfins regletransitionspage regletri regletype regleurl regleversions remplitchamp remplitligne remplitlignesreglees remplittexte reservefloat resettextcontent sansalinea sansespace sansespaceblanc sanslignesenteteetpdp sanslignessupetinf sansliste sansmarquage sauteblocs section seeregister selectionneblocs selectionnepapier selectionneversion separeflottant settext setupfonthandling setupfontsynonym setupframedtexts setupinterlinespace2 setupitemgroup setuplistalternative sort sousligne souslignetout startalignment startarriereplan startbuffer startbuffer startcitation startcolumns startcombination startcommentaire startcomposant startcouleur startdescription startdocument startenumeration startenvironement startfait startfigure startfloattext startformula startframedtext startgroupe starthiding startitemgroup startlegend startligneregleetexte startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmargereglee startmarginblock startmenuinteraction startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startproduit startprofile startprojet startregister startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversion stopalignment stoparriereplan stopbuffer stopbuffer stopcitation stopcolumns stopcombination stopcommentaire stopcomposant stopcouleur stopdescription stopdocument stopenumeration stopenvironement stopfait stopfigure stopfloattext stopformula stopframedtext stopgroupe stophiding stopitemgroup stoplegend stopligneregleetexte stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmargereglee stopmarginblock stopmenuinteraction stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopproduit stopprofile stopprojet stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversion sub subject subsection subsubject subsubsection subsubsubject suggestion suivantprofil suivantversion suivantversionprofil surligne surlignetout sym symbole synchronise synonym tab tapebuffer tapepage tete tex textemarge textenotepdp textetete title traduire traiteblocs traitepage traitfin traitsfins typ uneligne usedirectory usetypescript usetypescriptfile utiliseURL utiliseblocs utilisecommandes utilisedocumentexterne utiliseencodage utilisefichierexterne utilisefichiersexternes utilisefigureexterne utilisemodule utilisepsiteaudioexterne utilisereferences utilisespecialites utilisesymboles va vaalaboite vaenbas version vide vl
\ No newline at end of file
diff --git a/context/data/context-jedit-it.xml b/context/data/context-jedit-it.xml
index 388a52007..5dee881a2 100644
--- a/context/data/context-jedit-it.xml
+++ b/context/data/context-jedit-it.xml
@@ -1,2 +1,2 @@
- CAP Cap Caps GIORNOSETTIMANA Lettera Lettere MESE Numeriromani PAROLA PAROLE Parola Parole accoppiacarta accoppiadocumento accoppiamarcatura accoppiapagina accoppiaregistro adattacampo adattalayout al allineacentro allineadestra allineasinistra ap apagina appendix barrainterazione barrasincronizzazione bastablocchi bastafile cambiaafontdeltesto campi camporiempimento cap capello chapter chim circondato citazione clip clonacampo colonna colore coloregrigio commento completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister confrontagruppocolori confrontatavolozza convertinumero copiacampo correggispaziobianco coupledregister crlf da daqualcheparte data datadioggi datareferral definisci definisciambientefontdeltesto definisciblocco definiscibloccosezione definiscibuffer definiscicampo definiscicapoversi definiscicolore definisciconversione definiscidescrizione definiscidimensionicarta definiscielenco definiscielencocombinato definiscienumerazione definiscietichetta definiscifigurasimbolo definiscifont definiscifontdeltesto definisciformatoriferimento definiscigruppocolori definisciincorniciato definisciiniziatermina definiscilistariferimenti definiscilogo definiscimakeup definiscimarcatura definiscimenuinterazione definiscimenuinterazione definiscimodellotabella definiscioggettomobile definisciordinamento definiscioutput definisciprofilo definisciprogramma definisciregistro definiscirientro definisciriferimento definiscirigovuoto definiscisezione definiscisimbolo definiscisinonimi definiscisottocampo definiscisovrapposizione definiscistackcampi definiscitabulato definiscitavolozza definiscitesta definiscitesto definiscitestoincorniciato definiscitype definiscityping definisciversion description determinacarattersticheelenco determinanumerotesta disabilitamenuinterazione el elaborablocchi elaborapagina elementi elemento emptylines enumeration etichette figuraesterna fondo forzablocchi framedtext frazione giornosettimana griglia hl impaccato impostaallineamento impostaambientefontdeltesto impostaampiezzariga impostabarrainterazione impostabarrasincronizzazione impostablocchimargine impostablocco impostabloccosezione impostabuffer impostacampi impostacampo impostacapoversi impostacaption impostacaptions impostacima impostaclippling impostacolonne impostacolore impostacolori impostacombinazioni impostacommento impostadefinizionenotepdp impostadescrizioni impostadimensionicarta impostaelementi impostaelenco impostaelencocombinato impostaenumerazioni impostafigureesterne impostafondo impostafontdeltesto impostaforms impostaformule impostaincorniciato impostainmargine impostainstestazione impostainterazione impostainterlinea impostainterlinea impostalayout impostalegenda impostalineemargine impostalineenere impostalineeriempimento impostalineesottili impostalineetesto impostalingua impostalistariferimenti impostamaiuscole impostamakeup impostamarcatura impostamenuinterazione impostamenzione impostanotepdp impostanumerazione impostanumerazionecapoversi impostanumerazionepagina impostanumerazionerighe impostanumeropagina impostanumerosottopagina impostanumerotesta impostaoggettimobili impostaoggettomobile impostaordinamento impostaoutput impostaparranging impostapdp impostapiustretto impostaposizionamento impostaposizionamentoopposti impostaprofili impostaprogrammi impostapubblicazioni impostapulsanti impostaregistro impostarientri impostarientro impostariferimento impostarighe impostarigheriempimento impostarigovuoto impostarotazione impostaschermi impostaschermointerazione impostasegnosillabazione impostasetsimboli impostasezione impostasfondi impostasfondo impostasincronizzazione impostasinonimi impostasistema impostasottolinea impostaspaziatura impostaspaziobianco impostaspezzamentooggettomobile impostastrut impostatab impostatabelle impostatabulato impostatavolozza impostatesta impostateste impostatesticima impostatestifondo impostatestiincorniciati impostatestiintestazioni impostatestipdp impostatesto impostatestoetichette impostatestointestazioni impostatestotesti impostatolleranza impostatransizionepagina impostatype impostatyping impostaurl impostaversioni in inaltromargine incorniciato indentation indestra ininner inmargine inouter inriga insinistra installalingua intorno labeling lettera lettere lineamargine lineanera lineasottile lineatesto lineenere lineeriempimento lineesottili lingua linguaprincipale listsymbol loadsorts loadsynonyms logcampi mar marcatura marcaversione matematica mediaeval menzione mese mettielenco mettielencocombinato mettielencocombinato mettifiancoafianco mettiformula mettiingriglia mettilegenda mettiloghi mettinotepdp mettinotepdplocali mettiregistro mettiregistro mettisegnalibro mettisottoformula mettiunosullaltro mostraambientefontdeltesto mostracampi mostracolore mostracornice mostrafiguresterne mostrafontdeltesto mostragriglia mostragruppocolori mostraimpostazioni mostralyout mostramakeup mostrasetsimboli mostrastampa mostrastruts mostratavolozza name nascondiblocchi nextsection nienteelenco nientelineecimafondo nientelineintestazionepdp nientemarcatura nienterientro nientespazio nientespaziobianco nocap nop nota notapdp numeri numeriromani numerotesta numerotestacorrente pagina paragraph paroladestra part ped pedap placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist posizione prendibuffer prendimarcatura programma pubblicazione pulsante pulsantinterazione punti qualcheriga ran referral register reimposta reimpostamarcatura reservefloat resettextcontent rientro rif riferimento riferimentopagina riferimentotesto riflessione rigariempimento rigovuoto ruota saltablocchi sbarrati sbarrato scala schermo scrividentroelenco scriviinelenco scriviinlistariferimenti scriviinregistro section seeregister segnalibro seguiprofilo seguiversione seguiversioneprofilo selezionablocchi selezionacarta selezionaversione separamarcatura settext setupitemgroup setuplistalternative setuppaper sfondo sim simbolo sincronizza sopralinea sopralinee sort sottolinea sottolinee spazifissi spazio spaziobianco spezzaoggettomobile spostaagriglia stackcampi startalignment startambiente startbuffer startbuffer startcitazione startcolore startcolumns startcombination startcommento startcomponenet startdescription startdocument startenumeration startfatto startfigure startfloattext startformula startframedtext starthiding startimpaccato startitemgroup startlegend startline startlineamargine startlineatesto startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmenuinterattivo startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodotto startprofile startprogetto startregister startsfondo startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversione stirato stopalignment stopambiente stopbuffer stopbuffer stopcitazione stopcolore stopcolumns stopcombination stopcommento stopcomponenet stopdescription stopdocument stopenumeration stopfatto stopfigure stopfloattext stopformula stopframedtext stophiding stopimpaccato stopitemgroup stoplegend stopline stoplineamargine stoplineatesto stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmenuinterattivo stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodotto stopprofile stopprogetto stopsfondo stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversione sub subject subsection subsubject subsubsection subsubsubject synonym tab testa testoetichetta testoinmargine testoinstestazioni testonotapdp testoriempimento tex tieniblocchi tipopagina title tooltip traduci typ type typebuffer typefile usaURL usablocco usacodifica usacolonnasonoraesterna usacomandi usadocumentoesterno usafiguraesterna usafileesterni usafileesterno usamodulo usariferimenti usasimboli usaspecialita usedirectory vaia vaiabox vaigiu versione vl
\ No newline at end of file
+ CAP Cap Caps GIORNOSETTIMANA Lettera Lettere MESE Numeriromani PAROLA PAROLE Parola Parole accoppiacarta accoppiadocumento accoppiamarcatura accoppiapagina accoppiaregistro adattacampo adattalayout al allineacentro allineadestra allineasinistra ap apagina appendix barrainterazione barrasincronizzazione bastablocchi bastafile cambiaafontdeltesto campi camporiempimento cap capello chapter chim circondato citazione clip clonacampo colonna colore coloregrigio commento completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister confrontagruppocolori confrontatavolozza convertinumero copiacampo correggispaziobianco coupledregister crlf da daqualcheparte data datadioggi datareferral definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface definisci definisciambientefontdeltesto definisciblocco definiscibloccosezione definiscibuffer definiscicampo definiscicapoversi definiscicolore definisciconversione definiscidescrizione definiscidimensionicarta definiscielenco definiscielencocombinato definiscienumerazione definiscietichetta definiscifigurasimbolo definiscifont definiscifontdeltesto definisciformatoriferimento definiscigruppocolori definisciincorniciato definisciiniziatermina definiscilistariferimenti definiscilogo definiscimakeup definiscimarcatura definiscimenuinterazione definiscimenuinterazione definiscimodellotabella definiscioggettomobile definisciordinamento definiscioutput definisciprofilo definisciprogramma definisciregistro definiscirientro definisciriferimento definiscirigovuoto definiscisezione definiscisimbolo definiscisinonimi definiscisinonimofont definiscisottocampo definiscisovrapposizione definiscistackcampi definiscitabulato definiscitavolozza definiscitesta definiscitesto definiscitestoincorniciato definiscitype definiscityping definisciversion description determinacarattersticheelenco determinanumerotesta disabilitamenuinterazione el elaborablocchi elaborapagina elementi elemento emptylines enumeration etichette figuraesterna fondo forzablocchi framedtext frazione giornosettimana griglia hl impaccato impostaallineamento impostaambientefontdeltesto impostaampiezzariga impostabarrainterazione impostabarrasincronizzazione impostablocchimargine impostablocco impostabloccosezione impostabuffer impostacampi impostacampo impostacapoversi impostacaption impostacaptions impostacima impostaclippling impostacolonne impostacolore impostacolori impostacombinazioni impostacommento impostadefinizionenotepdp impostadescrizioni impostadimensionicarta impostaelementi impostaelenco impostaelencocombinato impostaenumerazioni impostafigureesterne impostafondo impostafontdeltesto impostaforms impostaformule impostaincorniciato impostainmargine impostainstestazione impostainterazione impostainterlinea impostalayout impostalegenda impostalineemargine impostalineenere impostalineeriempimento impostalineesottili impostalineetesto impostalingua impostalistariferimenti impostamaiuscole impostamakeup impostamarcatura impostamenuinterazione impostamenzione impostanotepdp impostanumerazione impostanumerazionecapoversi impostanumerazionepagina impostanumerazionerighe impostanumeropagina impostanumerosottopagina impostanumerotesta impostaoggettimobili impostaoggettomobile impostaordinamento impostaoutput impostaparranging impostapdp impostapiustretto impostaposizionamento impostaposizionamentoopposti impostaprofili impostaprogrammi impostapubblicazioni impostapulsanti impostaregistro impostarientri impostarientro impostariferimento impostarighe impostarigheriempimento impostarigovuoto impostarotazione impostaschermi impostaschermointerazione impostasegnosillabazione impostasetsimboli impostasezione impostasfondi impostasfondo impostasincronizzazione impostasinonimi impostasistema impostasottolinea impostaspaziatura impostaspaziobianco impostaspezzamentooggettomobile impostastrut impostatab impostatabelle impostatabulato impostatavolozza impostatesta impostateste impostatesticima impostatestifondo impostatestiincorniciati impostatestiintestazioni impostatestipdp impostatesto impostatestoetichette impostatestointestazioni impostatestotesti impostatolleranza impostatransizionepagina impostatype impostatyping impostaurl impostaversioni in inaltromargine incorniciato indentation indestra ininner inmargine inouter inriga insinistra installalingua intorno labeling lettera lettere lineamargine lineanera lineasottile lineatesto lineenere lineeriempimento lineesottili lingua linguaprincipale listsymbol loadsorts loadsynonyms logcampi mapfontsize mar marcatura marcaversione matematica mediaeval menzione mese mettielenco mettielencocombinato mettielencocombinato mettifiancoafianco mettiformula mettiingriglia mettilegenda mettiloghi mettinotepdp mettinotepdplocali mettiregistro mettiregistro mettisegnalibro mettisottoformula mettiunosullaltro mostraambientefontdeltesto mostracampi mostracolore mostracornice mostrafiguresterne mostrafontdeltesto mostragriglia mostragruppocolori mostraimpostazioni mostralyout mostramakeup mostrasetsimboli mostrastampa mostrastruts mostratavolozza name nascondiblocchi nextsection nienteelenco nientelineecimafondo nientelineintestazionepdp nientemarcatura nienterientro nientespazio nientespaziobianco nocap nop nota notapdp numeri numeriromani numerotesta numerotestacorrente pagina paragraph paroladestra part ped pedap placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist posizione prendibuffer prendimarcatura programma pubblicazione pulsante pulsantinterazione punti qualcheriga ran referral register reimposta reimpostamarcatura reservefloat resettextcontent rientro rif riferimento riferimentopagina riferimentotesto riflessione rigariempimento rigovuoto ruota saltablocchi sbarrati sbarrato scala schermo scrividentroelenco scriviinelenco scriviinlistariferimenti scriviinregistro section seeregister segnalibro seguiprofilo seguiversione seguiversioneprofilo selezionablocchi selezionacarta selezionaversione separamarcatura settext setupfonthandling setupfontsynonym setupinterlinespace2 setupitemgroup setuplistalternative setuppaper sfondo sim simbolo sincronizza sopralinea sopralinee sort sottolinea sottolinee spazifissi spazio spaziobianco spezzaoggettomobile spostaagriglia stackcampi startalignment startambiente startbuffer startbuffer startcitazione startcolore startcolumns startcombination startcommento startcomponenet startdescription startdocument startenumeration startfatto startfigure startfloattext startformula startframedtext starthiding startimpaccato startitemgroup startlegend startline startlineamargine startlineatesto startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmenuinterattivo startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodotto startprofile startprogetto startregister startsfondo startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversione stirato stopalignment stopambiente stopbuffer stopbuffer stopcitazione stopcolore stopcolumns stopcombination stopcommento stopcomponenet stopdescription stopdocument stopenumeration stopfatto stopfigure stopfloattext stopformula stopframedtext stophiding stopimpaccato stopitemgroup stoplegend stopline stoplineamargine stoplineatesto stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmenuinterattivo stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodotto stopprofile stopprogetto stopsfondo stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversione sub subject subsection subsubject subsubsection subsubsubject synonym tab testa testoetichetta testoinmargine testoinstestazioni testonotapdp testoriempimento tex tieniblocchi tipopagina title tooltip traduci typ type typebuffer typefile usaURL usablocco usacodifica usacolonnasonoraesterna usacomandi usadocumentoesterno usafiguraesterna usafileesterni usafileesterno usamodulo usariferimenti usasimboli usaspecialita usedirectory usetypescript usetypescriptfile vaia vaiabox vaigiu versione vl
\ No newline at end of file
diff --git a/context/data/context-jedit-nl.xml b/context/data/context-jedit-nl.xml
index da26f1a11..a3cdafebc 100644
--- a/context/data/context-jedit-nl.xml
+++ b/context/data/context-jedit-nl.xml
@@ -1,2 +1,2 @@
- CAP Cap Caps Letter Letters MAAND Romeins WEEKDAG WOORD WOORDEN Woord Woorden about achtergrond appendix bepaalkopnummer bepaallijstkenmerken blanko blokje blokjes blokkeerinteractiemenu bookmark breuk but button cap chapter chem cijfers citaat citeer clip commentaar completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms converteernummer copieerveld corrigeerwitruimte coupledregister crlf datum definieer definieeralineas definieerbeeldmerk definieerblanko definieerblok definieerbuffer definieerconversie definieerfiguursymbool definieerfont definieerinteractiemenu definieerinteractiemenu definieerkadertekst definieerkleur definieerkleurgroep definieerkop definieerkorps definieerkorpsomgeving definieerlijst definieermarkering definieeromlijnd definieeropmaak definieeroverlay definieerpalet definieerpapierformaat definieerplaatsblok definieerprofiel definieerprogramma definieerreferentie definieerreferentieformaat definieerreferentielijst definieerregister definieersamengesteldelijst definieersectie definieersectieblok definieersorteren definieerstartstop definieersubveld definieersymbool definieersynoniemen definieertabelvorm definieertabulatie definieertekst definieertype definieertypen definieeruitvoer definieerveld definieerveldstapel definieerversie description doordefinieren doorlabelen doornummeren doorspringen doorstreep doorstrepen dunnelijn dunnelijnen eenregel enumeration ergens externfiguur forceerblokken framedtext gebruikURL gebruikblokken gebruikcommandos gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur gebruikexterngeluidsfragment gebruikmodule gebruikreferenties gebruikspecials gebruiksymbolen geenblokkenmeer geenbovenenonderregels geenfilesmeer geenhoofdenvoetregels geenlijst geenmarkering geenspatie geenwitruimte grijskleur haalbuffer haalmarkering haarlijn handhaafblokken hl hoofdtaal hoog huidigedatum huidigekopnummer in inanderemarge inbinnen inbuiten indentation inlijnd inlinker inmarge inrechter inregel inspringen installeertaal interactiebalk interactiebuttons invullijnen invulregel invultekst invulveld items its kantlijn kenmerk kenmerkdatum kleur kloonveld kolom kop kopnummer koppeldocument koppelmarkering koppelpagina koppelpapier koppelregister koptekst laag labeling labels labeltekst laho legeregels letter letters lijstsymbool loadsorts loadsynonyms maand mar margetekst markeer markeerversie mediaeval naar naarbox name nextsection nietinspringen nocap noot nop omlaag omlijnd onderstreep onderstrepen ontkoppelmarkering op opelkaar oppagina overstreep overstrepen pagina paginareferentie paragraph part paslayoutaan passeerblokken passendveld plaatsbeeldmerken plaatsbookmarks plaatsformule plaatslegenda plaatslijst plaatslokalevoetnoten plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatsplaatsblok plaatsreferentielijst plaatsregister plaatsregister plaatssamengesteldelijst plaatssamengesteldelijst plaatssubformule plaatsvoetnoten placelistoffloats placelistofsorts placelistofsynonyms positioneer programma publicatie punten ran ref referentie regellinks regelmidden regelrechts register registreervelden reservefloat reset resetmarkering resettextcontent romeins rooster roteer schaal scherm schrijfnaarlijst schrijfnaarreferentielijst schrijfnaarregister schrijftussenlijst section seeregister selecteerblokken selecteerpapier selecteerversie setuplistalternative som soortpagina sort spatie spiegel splitsplaatsblok startachtergrond startalignment startbuffer startbuffer startcitaat startcolumns startcombination startcommentaar startdescription startdocument startenumeration startfigure startfloattext startformula startframedtext startgeg starthiding startinteractiemenu startitemgroup startkantlijn startkleur startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startnamemakeup startnarrower startomgeving startonderdeel startopelkaar startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttekstlijn starttyping startunpacked startversie stelachtergrondenin stelachtergrondin stelalineasin stelarrangerenin stelblankoin stelblokin stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin stelboventekstenin stelbufferin stelbuttonsin stelciterenin stelclipin stelcombinatiesin stelcommentaarin steldoordefinierenin steldoornummerenin steldoorspringenin steldunnelijnenin stelexternefigurenin stelformulesin stelformulierenin stelhoofdin stelhoofdtekstenin stelinmargein stelinspringenin stelinteractiebalkin stelinteractiein stelinteractiemenuin stelinteractieschermin stelinterliniein stelinterliniein stelinvullijnenin stelinvulregelsin stelitemgroepin stelitemsin stelkadertekstenin stelkantlijnin stelkapitalenin stelkleurenin stelkleurin stelkolommenin stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin stelkoptekstin stelkorpsin stelkorpsomgevingin stellabeltekstin stellayoutin stellegendain stellijndiktein stellijstin stelmargeblokkenin stelmarkeringin stelnaastplaatsenin stelnummerenin stelomlijndin stelonderin stelonderstrepenin stelondertekstenin stelopmaakin stelpaginanummerin stelpaginanummeringin stelpaginaovergangenin stelpaletin stelpapierformaatin stelpapierin stelparagraafnummerenin stelplaatsblokin stelplaatsblokkenin stelplaatsbloksplitsenin stelpositionerenin stelprofielenin stelprogrammasin stelpublicatiesin stelrastersin stelreferentielijstin stelrefererenin stelregelnummerenin stelregelsin stelregisterin stelroterenin stelsamengesteldelijstin stelsectieblokin stelsectiein stelsmallerin stelsorterenin stelspatieringin stelstrutin stelsubpaginanummerin stelsymboolsetin stelsynchronisatiebalkin stelsynchronisatiein stelsynoniemenin stelsysteemin steltaalin steltabellenin steltabin steltabulatiein steltekstin steltekstinhoudin steltekstlijnenin stelteksttekstenin steltolerantiein steltypein steltypenin steluitlijnenin steluitvoerin stelurlin stelveldenin stelveldin stelversiesin stelvoetin stelvoetnootdefinitiein stelvoetnotenin stelvoettekstenin stelwitruimtein stopachtergrond stopalignment stopbuffer stopbuffer stopcitaat stopcolumns stopcombination stopcommentaar stopdescription stopdocument stopenumeration stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stopinteractiemenu stopitemgroup stopkantlijn stopkleur stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopnamemakeup stopnarrower stopomgeving stoponderdeel stopopelkaar stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptekstlijn stoptyping stopunpacked stopversie sub subject subsection subsubject subsubsection subsubsubject suggestie switchnaarkorps sym symbool synchronisatiebalk synchroniseer synonym taal tab tekstlijn tekstreferentie tex title toonexternefiguren toongrid tooninstellingen toonkader toonkleur toonkleurgroep toonkorps toonkorpsomgeving toonlayout toonopmaak toonpalet toonprint toonstruts toonsymboolset toonvelden typ type typebuffer typefile uit uitgerekt usecodering usedirectory vastespaties veld veldstapel verbergblokken vergelijkkleurgroep vergelijkpalet verplaatsopgrid versie vertaal verwerkblokken verwerkpagina vl voetnoot voetnoottekst volgprofiel volgprofielversie volgversie volledigregister weekdag wiskunde witruimte woordrechts
\ No newline at end of file
+ CAP Cap Caps Letter Letters MAAND Romeins WEEKDAG WOORD WOORDEN Woord Woorden about achtergrond appendix bepaalkopnummer bepaallijstkenmerken blanko blokje blokjes blokkeerinteractiemenu bookmark breuk but button cap chapter chem cijfers citaat citeer clip commentaar completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms converteernummer copieerveld corrigeerwitruimte coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface definieer definieeralineas definieerbeeldmerk definieerblanko definieerblok definieerbuffer definieerconversie definieerfiguursymbool definieerfont definieerfontsynoniem definieerinteractiemenu definieerinteractiemenu definieerkadertekst definieerkleur definieerkleurgroep definieerkop definieerkorps definieerkorpsomgeving definieerlijst definieermarkering definieeromlijnd definieeropmaak definieeroverlay definieerpalet definieerpapierformaat definieerplaatsblok definieerprofiel definieerprogramma definieerreferentie definieerreferentieformaat definieerreferentielijst definieerregister definieersamengesteldelijst definieersectie definieersectieblok definieersorteren definieerstartstop definieersubveld definieersymbool definieersynoniemen definieertabelvorm definieertabulatie definieertekst definieertype definieertypen definieeruitvoer definieerveld definieerveldstapel definieerversie description doordefinieren doorlabelen doornummeren doorspringen doorstreep doorstrepen dunnelijn dunnelijnen eenregel enumeration ergens externfiguur forceerblokken framedtext gebruikURL gebruikblokken gebruikcommandos gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur gebruikexterngeluidsfragment gebruikmodule gebruikreferenties gebruikspecials gebruiksymbolen gebruiktypescript gebruiktypescriptfile geenblokkenmeer geenbovenenonderregels geenfilesmeer geenhoofdenvoetregels geenlijst geenmarkering geenspatie geenwitruimte grijskleur haalbuffer haalmarkering haarlijn handhaafblokken hl hoofdtaal hoog huidigedatum huidigekopnummer in inanderemarge inbinnen inbuiten indentation inlijnd inlinker inmarge inrechter inregel inspringen installeertaal interactiebalk interactiebuttons invullijnen invulregel invultekst invulveld items its kantlijn kenmerk kenmerkdatum kleur kloonveld kolom kop kopnummer koppeldocument koppelmarkering koppelpagina koppelpapier koppelregister koptekst laag labeling labels labeltekst laho legeregels letter letters lijstsymbool loadsorts loadsynonyms maand mapfontsize mar margetekst markeer markeerversie mediaeval naar naarbox name nextsection nietinspringen nocap noot nop omlaag omlijnd onderstreep onderstrepen ontkoppelmarkering op opelkaar oppagina overstreep overstrepen pagina paginareferentie paragraph part paslayoutaan passeerblokken passendveld plaatsbeeldmerken plaatsbookmarks plaatsformule plaatslegenda plaatslijst plaatslokalevoetnoten plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatsplaatsblok plaatsreferentielijst plaatsregister plaatsregister plaatssamengesteldelijst plaatssamengesteldelijst plaatssubformule plaatsvoetnoten placelistoffloats placelistofsorts placelistofsynonyms positioneer programma publicatie punten ran ref referentie regellinks regelmidden regelrechts register registreervelden reservefloat reset resetmarkering resettextcontent romeins rooster roteer schaal scherm schrijfnaarlijst schrijfnaarreferentielijst schrijfnaarregister schrijftussenlijst section seeregister selecteerblokken selecteerpapier selecteerversie setupfonthandling setupfontsynonym setupinterlinespace2 setuplistalternative som soortpagina sort spatie spiegel splitsplaatsblok startachtergrond startalignment startbuffer startbuffer startcitaat startcolumns startcombination startcommentaar startdescription startdocument startenumeration startfigure startfloattext startformula startframedtext startgeg starthiding startinteractiemenu startitemgroup startkantlijn startkleur startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startnamemakeup startnarrower startomgeving startonderdeel startopelkaar startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttekstlijn starttyping startunpacked startversie stelachtergrondenin stelachtergrondin stelalineasin stelarrangerenin stelblankoin stelblokin stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin stelboventekstenin stelbufferin stelbuttonsin stelciterenin stelclipin stelcombinatiesin stelcommentaarin steldoordefinierenin steldoornummerenin steldoorspringenin steldunnelijnenin stelexternefigurenin stelformulesin stelformulierenin stelhoofdin stelhoofdtekstenin stelinmargein stelinspringenin stelinteractiebalkin stelinteractiein stelinteractiemenuin stelinteractieschermin stelinterliniein stelinvullijnenin stelinvulregelsin stelitemgroepin stelitemsin stelkadertekstenin stelkantlijnin stelkapitalenin stelkleurenin stelkleurin stelkolommenin stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin stelkoptekstin stelkorpsin stelkorpsomgevingin stellabeltekstin stellayoutin stellegendain stellijndiktein stellijstin stelmargeblokkenin stelmarkeringin stelnaastplaatsenin stelnummerenin stelomlijndin stelonderin stelonderstrepenin stelondertekstenin stelopmaakin stelpaginanummerin stelpaginanummeringin stelpaginaovergangenin stelpaletin stelpapierformaatin stelpapierin stelparagraafnummerenin stelplaatsblokin stelplaatsblokkenin stelplaatsbloksplitsenin stelpositionerenin stelprofielenin stelprogrammasin stelpublicatiesin stelrastersin stelreferentielijstin stelrefererenin stelregelnummerenin stelregelsin stelregisterin stelroterenin stelsamengesteldelijstin stelsectieblokin stelsectiein stelsmallerin stelsorterenin stelspatieringin stelstrutin stelsubpaginanummerin stelsymboolsetin stelsynchronisatiebalkin stelsynchronisatiein stelsynoniemenin stelsysteemin steltaalin steltabellenin steltabin steltabulatiein steltekstin steltekstinhoudin steltekstlijnenin stelteksttekstenin steltolerantiein steltypein steltypenin steluitlijnenin steluitvoerin stelurlin stelveldenin stelveldin stelversiesin stelvoetin stelvoetnootdefinitiein stelvoetnotenin stelvoettekstenin stelwitruimtein stopachtergrond stopalignment stopbuffer stopbuffer stopcitaat stopcolumns stopcombination stopcommentaar stopdescription stopdocument stopenumeration stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stopinteractiemenu stopitemgroup stopkantlijn stopkleur stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopnamemakeup stopnarrower stopomgeving stoponderdeel stopopelkaar stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptekstlijn stoptyping stopunpacked stopversie sub subject subsection subsubject subsubsection subsubsubject suggestie switchnaarkorps sym symbool synchronisatiebalk synchroniseer synonym taal tab tekstlijn tekstreferentie tex title toonexternefiguren toongrid tooninstellingen toonkader toonkleur toonkleurgroep toonkorps toonkorpsomgeving toonlayout toonopmaak toonpalet toonprint toonstruts toonsymboolset toonvelden typ type typebuffer typefile uit uitgerekt usecodering usedirectory vastespaties veld veldstapel verbergblokken vergelijkkleurgroep vergelijkpalet verplaatsopgrid versie vertaal verwerkblokken verwerkpagina vl voetnoot voetnoottekst volgprofiel volgprofielversie volgversie volledigregister weekdag wiskunde witruimte woordrechts
\ No newline at end of file
diff --git a/context/data/context-jedit-ro.xml b/context/data/context-jedit-ro.xml
index d0822471d..e645f88f4 100644
--- a/context/data/context-jedit-ro.xml
+++ b/context/data/context-jedit-ro.xml
@@ -1,2 +1,2 @@
- CAP CUVANT CUVINTE Cap Caps Cuvant Cuvinte LUNA Litera Litere Numereromane ZIDINSAPTAMANA adapteazaaspect adubuffer adumarcaje afiseazaaspect afiseazacampuri afiseazaculoare afiseazafiguriexterne afiseazafonttext afiseazagrid afiseazagrupculoare afiseazamakeup afiseazamediufonttext afiseazapaleta afiseazarama afiseazasetari afiseazasetsimboluri afiseazastruts afiseazatiparire aliniat aliniatcentru aliniatdreapta aliniatstanga appendix ascundeblocuri barainteractiune barasincronizare barasus blanc but butoaneinteractiune buton camp campumplere cap chapter chem citat clip cloneazacamp coloana comentariu comparagrupculoare comparapaleta completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister convertestenumar copiazacamp corecteazaspatiualb coupledregister crlf culoare culoaregri cupleazadocument cupleazamarcaje cupleazaregistru cuvantdreapta data datacurenta datareferit decupleazamarcaje defineste definestealiat definesteantet definesteblanc definestebloc definesteblocsectiune definestebuffer definestecamp definesteconversie definesteculoare definestedescriere definestedimensiunehartie definesteenumerare definesteeticheta definestefloat definestefont definestefonttext definesteformatreferinte definestegrupculori definesteinconjurare definestelista definestelistacombinata definestelistareferinte definestelogo definestemakeup definestemarcaje definestemediulfonttext definestemeniuinteractiune definestemeniuinteractiune definesteoutput definesteoverlay definestepaleta definesteparagraf definesteprofil definesteprogram definestereferinte definesteregistru definestesablontabel definestesectiune definestesimbol definestesimbolfigura definestesinonim definestesortare definestestartstop definestestivacampuri definestesubcamp definestetabulatori definestetext definestetexteinconjurate definestetextinconjurat definestetyping definesteversiune definetype description despre determinacaracteristicilelistei determinanumartitlu dezactiveazameniuinteractiune din dute dutebox ecran el element element emptylines enumeration etichete faraaliniat farafisiere faraliniiantetsisubsol faraliniisussijos faralista faramarcaje faraspatiu faraspatiualb figuraexterna firdepar folosesteURL folosestebloc folosestecodificarea folosestecomenzi folosestedocumentextern folosestefiguraexterna folosestefisiereexterne folosestefisierextern folosestemodul folosestemuzicaexterna folosestereferinte folosestesimboluri folosestespeciale footnotetext forteazablocuri fractie framed framedtext fundal gatablocuri grid hartiedubla hl impachetat impartefloat in inalt inaltamargine indentation indreapta inframed ininner injos inlinie inouter instalarelimba instanga intins jos jossus la labeling lapagina limba limbaprincipala liniemargine linieneagra liniepeste liniesubtire linieumplere liniinegre liniipeste liniisubtiri listsymbol litera litere loadsorts loadsynonyms logcampuri luna mar marcaje marcheazaversiune marginal matematica mediaeval minicitat mutapegrid name nextsection nocap nop nota notasubsol numartitlu numartitlucurent numere numereromane olinie pagina paginadubla paragraph part pastreazablocuri placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist plaseazapegrid plaseazasemnecarte potrivestecamp pozitie proceseazabloc proceseazapagina program publicatie puncte punedeasuprafiecareia punefatainfata puneformula punelegenda punelista punelistacombinata punelistacombinata punelogouri punenotesubsol punenotesubsollocale puneregistru puneregistru punesubformula ran ref referinta referintapagina referintatext referit reflexie register reservefloat reset reseteazamarcaje resettextcontent riglatext rigleumplere roteste saripesteblocuri scala scriebuffer scrieinlista scrieinlistareferinte scrieinregistru scrieintreliste section seeregister selecteazablocuri selecteazahartie selecteazaversiune semncarte setarebarasincronizare setarelimba setareoutput setarepozitie setaresincronizare seteazaaliniat seteazaaliniate seteazaalinierea seteazaantet seteazaaranjareapag seteazaaspect seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune seteazablocurimarginale seteazabuffer seteazabutoane seteazacamp seteazacampuri seteazaclipping seteazacoloane seteazacombinari seteazacomentariu seteazaculoare seteazaculori seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie seteazaecrane seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafiguriexterne seteazafloat seteazafloats seteazafonttext seteazaformulare seteazaformule seteazafundal seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust seteazainteractiunea seteazajos seteazalegenda seteazalegenda seteazalegendele seteazaliniesilabe seteazaliniesubtire seteazalinii seteazaliniimargine seteazaliniinegre seteazaliniiumplere seteazalista seteazalistacombinata seteazalistareferinte seteazamajuscule seteazamakeup seteazamarcaje seteazamarginal seteazamediulfonttext seteazameniuinteractiune seteazaminicitat seteazanotasubsol seteazanumarpagina seteazanumarsubpagina seteazanumartitlu seteazanumerotare seteazanumerotarelinii seteazanumerotarepagina seteazanumerotareparagrafe seteazapaleta seteazaparagrafe seteazaplasareaopozita seteazaprofile seteazaprograme seteazapublicatii seteazareferinte seteazaregistru seteazarigletext seteazarigleumplere seteazarotare seteazasectiune seteazasimbol seteazasinonime seteazasistem seteazasortare seteazaspatiu seteazaspatiualb seteazaspatiuinterliniar seteazaspatiuinterliniar seteazastrut seteazasublinie seteazasubsol seteazasus seteazatab seteazatabele seteazatabulatori seteazatext seteazatexteantet seteazatextejos seteazatextesubsol seteazatextesus seteazatextetext seteazatexteticheta seteazatexttitlu seteazatitlu seteazatitluri seteazatoleranta seteazatranzitiepagina seteazatype seteazatyping seteazaurl seteazaversiuni settextcontent setupitemgroup setuplistalternative setuppaper sim simbol sincronizeaza sort spatiifixate spatiu spatiualb startalignment startbuffer startbuffer startcitat startcolumns startcombination startcomentariu startcomponenta startculoare startdescription startdocument startenumeration startfact startfigure startfloattext startformula startframedtext startfundal starthiding startimpachetat startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startliniemargine startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmediu startmeniuinteractiune startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodus startprofile startproiect startregister startriglatext startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversiune stivacampuri stopalignment stopbuffer stopbuffer stopcitat stopcolumns stopcombination stopcomentariu stopcomponenta stopculoare stopdescription stopdocument stopenumeration stopfact stopfigure stopfloattext stopformula stopframedtext stopfundal stophiding stopimpachetat stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stopliniemargine stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmediu stopmeniuinteractiune stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodus stopprofile stopproiect stopriglatext stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversiune sub subject sublinie sublinii subsection subsubject subsubsection subsubsubject supralinie synonym tab tex texteticheta textmarginal texttitlu textumplere tippagina title titlu tooltip traduce trecilafonttext typ type typefile undeva urmeazaprofil urmeazaversiune urmeazaversiuneprofil usedirectory versiune vl zidinsaptamana
\ No newline at end of file
+ CAP CUVANT CUVINTE Cap Caps Cuvant Cuvinte LUNA Litera Litere Numereromane ZIDINSAPTAMANA adapteazaaspect adubuffer adumarcaje afiseazaaspect afiseazacampuri afiseazaculoare afiseazafiguriexterne afiseazafonttext afiseazagrid afiseazagrupculoare afiseazamakeup afiseazamediufonttext afiseazapaleta afiseazarama afiseazasetari afiseazasetsimboluri afiseazastruts afiseazatiparire aliniat aliniatcentru aliniatdreapta aliniatstanga appendix ascundeblocuri barainteractiune barasincronizare barasus blanc but butoaneinteractiune buton camp campumplere cap chapter chem citat clip cloneazacamp coloana comentariu comparagrupculoare comparapaleta completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister convertestenumar copiazacamp corecteazaspatiualb coupledregister crlf culoare culoaregri cupleazadocument cupleazamarcaje cupleazaregistru cuvantdreapta data datacurenta datareferit decupleazamarcaje definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineste definestealiat definesteantet definesteblanc definestebloc definesteblocsectiune definestebuffer definestecamp definesteconversie definesteculoare definestedescriere definestedimensiunehartie definesteenumerare definesteeticheta definestefloat definestefont definestefonttext definesteformatreferinte definestegrupculori definesteinconjurare definestelista definestelistacombinata definestelistareferinte definestelogo definestemakeup definestemarcaje definestemediulfonttext definestemeniuinteractiune definestemeniuinteractiune definesteoutput definesteoverlay definestepaleta definesteparagraf definesteprofil definesteprogram definestereferinte definesteregistru definestesablontabel definestesectiune definestesimbol definestesimbolfigura definestesinonim definestesinonimfont definestesortare definestestartstop definestestivacampuri definestesubcamp definestetabulatori definestetext definestetexteinconjurate definestetextinconjurat definestetyping definesteversiune definetype definetypeface description despre determinacaracteristicilelistei determinanumartitlu dezactiveazameniuinteractiune din dute dutebox ecran el element element emptylines enumeration etichete faraaliniat farafisiere faraliniiantetsisubsol faraliniisussijos faralista faramarcaje faraspatiu faraspatiualb figuraexterna firdepar folosesteURL folosestebloc folosestecodificarea folosestecomenzi folosestedocumentextern folosestefiguraexterna folosestefisiereexterne folosestefisierextern folosestemodul folosestemuzicaexterna folosestereferinte folosestesimboluri folosestespeciale footnotetext forteazablocuri fractie framed framedtext fundal gatablocuri grid hartiedubla hl impachetat impartefloat in inalt inaltamargine indentation indreapta inframed ininner injos inlinie inouter instalarelimba instanga intins jos jossus la labeling lapagina limba limbaprincipala liniemargine linieneagra liniepeste liniesubtire linieumplere liniinegre liniipeste liniisubtiri listsymbol litera litere loadsorts loadsynonyms logcampuri luna mapfontsize mar marcaje marcheazaversiune marginal matematica mediaeval minicitat mutapegrid name nextsection nocap nop nota notasubsol numartitlu numartitlucurent numere numereromane olinie pagina paginadubla paragraph part pastreazablocuri placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist plaseazapegrid plaseazasemnecarte potrivestecamp pozitie proceseazabloc proceseazapagina program publicatie puncte punedeasuprafiecareia punefatainfata puneformula punelegenda punelista punelistacombinata punelistacombinata punelogouri punenotesubsol punenotesubsollocale puneregistru puneregistru punesubformula ran ref referinta referintapagina referintatext referit reflexie register reservefloat reset reseteazamarcaje resettextcontent riglatext rigleumplere roteste saripesteblocuri scala scriebuffer scrieinlista scrieinlistareferinte scrieinregistru scrieintreliste section seeregister selecteazablocuri selecteazahartie selecteazaversiune semncarte setarebarasincronizare setarelimba setareoutput setarepozitie setaresincronizare seteazaaliniat seteazaaliniate seteazaalinierea seteazaantet seteazaaranjareapag seteazaaspect seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune seteazablocurimarginale seteazabuffer seteazabutoane seteazacamp seteazacampuri seteazaclipping seteazacoloane seteazacombinari seteazacomentariu seteazaculoare seteazaculori seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie seteazaecrane seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafiguriexterne seteazafloat seteazafloats seteazafonttext seteazaformulare seteazaformule seteazafundal seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust seteazainteractiunea seteazajos seteazalegenda seteazalegenda seteazalegendele seteazaliniesilabe seteazaliniesubtire seteazalinii seteazaliniimargine seteazaliniinegre seteazaliniiumplere seteazalista seteazalistacombinata seteazalistareferinte seteazamajuscule seteazamakeup seteazamarcaje seteazamarginal seteazamediulfonttext seteazameniuinteractiune seteazaminicitat seteazanotasubsol seteazanumarpagina seteazanumarsubpagina seteazanumartitlu seteazanumerotare seteazanumerotarelinii seteazanumerotarepagina seteazanumerotareparagrafe seteazapaleta seteazaparagrafe seteazaplasareaopozita seteazaprofile seteazaprograme seteazapublicatii seteazareferinte seteazaregistru seteazarigletext seteazarigleumplere seteazarotare seteazasectiune seteazasimbol seteazasinonime seteazasistem seteazasortare seteazaspatiu seteazaspatiualb seteazaspatiuinterliniar seteazastrut seteazasublinie seteazasubsol seteazasus seteazatab seteazatabele seteazatabulatori seteazatext seteazatexteantet seteazatextejos seteazatextesubsol seteazatextesus seteazatextetext seteazatexteticheta seteazatexttitlu seteazatitlu seteazatitluri seteazatoleranta seteazatranzitiepagina seteazatype seteazatyping seteazaurl seteazaversiuni settextcontent setupfonthandling setupfontsynonym setupinterlinespace2 setupitemgroup setuplistalternative setuppaper sim simbol sincronizeaza sort spatiifixate spatiu spatiualb startalignment startbuffer startbuffer startcitat startcolumns startcombination startcomentariu startcomponenta startculoare startdescription startdocument startenumeration startfact startfigure startfloattext startformula startframedtext startfundal starthiding startimpachetat startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startliniemargine startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmediu startmeniuinteractiune startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodus startprofile startproiect startregister startriglatext startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversiune stivacampuri stopalignment stopbuffer stopbuffer stopcitat stopcolumns stopcombination stopcomentariu stopcomponenta stopculoare stopdescription stopdocument stopenumeration stopfact stopfigure stopfloattext stopformula stopframedtext stopfundal stophiding stopimpachetat stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stopliniemargine stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmediu stopmeniuinteractiune stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodus stopprofile stopproiect stopriglatext stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversiune sub subject sublinie sublinii subsection subsubject subsubsection subsubsubject supralinie synonym tab tex texteticheta textmarginal texttitlu textumplere tippagina title titlu tooltip traduce trecilafonttext typ type typefile undeva urmeazaprofil urmeazaversiune urmeazaversiuneprofil usedirectory usetypescript usetypescriptfile versiune vl zidinsaptamana
\ No newline at end of file
diff --git a/context/data/context.properties b/context/data/context.properties
index 97347bf59..48a8d0efe 100644
--- a/context/data/context.properties
+++ b/context/data/context.properties
@@ -374,11 +374,11 @@ Alt+F12|IDM_STOPEXECUTE|\
# install: fonts/truetype/hoekwater/lm/LMTypewriter10-Regular.ttf
if PLAT_WIN
- font.monospace=font:LMMono10-Regular,size:16
- font.errorfont=font:LMMono10-Regular,size:12
+ font.monospace=font:LMTypewriter10-Regular,size:14
+ font.errorfont=font:LMTypewriter10-Regular,size:12
if PLAT_GTK
- font.monospace=font:!lm mono 10 regular,size:16
+ font.monospace=font:!lm mono 10 regular,size:14
font.errorfont=font:!lm mono 10 regular,size:12
font.base=$(font.monospace)
diff --git a/doc/context/bib/bibmod-doc.pdf b/doc/context/bib/bibmod-doc.pdf
index 4051f3a24..7e122fbb1 100644
Binary files a/doc/context/bib/bibmod-doc.pdf and b/doc/context/bib/bibmod-doc.pdf differ
diff --git a/doc/context/bib/bibmod-doc.tex b/doc/context/bib/bibmod-doc.tex
index a4b8a395d..a2b246ee4 100644
--- a/doc/context/bib/bibmod-doc.tex
+++ b/doc/context/bib/bibmod-doc.tex
@@ -353,6 +353,7 @@ and select the parts that are needed for the current article.
`author' (\type{cont-au.bst}) sorts alphabetically on author and within that on year,
`title' (\type{cont-ti.bst}) sorts alphabetically on title and then on author and
year, and `short' (\type{cont-ab.bst}) sorts on the short key that is generated
+ by \BIBTEX. If \type{FILE} is given, it specifies an individual \type{.bst} file name used
by \BIBTEX.\NC\NR
\stoptabulate
diff --git a/fonts/map/dvipdfm/context/8r-base.map b/fonts/map/dvipdfm/context/8r-base.map
deleted file mode 100644
index d1ea38fb4..000000000
--- a/fonts/map/dvipdfm/context/8r-base.map
+++ /dev/null
@@ -1,78 +0,0 @@
-ucrb8r 8r ucrb8a
-ucrbo8r 8r ucrbo8a
-ucrr8r 8r ucrr8a
-ucrro8r 8r ucrro8a
-pcrb8r 8r ucrb8a
-pcrbo8r 8r ucrbo8a
-pcrr8r 8r ucrr8a
-pcrro8r 8r ucrro8a
-uhvb8r 8r uhvb8a
-uhvbo8r 8r uhvbo8a
-uhvr8r 8r uhvr8a
-uhvro8r 8r uhvro8a
-phvb8r 8r uhvb8a
-phvbo8r 8r uhvbo8a
-phvr8r 8r uhvr8a
-phvro8r 8r uhvro8a
-utmb8r 8r utmb8a
-utmbi8r 8r utmbi8a
-utmr8r 8r utmr8a
-utmri8r 8r utmri8a
-utmbo8r 8r utmb8a -s .167
-utmro8r 8r utmr8a -s .167
-ptmb8r 8r utmb8a
-ptmbi8r 8r utmbi8a
-ptmr8r 8r utmr8a
-ptmri8r 8r utmri8a
-ptmbo8r 8r utmb8a -s .167
-ptmro8r 8r utmr8a -s .167
-uplb8r 8r uplb8a
-uplbi8r 8r uplbi8a
-uplr8r 8r uplr8a
-uplri8r 8r uplri8a
-uplbo8r 8r uplb8a -s .167
-uplro8r 8r uplr8a -s .167
-pplb8r 8r uplb8a
-pplbi8r 8r uplbi8a
-pplr8r 8r uplr8a
-pplri8r 8r uplri8a
-pplbo8r 8r uplb8a -s .167
-pplro8r 8r uplr8a -s .167
-ubkd8r 8r ubkd8a
-ubkdi8r 8r ubkdi8a
-ubkl8r 8r ubkl8a
-ubkli8r 8r ubkli8a
-ubkdo8r 8r ubkd8a -s .167
-ubklo8r 8r ubkl8a -s .167
-pbkd8r 8r ubkd8a
-pbkdi8r 8r ubkdi8a
-pbkl8r 8r ubkl8a
-pbkli8r 8r ubkli8a
-pbkdo8r 8r ubkd8a -s .167
-pbklo8r 8r ubkl8a -s .167
-uzcmi8r 8r uzcmi8a
-pzcmi8r 8r uzcmi8a
-uncb8r 8r uncb8a
-uncbi8r 8r uncbi8a
-uncr8r 8r uncr8a
-uncri8r 8r uncri8a
-uncbo8r 8r uncb8a -s .167
-uncro8r 8r uncr8a -s .167
-pncb8r 8r uncb8a
-pncbi8r 8r uncbi8a
-pncr8r 8r uncr8a
-pncri8r 8r uncri8a
-pncbo8r 8r uncb8a -s .167
-pncro8r 8r uncr8a -s .167
-putb8r 8r putb8a
-putbi8r 8r putbi8a
-putr8r 8r putr8a
-putri8r 8r putri8a
-putbo8r 8r putb8a -s .167
-putro8r 8r putr8a -s .167
-bchb8r 8r bchb8a
-bchbi8r 8r bchbi8a
-bchr8r 8r bchr8a
-bchri8r 8r bchri8a
-bchbo8r 8r bchb8a -s .167
-bchro8r 8r bchr8a -s .167
diff --git a/fonts/map/dvipdfm/context/ec-base.map b/fonts/map/dvipdfm/context/ec-base.map
deleted file mode 100644
index 206a520cf..000000000
--- a/fonts/map/dvipdfm/context/ec-base.map
+++ /dev/null
@@ -1,78 +0,0 @@
-ucrb8t ec ucrb8a
-ucrbo8t ec ucrbo8a
-ucrr8t ec ucrr8a
-ucrro8t ec ucrro8a
-pcrb8t ec ucrb8a
-pcrbo8t ec ucrbo8a
-pcrr8t ec ucrr8a
-pcrro8t ec ucrro8a
-uhvb8t ec uhvb8a
-uhvbo8t ec uhvbo8a
-uhvr8t ec uhvr8a
-uhvro8t ec uhvro8a
-phvb8t ec uhvb8a
-phvbo8t ec uhvbo8a
-phvr8t ec uhvr8a
-phvro8t ec uhvro8a
-utmb8t ec utmb8a
-utmbi8t ec utmbi8a
-utmr8t ec utmr8a
-utmri8t ec utmri8a
-utmbo8t ec utmb8a -s .167
-utmro8t ec utmr8a -s .167
-ptmb8t ec utmb8a
-ptmbi8t ec utmbi8a
-ptmr8t ec utmr8a
-ptmri8t ec utmri8a
-ptmbo8t ec utmb8a -s .167
-ptmro8t ec utmr8a -s .167
-uplb8t ec uplb8a
-uplbi8t ec uplbi8a
-uplr8t ec uplr8a
-uplri8t ec uplri8a
-uplbo8t ec uplb8a -s .167
-uplro8t ec uplr8a -s .167
-pplb8t ec uplb8a
-pplbi8t ec uplbi8a
-pplr8t ec uplr8a
-pplri8t ec uplri8a
-pplbo8t ec uplb8a -s .167
-pplro8t ec upplr8a -s .167
-ubkd8t ec ubkd8a
-ubkdi8t ec ubkdi8a
-ubkl8t ec ubkl8a
-ubkli8t ec ubkli8a
-ubkdo8t ec ubkd8a -s .167
-ubklo8t ec ubkl8a -s .167
-pbkd8t ec ubkd8a
-pbkdi8t ec ubkdi8a
-pbkl8t ec ubkl8a
-pbkli8t ec ubkli8a
-pbkdo8t ec ubkd8a -s .167
-pbklo8t ec ubkl8a -s .167
-uzcmi8t ec uzcmi8a
-pzcmi8t ec uzcmi8a
-uncb8t ec uncb8a
-uncbi8t ec uncbi8a
-uncr8t ec uncr8a
-uncri8t ec uncri8a
-uncbo8t ec uncb8a -s .167
-uncro8t ec uncr8a -s .167
-pncb8t ec uncb8a
-pncbi8t ec uncbi8a
-pncr8t ec uncr8a
-pncri8t ec uncri8a
-pncbo8t ec uncb8a -s .167
-pncro8t ec uncr8a -s .167
-putb8t ec putb8a
-putbi8t ec putbi8a
-putr8t ec putr8a
-putri8t ec putri8a
-putbo8t ec putb8a -s .167
-putro8t ec putr8a -s .167
-bchb8t ec bchb8a
-bchbi8t ec bchbi8a
-bchr8t ec bchr8a
-bchri8t ec bchri8a
-bchbo8t ec bchb8a -s .167
-bchro8t ec bchr8a -s .167
diff --git a/fonts/map/dvipdfm/context/ec-os-public-lm.map b/fonts/map/dvipdfm/context/ec-os-public-lm.map
deleted file mode 100644
index 31b813b6c..000000000
--- a/fonts/map/dvipdfm/context/ec-os-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-ec-lmb10 lm-ec-os lmb10
-ec-lmbo10 lm-ec-os lmbo10
-ec-lmbx10 lm-ec-os lmbx10
-ec-lmbx12 lm-ec-os lmbx12
-ec-lmbx5 lm-ec-os lmbx5
-ec-lmbx6 lm-ec-os lmbx6
-ec-lmbx7 lm-ec-os lmbx7
-ec-lmbx8 lm-ec-os lmbx8
-ec-lmbx9 lm-ec-os lmbx9
-ec-lmbxi10 lm-ec-os lmbxi10
-ec-lmbxo10 lm-ec-os lmbxo10
-ec-lmcsc10 lm-ec-os lmcsc10
-ec-lmcsco10 lm-ec-os lmcsco10
-ec-lmr10 lm-ec-os lmr10
-ec-lmr12 lm-ec-os lmr12
-ec-lmr17 lm-ec-os lmr17
-ec-lmr5 lm-ec-os lmr5
-ec-lmr6 lm-ec-os lmr6
-ec-lmr7 lm-ec-os lmr7
-ec-lmr8 lm-ec-os lmr8
-ec-lmr9 lm-ec-os lmr9
-ec-lmri10 lm-ec-os lmri10
-ec-lmri12 lm-ec-os lmri12
-ec-lmri7 lm-ec-os lmri7
-ec-lmri8 lm-ec-os lmri8
-ec-lmri9 lm-ec-os lmri9
-ec-lmro10 lm-ec-os lmro10
-ec-lmro12 lm-ec-os lmro12
-ec-lmro17 lm-ec-os lmro17
-ec-lmro8 lm-ec-os lmro8
-ec-lmro9 lm-ec-os lmro9
-ec-lmss10 lm-ec-os lmss10
-ec-lmss12 lm-ec-os lmss12
-ec-lmss17 lm-ec-os lmss17
-ec-lmss8 lm-ec-os lmss8
-ec-lmss9 lm-ec-os lmss9
-ec-lmssbo10 lm-ec-os lmssbo10
-ec-lmssbx10 lm-ec-os lmssbx10
-ec-lmssdc10 lm-ec-os lmssdc10
-ec-lmssdo10 lm-ec-os lmssdo10
-ec-lmsso10 lm-ec-os lmsso10
-ec-lmsso12 lm-ec-os lmsso12
-ec-lmsso17 lm-ec-os lmsso17
-ec-lmsso8 lm-ec-os lmsso8
-ec-lmsso9 lm-ec-os lmsso9
-ec-lmssq8 lm-ec-os lmssq8
-ec-lmssqbo8 lm-ec-os lmssqbo8
-ec-lmssqbx8 lm-ec-os lmssqbx8
-ec-lmssqo8 lm-ec-os lmssqo8
-ec-lmtcsc10 lm-ec-os lmtcsc10
-ec-lmtcso10 lm-ec-os lmtcso10
-ec-lmtl10 lm-ec-os lmtl10
-ec-lmtlo10 lm-ec-os lmtlo10
-ec-lmtlc10 lm-ec-os lmtlc10
-ec-lmtlco10 lm-ec-os lmtlco10
-ec-lmtk10 lm-ec-os lmtk10
-ec-lmtko10 lm-ec-os lmtko10
-ec-lmtt10 lm-ec-os lmtt10
-ec-lmtt12 lm-ec-os lmtt12
-ec-lmtt8 lm-ec-os lmtt8
-ec-lmtt9 lm-ec-os lmtt9
-ec-lmtti10 lm-ec-os lmtti10
-ec-lmtto10 lm-ec-os lmtto10
-ec-lmvtt10 lm-ec-os lmvtt10
-ec-lmvtto10 lm-ec-os lmvtto10
-ec-lmvtl10 lm-ec-os lmvtl10
-ec-lmvtlo10 lm-ec-os lmvtlo10
-ec-lmvtk10 lm-ec-os lmvtk10
-ec-lmvtko10 lm-ec-os lmvtko10
diff --git a/fonts/map/dvipdfm/context/ec-public-lm.map b/fonts/map/dvipdfm/context/ec-public-lm.map
deleted file mode 100644
index 92b173fbd..000000000
--- a/fonts/map/dvipdfm/context/ec-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-ec-lmb10 lm-ec lmb10
-ec-lmbo10 lm-ec lmbo10
-ec-lmbx10 lm-ec lmbx10
-ec-lmbx12 lm-ec lmbx12
-ec-lmbx5 lm-ec lmbx5
-ec-lmbx6 lm-ec lmbx6
-ec-lmbx7 lm-ec lmbx7
-ec-lmbx8 lm-ec lmbx8
-ec-lmbx9 lm-ec lmbx9
-ec-lmbxi10 lm-ec lmbxi10
-ec-lmbxo10 lm-ec lmbxo10
-ec-lmcsc10 lm-ec lmcsc10
-ec-lmcsco10 lm-ec lmcsco10
-ec-lmr10 lm-ec lmr10
-ec-lmr12 lm-ec lmr12
-ec-lmr17 lm-ec lmr17
-ec-lmr5 lm-ec lmr5
-ec-lmr6 lm-ec lmr6
-ec-lmr7 lm-ec lmr7
-ec-lmr8 lm-ec lmr8
-ec-lmr9 lm-ec lmr9
-ec-lmri10 lm-ec lmri10
-ec-lmri12 lm-ec lmri12
-ec-lmri7 lm-ec lmri7
-ec-lmri8 lm-ec lmri8
-ec-lmri9 lm-ec lmri9
-ec-lmro10 lm-ec lmro10
-ec-lmro12 lm-ec lmro12
-ec-lmro17 lm-ec lmro17
-ec-lmro8 lm-ec lmro8
-ec-lmro9 lm-ec lmro9
-ec-lmss10 lm-ec lmss10
-ec-lmss12 lm-ec lmss12
-ec-lmss17 lm-ec lmss17
-ec-lmss8 lm-ec lmss8
-ec-lmss9 lm-ec lmss9
-ec-lmssbo10 lm-ec lmssbo10
-ec-lmssbx10 lm-ec lmssbx10
-ec-lmssdc10 lm-ec lmssdc10
-ec-lmssdo10 lm-ec lmssdo10
-ec-lmsso10 lm-ec lmsso10
-ec-lmsso12 lm-ec lmsso12
-ec-lmsso17 lm-ec lmsso17
-ec-lmsso8 lm-ec lmsso8
-ec-lmsso9 lm-ec lmsso9
-ec-lmssq8 lm-ec lmssq8
-ec-lmssqbo8 lm-ec lmssqbo8
-ec-lmssqbx8 lm-ec lmssqbx8
-ec-lmssqo8 lm-ec lmssqo8
-ec-lmtcsc10 lm-ec lmtcsc10
-ec-lmtcso10 lm-ec lmtcso10
-ec-lmtl10 lm-ec lmtl10
-ec-lmtlo10 lm-ec lmtlo10
-ec-lmtlc10 lm-ec lmtlc10
-ec-lmtlco10 lm-ec lmtlco10
-ec-lmtk10 lm-ec lmtk10
-ec-lmtko10 lm-ec lmtko10
-ec-lmtt10 lm-ec lmtt10
-ec-lmtt12 lm-ec lmtt12
-ec-lmtt8 lm-ec lmtt8
-ec-lmtt9 lm-ec lmtt9
-ec-lmtti10 lm-ec lmtti10
-ec-lmtto10 lm-ec lmtto10
-ec-lmvtt10 lm-ec lmvtt10
-ec-lmvtto10 lm-ec lmvtto10
-ec-lmvtl10 lm-ec lmvtl10
-ec-lmvtlo10 lm-ec lmvtlo10
-ec-lmvtk10 lm-ec lmvtk10
-ec-lmvtko10 lm-ec lmvtko10
diff --git a/fonts/map/dvipdfm/context/el-public-lm.map b/fonts/map/dvipdfm/context/el-public-lm.map
deleted file mode 100644
index 4c2c1b5d8..000000000
--- a/fonts/map/dvipdfm/context/el-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-el-lmb10 lm-el lmb10
-el-lmbo10 lm-el lmbo10
-el-lmbx10 lm-el lmbx10
-el-lmbx12 lm-el lmbx12
-el-lmbx5 lm-el lmbx5
-el-lmbx6 lm-el lmbx6
-el-lmbx7 lm-el lmbx7
-el-lmbx8 lm-el lmbx8
-el-lmbx9 lm-el lmbx9
-el-lmbxi10 lm-el lmbxi10
-el-lmbxo10 lm-el lmbxo10
-el-lmcsc10 lm-el lmcsc10
-el-lmcsco10 lm-el lmcsco10
-el-lmr10 lm-el lmr10
-el-lmr12 lm-el lmr12
-el-lmr17 lm-el lmr17
-el-lmr5 lm-el lmr5
-el-lmr6 lm-el lmr6
-el-lmr7 lm-el lmr7
-el-lmr8 lm-el lmr8
-el-lmr9 lm-el lmr9
-el-lmri10 lm-el lmri10
-el-lmri12 lm-el lmri12
-el-lmri7 lm-el lmri7
-el-lmri8 lm-el lmri8
-el-lmri9 lm-el lmri9
-el-lmro10 lm-el lmro10
-el-lmro12 lm-el lmro12
-el-lmro17 lm-el lmro17
-el-lmro8 lm-el lmro8
-el-lmro9 lm-el lmro9
-el-lmss10 lm-el lmss10
-el-lmss12 lm-el lmss12
-el-lmss17 lm-el lmss17
-el-lmss8 lm-el lmss8
-el-lmss9 lm-el lmss9
-el-lmssbo10 lm-el lmssbo10
-el-lmssbx10 lm-el lmssbx10
-el-lmssdc10 lm-el lmssdc10
-el-lmssdo10 lm-el lmssdo10
-el-lmsso10 lm-el lmsso10
-el-lmsso12 lm-el lmsso12
-el-lmsso17 lm-el lmsso17
-el-lmsso8 lm-el lmsso8
-el-lmsso9 lm-el lmsso9
-el-lmssq8 lm-el lmssq8
-el-lmssqbo8 lm-el lmssqbo8
-el-lmssqbx8 lm-el lmssqbx8
-el-lmssqo8 lm-el lmssqo8
-el-lmtcsc10 lm-el lmtcsc10
-el-lmtcso10 lm-el lmtcso10
-el-lmtl10 lm-el lmtl10
-el-lmtlo10 lm-el lmtlo10
-el-lmtlc10 lm-el lmtlc10
-el-lmtlco10 lm-el lmtlco10
-el-lmtk10 lm-el lmtk10
-el-lmtko10 lm-el lmtko10
-el-lmtt10 lm-el lmtt10
-el-lmtt12 lm-el lmtt12
-el-lmtt8 lm-el lmtt8
-el-lmtt9 lm-el lmtt9
-el-lmtti10 lm-el lmtti10
-el-lmtto10 lm-el lmtto10
-el-lmvtt10 lm-el lmvtt10
-el-lmvtto10 lm-el lmvtto10
-el-lmvtl10 lm-el lmvtl10
-el-lmvtlo10 lm-el lmvtlo10
-el-lmvtk10 lm-el lmvtk10
-el-lmvtko10 lm-el lmvtko10
diff --git a/fonts/map/dvipdfm/context/original-adobe-euro.map b/fonts/map/dvipdfm/context/original-adobe-euro.map
deleted file mode 100644
index fe5ddaca7..000000000
--- a/fonts/map/dvipdfm/context/original-adobe-euro.map
+++ /dev/null
@@ -1,12 +0,0 @@
-euromo
-euromob
-euromoi
-euromobi
-eurosa
-eurosab
-eurosai
-eurosabi eurosebi
-eurose
-euroseb
-eurosei
-eurosebi
diff --git a/fonts/map/dvipdfm/context/original-ams-base.map b/fonts/map/dvipdfm/context/original-ams-base.map
deleted file mode 100644
index ac0300d78..000000000
--- a/fonts/map/dvipdfm/context/original-ams-base.map
+++ /dev/null
@@ -1,39 +0,0 @@
-lasy5
-lasy6
-lasy7
-lasy8
-lasy9
-lasy10
-lasyb10
-lcircle10 lcircle1
-lcirclew10 lcirclew
-lcmss8
-lcmssb8
-lcmssi8
-line10
-linew10
-logo8
-logo9
-logo10
-logobf10
-logosl10
-msam5
-msam7
-msam10
-msbm5
-msbm7
-msbm10
-wncyb10
-wncyi10
-wncyr10
-wncysc10
-wncyss10
-manfnt
-icmex10
-icmmi8
-icmsy8
-icmtt8
-ilasy8
-ilcmss8
-ilcmssb8
-ilcmssi8
diff --git a/fonts/map/dvipdfm/context/original-ams-cmr.map b/fonts/map/dvipdfm/context/original-ams-cmr.map
deleted file mode 100644
index 4eadbe7bc..000000000
--- a/fonts/map/dvipdfm/context/original-ams-cmr.map
+++ /dev/null
@@ -1,79 +0,0 @@
-cmb10
-cmbsy6
-cmbsy7
-cmbsy8
-cmbsy9
-cmbsy10
-cmbx5
-cmbx6
-cmbx7
-cmbx8
-cmbx9
-cmbx10
-cmbx12
-cmbxsl10
-cmbxti10
-cmcsc10
-cmdunh10
-cmex10
-cmff10
-cmfi10
-cmfib8
-cminch
-cmitt10
-cmmib10
-cmmi5
-cmmi6
-cmmi7
-cmmi8
-cmmi9
-cmmi10
-cmmi12
-cmr5
-cmr6
-cmr7
-cmr8
-cmr9
-cmr10
-cmr12
-cmr17
-cmsl8
-cmsl9
-cmsl10
-cmsl12
-cmsltt10
-cmss8
-cmss9
-cmss10
-cmss12
-cmss17
-cmssbx10
-cmssdc10
-cmssi8
-cmssi9
-cmssi10
-cmssi12
-cmssi17
-cmssq8
-cmssqi8
-cmsy5
-cmsy6
-cmsy7
-cmsy8
-cmsy9
-cmsy10
-cmtcsc10
-cmtex8
-cmtex9
-cmtex10
-cmti7
-cmti8
-cmti9
-cmti10
-cmti12
-cmtt8
-cmtt9
-cmtt10
-cmtt12
-cmu10
-cmvtt10
diff --git a/fonts/map/dvipdfm/context/original-ams-euler.map b/fonts/map/dvipdfm/context/original-ams-euler.map
deleted file mode 100644
index d9fb37904..000000000
--- a/fonts/map/dvipdfm/context/original-ams-euler.map
+++ /dev/null
@@ -1,19 +0,0 @@
-euex10
-eufb5
-eufb7
-eufb10
-eufm5
-eufm7
-eufm10
-eurb5
-eurb7
-eurb10
-eurm5
-eurm7
-eurm10
-eusb5
-eusb7
-eusb10
-eusm5
-eusm7
-eusm10
diff --git a/fonts/map/dvipdfm/context/original-base.map b/fonts/map/dvipdfm/context/original-base.map
deleted file mode 100644
index a444b3ae5..000000000
--- a/fonts/map/dvipdfm/context/original-base.map
+++ /dev/null
@@ -1,40 +0,0 @@
-rsfs7
-rsfs5
-rsfs10
-fmvr8x marvosym
-fmvri8x marvosym -s .167
-contnav
-hans
-hans-sh
-uzdr
-pzdr
-usyr
-xyatip10
-xybsql10
-xybtip10
-xycirc10
-xydash10
-xycmat10
-xycmbt10
-xyeuat10
-xyeubt10
-xycmat11 xycmat10
-xycmbt11 xycmbt10
-xyeuat11 xyeuat10
-xyeubt11 xyeubt10
-xycmat12 xycmat10
-xycmbt12 xycmbt10
-xyeuat12 xyeuat10
-xyeubt12 xyeubt10
-zpeub
-zpeubi
-zpeubis
-zpeubit
-zpeubs
-zpeubt
-zpeur
-zpeuri
-zpeuris
-zpeurit
-zpeurs
-zpeurt
diff --git a/fonts/map/dvipdfm/context/original-context-symbol.map b/fonts/map/dvipdfm/context/original-context-symbol.map
deleted file mode 100644
index 0eb9859a0..000000000
--- a/fonts/map/dvipdfm/context/original-context-symbol.map
+++ /dev/null
@@ -1,3 +0,0 @@
-contnav
-hans
-hans-sh
diff --git a/fonts/map/dvipdfm/context/original-dummy.map b/fonts/map/dvipdfm/context/original-dummy.map
deleted file mode 100644
index 053291a29..000000000
--- a/fonts/map/dvipdfm/context/original-dummy.map
+++ /dev/null
@@ -1 +0,0 @@
-% no map entries
diff --git a/fonts/map/dvipdfm/context/original-empty.map b/fonts/map/dvipdfm/context/original-empty.map
deleted file mode 100644
index 053291a29..000000000
--- a/fonts/map/dvipdfm/context/original-empty.map
+++ /dev/null
@@ -1 +0,0 @@
-% no map entries
diff --git a/fonts/map/dvipdfm/context/original-micropress-informal.map b/fonts/map/dvipdfm/context/original-micropress-informal.map
deleted file mode 100644
index c7385e0df..000000000
--- a/fonts/map/dvipdfm/context/original-micropress-informal.map
+++ /dev/null
@@ -1,7 +0,0 @@
-ifrm10cm cm ifrg
-ifrb10cm cm ifb
-ifro10cm cm ifo
-ifbo10cm cm ifbo
-ifex10
-ifmi10
-ifsy10
diff --git a/fonts/map/dvipdfm/context/original-public-csr.map b/fonts/map/dvipdfm/context/original-public-csr.map
deleted file mode 100644
index 31193b1c7..000000000
--- a/fonts/map/dvipdfm/context/original-public-csr.map
+++ /dev/null
@@ -1,56 +0,0 @@
-csr5 csr1 csr5
-csr6 csr csr6
-csr7 csr csr7
-csr8 csr csr8
-csr9 csr csr9
-csr10 csr csr10
-csr12 csr csr12
-csr17 csr csr17
-csbx5 csr csbx5
-csbx6 csr csbx6
-csbx7 csr csbx7
-csbx8 csr csbx8
-csbx9 csr csbx9
-csbx10 csr csbx10
-csbx12 csr csbx12
-csb10 csr csb10
-csti7 csr csti7
-csti8 csr csti8
-csti9 csr csti9
-csti10 csr csti10
-csti12 csr csti12
-cstt8 cstt cstt8
-cstt9 cstt cstt9
-cstt10 cstt cstt10
-cstt12 cstt cstt12
-cssltt10 cstt cssltt10
-csvtt10 cstt csvtt10
-csss8 csr csss8
-csss9 csr csss9
-csss10 csr csss10
-csss12 csr csss12
-csss17 csr csss17
-csssi8 csr csssi8
-csssi9 csr csssi9
-csssi10 csr csssi10
-csssi12 csr csssi12
-csssi17 csr csssi17
-cssl8 csr cssl8
-cssl9 csr cssl9
-cssl10 csr cssl10
-cssl12 csr cssl12
-csssq8 csr csssq8
-csssqi8 csr csssqi8
-csssdc10 csr csssdc10
-csssbx10 csr csssbx10
-csinch csin csinch
-csdunh10 csr csdunh10
-csbxsl10 csr csbxsl10
-csff10 csr csff10
-csfib8 csr csfib8
-csbxti10 csr csbxti10
-csitt10 cstt csitt10
-csu10 csr csu10
-csfi10 csr csfi10
-cscsc10 csr1 cscsc10
-cstcsc10 cstt cstcsc10
diff --git a/fonts/map/dvipdfm/context/original-public-lm.map b/fonts/map/dvipdfm/context/original-public-lm.map
deleted file mode 100644
index 5be5fb550..000000000
--- a/fonts/map/dvipdfm/context/original-public-lm.map
+++ /dev/null
@@ -1,97 +0,0 @@
-cmb10 lm-rep-cmrm lmb10
-cmbx10 lm-rep-cmrm lmbx10
-cmbx12 lm-rep-cmrm lmbx12
-cmbx5 lm-rep-cmrm lmbx5
-cmbx6 lm-rep-cmrm lmbx6
-cmbx7 lm-rep-cmrm lmbx7
-cmbx8 lm-rep-cmrm lmbx8
-cmbx9 lm-rep-cmrm lmbx9
-cmbxsl10 lm-rep-cmrm lmbxo10
-cmbxti10 lm-rep-cmit lmbxi10
-cmbxti12 lm-rep-cmit lmbxti10
-cmbxti7 lm-rep-cmit lmbxti10
-cmcsc10 lm-rep-cmsc lmcsc10
-cmcsc8 lm-rep-cmsc lmcsc10
-cmcsc9 lm-rep-cmsc lmcsc10
-cminch lm-rep-cmin lmssbx10
-cmitt10 lm-rep-cmitt lmtti10
-cmitt12 lm-rep-cmitt lmtti10
-cmitt9 lm-rep-cmitt lmtti10
-cmr10 lm-rep-cmrm lmr10
-cmr12 lm-rep-cmrm lmr12
-cmr17 lm-rep-cmrm lmr17
-cmr5 lm-rep-cmsc lmr5
-cmr6 lm-rep-cmrm lmr6
-cmr7 lm-rep-cmrm lmr7
-cmr8 lm-rep-cmrm lmr8
-cmr9 lm-rep-cmrm lmr9
-cmsl10 lm-rep-cmrm lmro10
-cmsl12 lm-rep-cmrm lmro12
-cmsl6 lm-rep-cmrm lmro8
-cmsl8 lm-rep-cmrm lmro8
-cmsl9 lm-rep-cmrm lmro9
-cmsltt10 lm-rep-cmtt lmtto10
-cmsltt9 lm-rep-cmtt lmtto10
-cmss10 lm-rep-cmrm lmss10
-cmss12 lm-rep-cmrm lmss12
-cmss17 lm-rep-cmrm lmss17
-cmss8 lm-rep-cmrm lmss8
-cmss9 lm-rep-cmrm lmss9
-cmssbx10 lm-rep-cmrm lmssbx10
-cmssbxo10 lm-rep-cmrm lmssbo10
-cmssdc10 lm-rep-cmrm lmssdc10
-cmssi10 lm-rep-cmrm lmsso10
-cmssi12 lm-rep-cmrm lmsso12
-cmssi17 lm-rep-cmrm lmsso17
-cmssi8 lm-rep-cmrm lmsso8
-cmssi9 lm-rep-cmrm lmsso9
-cmssq8 lm-rep-cmrm lmssq8
-cmssqi8 lm-rep-cmrm lmssqo8
-cmtcsc10 lm-rep-cmtt lmtcsc10
-cmti10 lm-rep-cmit lmri10
-cmti12 lm-rep-cmit lmri12
-cmti7 lm-rep-cmit lmri7
-cmti8 lm-rep-cmit lmri8
-cmti9 lm-rep-cmit lmri9
-cmtt10 lm-rep-cmtt lmtt10
-cmtt12 lm-rep-cmtt lmtt12
-cmtt8 lm-rep-cmtt lmtt8
-cmtt9 lm-rep-cmtt lmtt9
-cmvtt10 lm-rep-cmrm lmvtt10
-cmbsy10
-cmbsy5
-cmbsy6 cmbsy7
-cmbsy7
-cmbsy8 cmbsy7
-cmbsy9 cmbsy10
-cmdunh10
-cmex10
-cmex7 cmex10
-cmex8 cmex10
-cmex9 cmex10
-cmff10
-cmfi10
-cmfib8
-cmmi10
-cmmi12
-cmmi5
-cmmi6
-cmmi7
-cmmi8
-cmmi9
-cmmib10
-cmmib5
-cmmib6 cmmib7
-cmmib7
-cmmib8 cmmib7
-cmmib9 cmmib10
-cmsy10
-cmsy5
-cmsy6
-cmsy7
-cmsy8
-cmsy9
-cmtex10
-cmtex8
-cmtex9
-cmu10 lm-rep-cmit lmri10
diff --git a/fonts/map/dvipdfm/context/original-public-plr.map b/fonts/map/dvipdfm/context/original-public-plr.map
deleted file mode 100644
index 51592efb7..000000000
--- a/fonts/map/dvipdfm/context/original-public-plr.map
+++ /dev/null
@@ -1,77 +0,0 @@
-plb10 plrm plb10
-plbsy10 plms plbsy10
-plbx5 plrm plbx5
-plbx6 plrm plbx6
-plbx7 plrm plbx7
-plbx8 plrm plbx8
-plbx9 plrm plbx9
-plbx10 plrm plbx10
-plbx12 plrm plbx12
-plbxsl10 plrm plbxsl10
-plbxti10 plit plbxti10
-plcsc10 plsc plcsc10
-pldunh10 plrm pldunh10
-plex9 plme plex9
-plex10 plme plex10
-plff10 plrm plff10
-plfi10 plit plfi10
-plfib8 plrm plfib8
-plinch plin plinch
-plitt10 plitt plitt10
-plmi5 plmi plmi5
-plmi6 plmi plmi6
-plmi7 plmi plmi7
-plmi8 plmi plmi8
-plmi9 plmi plmi9
-plmi10 plmi plmi10
-plmi12 plmi plmi12
-plmib10 plmi plmib10
-plr5 plsc plr5
-plr6 plrm plr6
-plr7 plrm plr7
-plr8 plrm plr8
-plr9 plrm plr9
-plr10 plrm plr10
-plr12 plrm plr12
-plr17 plrm plr17
-plsl8 plrm plsl8
-plsl9 plrm plsl9
-plsl10 plrm plsl10
-plsl12 plrm plsl12
-plsltt10 pltt plsltt10
-plss8 plrm plss8
-plss9 plrm plss9
-plss10 plrm plss10
-plss12 plrm plss12
-plss17 plrm plss17
-plssbi10 plrm plssbi10
-plssbx10 plrm plssbx10
-plssdc10 plrm plssdc10
-plssi8 plrm plssi8
-plssi9 plrm plssi9
-plssi10 plrm plssi10
-plssi12 plrm plssi12
-plssi17 plrm plssi17
-plssq8 plrm plssq8
-plssqi8 plrm plssqi8
-plsy5 plms plsy5
-plsy6 plms plsy6
-plsy7 plms plsy7
-plsy8 plms plsy8
-plsy9 plms plsy9
-plsy10 plms plsy10
-pltcsc10 pltt pltcsc10
-pltex8 plte pltex8
-pltex9 plte pltex9
-pltex10 plte pltex10
-plti7 plit plti7
-plti8 plit plti8
-plti9 plit plti9
-plti10 plit plti10
-plti12 plit plti12
-pltt8 pltt pltt8
-pltt9 pltt pltt9
-pltt10 pltt pltt10
-pltt12 pltt pltt12
-plu10 plit plu10
-plvtt10 plrm plvtt10
diff --git a/fonts/map/dvipdfm/context/original-public-vnr.map b/fonts/map/dvipdfm/context/original-public-vnr.map
deleted file mode 100644
index a840dd97c..000000000
--- a/fonts/map/dvipdfm/context/original-public-vnr.map
+++ /dev/null
@@ -1,55 +0,0 @@
-vnb10
-vnbx10
-vnbx12
-vnbx5
-vnbx6
-vnbx7
-vnbx8
-vnbx9
-vnbxsl10
-vnbxti10
-vncsc10
-vndunh10
-vnff10
-vnfi10
-vnfib8
-vnitt10
-vnr10
-vnr12
-vnr17
-vnr5
-vnr6
-vnr7
-vnr8
-vnr9
-vnsl10
-vnsl12
-vnsl8
-vnsl9
-vnsltt10
-vnss10
-vnss12
-vnss17
-vnss8
-vnss9
-vnssbx10
-vnssdc10
-vnssi10
-vnssi12
-vnssi17
-vnssi8
-vnssi9
-vnssq8
-vnssqi8
-vntcsc10
-vnti10
-vnti12
-vnti7
-vnti8
-vnti9
-vntt10
-vntt12
-vntt8
-vntt9
-vnu10
-vnvtt10
diff --git a/fonts/map/dvipdfm/context/original-vogel-symbol.map b/fonts/map/dvipdfm/context/original-vogel-symbol.map
deleted file mode 100644
index 21456acfa..000000000
--- a/fonts/map/dvipdfm/context/original-vogel-symbol.map
+++ /dev/null
@@ -1 +0,0 @@
-fmvr8x marvosym
diff --git a/fonts/map/dvipdfm/context/original-wasy.map b/fonts/map/dvipdfm/context/original-wasy.map
deleted file mode 100644
index 1cb2ee250..000000000
--- a/fonts/map/dvipdfm/context/original-wasy.map
+++ /dev/null
@@ -1,7 +0,0 @@
-wasy5
-wasy6
-wasy7
-wasy8
-wasy9
-wasy10
-wasyb10
diff --git a/fonts/map/dvipdfm/context/original-youngryu-px.map b/fonts/map/dvipdfm/context/original-youngryu-px.map
deleted file mode 100644
index 68301c1b6..000000000
--- a/fonts/map/dvipdfm/context/original-youngryu-px.map
+++ /dev/null
@@ -1,36 +0,0 @@
-rpxpplb 8r uplb8a
-rpxpplbo 8r uplb8a -s .167
-rpxpplbi 8r uplbi8a
-rpxpplr 8r uplr8a
-rpxpplro 8r uplr8a -s .167
-rpxpplri 8r uplri8a
-rpxr
-rpxsl rpxr -s .167
-rpxi
-rpxsc
-rpxb
-rpxbsl rpxb -s .167
-rpxbi
-rpxbsc
-rpcxb
-rpcxbsl rpcxb -s .167
-rpcxbi
-rpcxi
-rpcxr
-rpcxsl rpcxr -s .167
-rpxbmi
-rpxmi
-pxbex
-pxbexa
-pxbmia
-pxbsy
-pxbsya
-pxbsyb
-pxbsyc
-pxex
-pxexa
-pxmia
-pxsy
-pxsya
-pxsyb
-pxsyc
diff --git a/fonts/map/dvipdfm/context/original-youngryu-tx.map b/fonts/map/dvipdfm/context/original-youngryu-tx.map
deleted file mode 100644
index 269f0d902..000000000
--- a/fonts/map/dvipdfm/context/original-youngryu-tx.map
+++ /dev/null
@@ -1,66 +0,0 @@
-rtxptmb 8r utmb8a
-rtxptmbo 8r utmb8a -s .167
-rtxptmbi 8r utmbi8a
-rtxptmr 8r utmr8a
-rtxptmro 8r utmr8a -s .167
-rtxptmri 8r utmri8a
-rtxphvr 8r uhv8a
-rtxphvro 8r uhv8a -s .167
-rtxphvb 8r uhvb8a
-rtxphvbo 8r uhvb8a -s .167
-rtxr
-rtxsl rtxr -s .167
-rtxi
-rtxsc
-rtxb
-rtxbsl rtxb -s .167
-rtxbi
-rtxbsc
-rtcxb
-rtcxbsl rtcxb -s .167
-rtcxbi
-rtcxi
-rtcxr
-rtcxsl rtcxr -s .167
-rtxbmi
-rtxmi
-txbex
-txbexa
-txbmia
-txbsy
-txbsya
-txbsyb
-txbsyc
-txex
-txexa
-txmia
-txsy
-txsya
-txsyb
-txsyc
-txtt
-txttsl txtt -s .167
-txttsc
-txbtt
-txbttsl txbtt -s .167
-txbttsc
-t1xtt
-t1xttsl t1xtt -s .167
-t1xttsc
-t1xbtt
-t1xbttsl t1xbtt -s .167
-t1xbttsc
-tcxtt
-tcxttsl tcxtt -s .167
-tcxbtt
-tcxbttsl tcxbtt -s .167
-rtxss
-rtxsssl rtxss -s .167
-rtxsssc
-rtxbss
-rtxbsssl rtxbss -s .167
-rtxbsssc
-rtcxss
-rtcxbss
-rtcxsssl rtcxss -s .167
-rtcxbsso rtcxbss -s .167
diff --git a/fonts/map/dvipdfm/context/qx-base.map b/fonts/map/dvipdfm/context/qx-base.map
deleted file mode 100644
index 45a6002af..000000000
--- a/fonts/map/dvipdfm/context/qx-base.map
+++ /dev/null
@@ -1,25 +0,0 @@
-qcrb qcr qcrb
-qcrbi qcr qcrbi
-qcrr qcr qcrr
-qcrri qcr qcrri
-qhvb qhv qhvb
-qhvbi qhv qhvbi
-qhvcb qhv qhvcb
-qhvcbi qhv qhvcbi
-qhvcr qhv qhvcr
-qhvcri qhv qhvcri
-qhvr qhv qhvr
-qhvri qhv qhvri
-qtmb qtm qtmb
-qtmbi qtm qtmbi
-qtmr qtm qtmr
-qtmri qtm qtmri
-qplb qpl qplb
-qplbi qpl qplbi
-qplr qpl qplr
-qplri qpl qplri
-qbkb qbk qbkb
-qbkbi qbk qbkbi
-qbkr qbk qbkr
-qbkri qbk qbkri
-qzcmi qzc qzcmi
diff --git a/fonts/map/dvipdfm/context/qx-os-public-lm.map b/fonts/map/dvipdfm/context/qx-os-public-lm.map
deleted file mode 100644
index f2dd853ae..000000000
--- a/fonts/map/dvipdfm/context/qx-os-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-qx-lmb10 lm-qx-os lmb10
-qx-lmbo10 lm-qx-os lmbo10
-qx-lmbx10 lm-qx-os lmbx10
-qx-lmbx12 lm-qx-os lmbx12
-qx-lmbx5 lm-qx-os lmbx5
-qx-lmbx6 lm-qx-os lmbx6
-qx-lmbx7 lm-qx-os lmbx7
-qx-lmbx8 lm-qx-os lmbx8
-qx-lmbx9 lm-qx-os lmbx9
-qx-lmbxi10 lm-qx-os lmbxi10
-qx-lmbxo10 lm-qx-os lmbxo10
-qx-lmcsc10 lm-qx-os lmcsc10
-qx-lmcsco10 lm-qx-os lmcsco10
-qx-lmr10 lm-qx-os lmr10
-qx-lmr12 lm-qx-os lmr12
-qx-lmr17 lm-qx-os lmr17
-qx-lmr5 lm-qx-os lmr5
-qx-lmr6 lm-qx-os lmr6
-qx-lmr7 lm-qx-os lmr7
-qx-lmr8 lm-qx-os lmr8
-qx-lmr9 lm-qx-os lmr9
-qx-lmri10 lm-qx-os lmri10
-qx-lmri12 lm-qx-os lmri12
-qx-lmri7 lm-qx-os lmri7
-qx-lmri8 lm-qx-os lmri8
-qx-lmri9 lm-qx-os lmri9
-qx-lmro10 lm-qx-os lmro10
-qx-lmro12 lm-qx-os lmro12
-qx-lmro17 lm-qx-os lmro17
-qx-lmro8 lm-qx-os lmro8
-qx-lmro9 lm-qx-os lmro9
-qx-lmss10 lm-qx-os lmss10
-qx-lmss12 lm-qx-os lmss12
-qx-lmss17 lm-qx-os lmss17
-qx-lmss8 lm-qx-os lmss8
-qx-lmss9 lm-qx-os lmss9
-qx-lmssbo10 lm-qx-os lmssbo10
-qx-lmssbx10 lm-qx-os lmssbx10
-qx-lmssdc10 lm-qx-os lmssdc10
-qx-lmssdo10 lm-qx-os lmssdo10
-qx-lmsso10 lm-qx-os lmsso10
-qx-lmsso12 lm-qx-os lmsso12
-qx-lmsso17 lm-qx-os lmsso17
-qx-lmsso8 lm-qx-os lmsso8
-qx-lmsso9 lm-qx-os lmsso9
-qx-lmssq8 lm-qx-os lmssq8
-qx-lmssqbo8 lm-qx-os lmssqbo8
-qx-lmssqbx8 lm-qx-os lmssqbx8
-qx-lmssqo8 lm-qx-os lmssqo8
-qx-lmtcsc10 lm-qxtt lmtcsc10
-qx-lmtcso10 lm-qxtt lmtcso10
-qx-lmtl10 lm-qxtt lmtl10
-qx-lmtlo10 lm-qxtt lmtlo10
-qx-lmtlc10 lm-qxtt lmtlc10
-qx-lmtlco10 lm-qxtt lmtlco10
-qx-lmtk10 lm-qxtt lmtk10
-qx-lmtko10 lm-qxtt lmtko10
-qx-lmtt10 lm-qxtt lmtt10
-qx-lmtt12 lm-qxtt lmtt12
-qx-lmtt8 lm-qxtt lmtt8
-qx-lmtt9 lm-qxtt lmtt9
-qx-lmtti10 lm-qxtt lmtti10
-qx-lmtto10 lm-qxtt lmtto10
-qx-lmvtt10 lm-qx-os lmvtt10
-qx-lmvtto10 lm-qx-os lmvtto10
-qx-lmvtl10 lm-qx-os lmvtl10
-qx-lmvtlo10 lm-qx-os lmvtlo10
-qx-lmvtk10 lm-qx-os lmvtk10
-qx-lmvtko10 lm-qx-os lmvtko10
diff --git a/fonts/map/dvipdfm/context/qx-public-lm.map b/fonts/map/dvipdfm/context/qx-public-lm.map
deleted file mode 100644
index 219665bb5..000000000
--- a/fonts/map/dvipdfm/context/qx-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-qx-lmb10 lm-qx lmb10
-qx-lmbo10 lm-qx lmbo10
-qx-lmbx10 lm-qx lmbx10
-qx-lmbx12 lm-qx lmbx12
-qx-lmbx5 lm-qx lmbx5
-qx-lmbx6 lm-qx lmbx6
-qx-lmbx7 lm-qx lmbx7
-qx-lmbx8 lm-qx lmbx8
-qx-lmbx9 lm-qx lmbx9
-qx-lmbxi10 lm-qx lmbxi10
-qx-lmbxo10 lm-qx lmbxo10
-qx-lmcsc10 lm-qx lmcsc10
-qx-lmcsco10 lm-qx lmcsco10
-qx-lmr10 lm-qx lmr10
-qx-lmr12 lm-qx lmr12
-qx-lmr17 lm-qx lmr17
-qx-lmr5 lm-qx lmr5
-qx-lmr6 lm-qx lmr6
-qx-lmr7 lm-qx lmr7
-qx-lmr8 lm-qx lmr8
-qx-lmr9 lm-qx lmr9
-qx-lmri10 lm-qx lmri10
-qx-lmri12 lm-qx lmri12
-qx-lmri7 lm-qx lmri7
-qx-lmri8 lm-qx lmri8
-qx-lmri9 lm-qx lmri9
-qx-lmro10 lm-qx lmro10
-qx-lmro12 lm-qx lmro12
-qx-lmro17 lm-qx lmro17
-qx-lmro8 lm-qx lmro8
-qx-lmro9 lm-qx lmro9
-qx-lmss10 lm-qx lmss10
-qx-lmss12 lm-qx lmss12
-qx-lmss17 lm-qx lmss17
-qx-lmss8 lm-qx lmss8
-qx-lmss9 lm-qx lmss9
-qx-lmssbo10 lm-qx lmssbo10
-qx-lmssbx10 lm-qx lmssbx10
-qx-lmssdc10 lm-qx lmssdc10
-qx-lmssdo10 lm-qx lmssdo10
-qx-lmsso10 lm-qx lmsso10
-qx-lmsso12 lm-qx lmsso12
-qx-lmsso17 lm-qx lmsso17
-qx-lmsso8 lm-qx lmsso8
-qx-lmsso9 lm-qx lmsso9
-qx-lmssq8 lm-qx lmssq8
-qx-lmssqbo8 lm-qx lmssqbo8
-qx-lmssqbx8 lm-qx lmssqbx8
-qx-lmssqo8 lm-qx lmssqo8
-qx-lmtcsc10 lm-qxtt lmtcsc10
-qx-lmtcso10 lm-qxtt lmtcso10
-qx-lmtl10 lm-qxtt lmtl10
-qx-lmtlo10 lm-qxtt lmtlo10
-qx-lmtlc10 lm-qxtt lmtlc10
-qx-lmtlco10 lm-qxtt lmtlco10
-qx-lmtk10 lm-qxtt lmtk10
-qx-lmtko10 lm-qxtt lmtko10
-qx-lmtt10 lm-qxtt lmtt10
-qx-lmtt12 lm-qxtt lmtt12
-qx-lmtt8 lm-qxtt lmtt8
-qx-lmtt9 lm-qxtt lmtt9
-qx-lmtti10 lm-qxtt lmtti10
-qx-lmtto10 lm-qxtt lmtto10
-qx-lmvtt10 lm-qx lmvtt10
-qx-lmvtto10 lm-qx lmvtto10
-qx-lmvtl10 lm-qx lmvtl10
-qx-lmvtlo10 lm-qx lmvtlo10
-qx-lmvtk10 lm-qx lmvtk10
-qx-lmvtko10 lm-qx lmvtko10
diff --git a/fonts/map/dvipdfm/context/t5-base.map b/fonts/map/dvipdfm/context/t5-base.map
deleted file mode 100644
index 2fad21c40..000000000
--- a/fonts/map/dvipdfm/context/t5-base.map
+++ /dev/null
@@ -1,36 +0,0 @@
-ucrr8v t5 ucrr8v
-ucrro8v t5 ucrro8v
-ucrb8v t5 ucrb8v
-ucrbo8v t5 ucrbo8v
-uhvr8v t5 uhvr8v
-uhvro8v t5 uhvro8v
-uhvb8v t5 uhvb8v
-uhvbo8v t5 uhvbo8v
-utmr8v t5 utmr8v
-utmri8v t5 utmri8v
-utmb8v t5 utmb8v
-utmbi8v t5 utmbi8v
-utmro8v t5 utmr8v
-utmbo8v t5 utmb8v
-uplr8v t5 uplr8v
-uplri8v t5 uplri8v
-uplb8v t5 uplb8v
-uplbi8v t5 uplbi8v
-uplro8v t5 uplr8v
-uplbo8v t5 uplb8v
-ubkl8v t5 ubkl8v
-ubkli8v t5 ubkli8v
-ubkd8v t5 ubkd8v
-ubkdi8v t5 ubkdi8v
-ubklo8v t5 ubkl8v
-ubkdo8v t5 ubkd8v
-uncr8v t5 uncr8v
-uncri8v t5 uncri8v
-uncb8v t5 uncb8v
-uncbi8v t5 uncbi8v
-uncro8v t5 uncr8v
-uncbo8v t5 uncb8v
-uagk8v t5 uagk8v
-uagko8v t5 uagko8v
-uagd8v t5 uagd8v
-uagdo8v t5 uagdo8v
diff --git a/fonts/map/dvipdfm/context/t5-os-public-lm.map b/fonts/map/dvipdfm/context/t5-os-public-lm.map
deleted file mode 100644
index 662713aab..000000000
--- a/fonts/map/dvipdfm/context/t5-os-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-t5-lmb10 lm-t5-os lmb10
-t5-lmbo10 lm-t5-os lmbo10
-t5-lmbx10 lm-t5-os lmbx10
-t5-lmbx12 lm-t5-os lmbx12
-t5-lmbx5 lm-t5-os lmbx5
-t5-lmbx6 lm-t5-os lmbx6
-t5-lmbx7 lm-t5-os lmbx7
-t5-lmbx8 lm-t5-os lmbx8
-t5-lmbx9 lm-t5-os lmbx9
-t5-lmbxi10 lm-t5-os lmbxi10
-t5-lmbxo10 lm-t5-os lmbxo10
-t5-lmcsc10 lm-t5-os lmcsc10
-t5-lmcsco10 lm-t5-os lmcsco10
-t5-lmr10 lm-t5-os lmr10
-t5-lmr12 lm-t5-os lmr12
-t5-lmr17 lm-t5-os lmr17
-t5-lmr5 lm-t5-os lmr5
-t5-lmr6 lm-t5-os lmr6
-t5-lmr7 lm-t5-os lmr7
-t5-lmr8 lm-t5-os lmr8
-t5-lmr9 lm-t5-os lmr9
-t5-lmri10 lm-t5-os lmri10
-t5-lmri12 lm-t5-os lmri12
-t5-lmri7 lm-t5-os lmri7
-t5-lmri8 lm-t5-os lmri8
-t5-lmri9 lm-t5-os lmri9
-t5-lmro10 lm-t5-os lmro10
-t5-lmro12 lm-t5-os lmro12
-t5-lmro17 lm-t5-os lmro17
-t5-lmro8 lm-t5-os lmro8
-t5-lmro9 lm-t5-os lmro9
-t5-lmss10 lm-t5-os lmss10
-t5-lmss12 lm-t5-os lmss12
-t5-lmss17 lm-t5-os lmss17
-t5-lmss8 lm-t5-os lmss8
-t5-lmss9 lm-t5-os lmss9
-t5-lmssbo10 lm-t5-os lmssbo10
-t5-lmssbx10 lm-t5-os lmssbx10
-t5-lmssdc10 lm-t5-os lmssdc10
-t5-lmssdo10 lm-t5-os lmssdo10
-t5-lmsso10 lm-t5-os lmsso10
-t5-lmsso12 lm-t5-os lmsso12
-t5-lmsso17 lm-t5-os lmsso17
-t5-lmsso8 lm-t5-os lmsso8
-t5-lmsso9 lm-t5-os lmsso9
-t5-lmssq8 lm-t5-os lmssq8
-t5-lmssqbo8 lm-t5-os lmssqbo8
-t5-lmssqbx8 lm-t5-os lmssqbx8
-t5-lmssqo8 lm-t5-os lmssqo8
-t5-lmtcsc10 lm-t5-os lmtcsc10
-t5-lmtcso10 lm-t5-os lmtcso10
-t5-lmtl10 lm-t5-os lmtl10
-t5-lmtlo10 lm-t5-os lmtlo10
-t5-lmtlc10 lm-t5-os lmtlc10
-t5-lmtlco10 lm-t5-os lmtlco10
-t5-lmtk10 lm-t5-os lmtk10
-t5-lmtko10 lm-t5-os lmtko10
-t5-lmtt10 lm-t5-os lmtt10
-t5-lmtt12 lm-t5-os lmtt12
-t5-lmtt8 lm-t5-os lmtt8
-t5-lmtt9 lm-t5-os lmtt9
-t5-lmtti10 lm-t5-os lmtti10
-t5-lmtto10 lm-t5-os lmtto10
-t5-lmvtt10 lm-t5-os lmvtt10
-t5-lmvtto10 lm-t5-os lmvtto10
-t5-lmvtl10 lm-t5-os lmvtl10
-t5-lmvtlo10 lm-t5-os lmvtlo10
-t5-lmvtk10 lm-t5-os lmvtk10
-t5-lmvtko10 lm-t5-os lmvtko10
diff --git a/fonts/map/dvipdfm/context/t5-public-lm.map b/fonts/map/dvipdfm/context/t5-public-lm.map
deleted file mode 100644
index 4abba5f7c..000000000
--- a/fonts/map/dvipdfm/context/t5-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-t5-lmb10 lm-t5 lmb10
-t5-lmbo10 lm-t5 lmbo10
-t5-lmbx10 lm-t5 lmbx10
-t5-lmbx12 lm-t5 lmbx12
-t5-lmbx5 lm-t5 lmbx5
-t5-lmbx6 lm-t5 lmbx6
-t5-lmbx7 lm-t5 lmbx7
-t5-lmbx8 lm-t5 lmbx8
-t5-lmbx9 lm-t5 lmbx9
-t5-lmbxi10 lm-t5 lmbxi10
-t5-lmbxo10 lm-t5 lmbxo10
-t5-lmcsc10 lm-t5 lmcsc10
-t5-lmcsco10 lm-t5 lmcsco10
-t5-lmr10 lm-t5 lmr10
-t5-lmr12 lm-t5 lmr12
-t5-lmr17 lm-t5 lmr17
-t5-lmr5 lm-t5 lmr5
-t5-lmr6 lm-t5 lmr6
-t5-lmr7 lm-t5 lmr7
-t5-lmr8 lm-t5 lmr8
-t5-lmr9 lm-t5 lmr9
-t5-lmri10 lm-t5 lmri10
-t5-lmri12 lm-t5 lmri12
-t5-lmri7 lm-t5 lmri7
-t5-lmri8 lm-t5 lmri8
-t5-lmri9 lm-t5 lmri9
-t5-lmro10 lm-t5 lmro10
-t5-lmro12 lm-t5 lmro12
-t5-lmro17 lm-t5 lmro17
-t5-lmro8 lm-t5 lmro8
-t5-lmro9 lm-t5 lmro9
-t5-lmss10 lm-t5 lmss10
-t5-lmss12 lm-t5 lmss12
-t5-lmss17 lm-t5 lmss17
-t5-lmss8 lm-t5 lmss8
-t5-lmss9 lm-t5 lmss9
-t5-lmssbo10 lm-t5 lmssbo10
-t5-lmssbx10 lm-t5 lmssbx10
-t5-lmssdc10 lm-t5 lmssdc10
-t5-lmssdo10 lm-t5 lmssdo10
-t5-lmsso10 lm-t5 lmsso10
-t5-lmsso12 lm-t5 lmsso12
-t5-lmsso17 lm-t5 lmsso17
-t5-lmsso8 lm-t5 lmsso8
-t5-lmsso9 lm-t5 lmsso9
-t5-lmssq8 lm-t5 lmssq8
-t5-lmssqbo8 lm-t5 lmssqbo8
-t5-lmssqbx8 lm-t5 lmssqbx8
-t5-lmssqo8 lm-t5 lmssqo8
-t5-lmtcsc10 lm-t5 lmtcsc10
-t5-lmtcso10 lm-t5 lmtcso10
-t5-lmtl10 lm-t5 lmtl10
-t5-lmtlo10 lm-t5 lmtlo10
-t5-lmtlc10 lm-t5 lmtlc10
-t5-lmtlco10 lm-t5 lmtlco10
-t5-lmtk10 lm-t5 lmtk10
-t5-lmtko10 lm-t5 lmtko10
-t5-lmtt10 lm-t5 lmtt10
-t5-lmtt12 lm-t5 lmtt12
-t5-lmtt8 lm-t5 lmtt8
-t5-lmtt9 lm-t5 lmtt9
-t5-lmtti10 lm-t5 lmtti10
-t5-lmtto10 lm-t5 lmtto10
-t5-lmvtt10 lm-t5 lmvtt10
-t5-lmvtto10 lm-t5 lmvtto10
-t5-lmvtl10 lm-t5 lmvtl10
-t5-lmvtlo10 lm-t5 lmvtlo10
-t5-lmvtk10 lm-t5 lmvtk10
-t5-lmvtko10 lm-t5 lmvtko10
diff --git a/fonts/map/dvipdfm/context/texnansi-base.map b/fonts/map/dvipdfm/context/texnansi-base.map
deleted file mode 100644
index 053291a29..000000000
--- a/fonts/map/dvipdfm/context/texnansi-base.map
+++ /dev/null
@@ -1 +0,0 @@
-% no map entries
diff --git a/fonts/map/dvipdfm/context/texnansi-os-public-lm.map b/fonts/map/dvipdfm/context/texnansi-os-public-lm.map
deleted file mode 100644
index 26e3cabb1..000000000
--- a/fonts/map/dvipdfm/context/texnansi-os-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-texnansi-lmb10 lm-texnansi-os lmb10
-texnansi-lmbo10 lm-texnansi-os lmbo10
-texnansi-lmbx10 lm-texnansi-os lmbx10
-texnansi-lmbx12 lm-texnansi-os lmbx12
-texnansi-lmbx5 lm-texnansi-os lmbx5
-texnansi-lmbx6 lm-texnansi-os lmbx6
-texnansi-lmbx7 lm-texnansi-os lmbx7
-texnansi-lmbx8 lm-texnansi-os lmbx8
-texnansi-lmbx9 lm-texnansi-os lmbx9
-texnansi-lmbxi10 lm-texnansi-os lmbxi10
-texnansi-lmbxo10 lm-texnansi-os lmbxo10
-texnansi-lmcsc10 lm-texnansi-os lmcsc10
-texnansi-lmcsco10 lm-texnansi-os lmcsco10
-texnansi-lmr10 lm-texnansi-os lmr10
-texnansi-lmr12 lm-texnansi-os lmr12
-texnansi-lmr17 lm-texnansi-os lmr17
-texnansi-lmr5 lm-texnansi-os lmr5
-texnansi-lmr6 lm-texnansi-os lmr6
-texnansi-lmr7 lm-texnansi-os lmr7
-texnansi-lmr8 lm-texnansi-os lmr8
-texnansi-lmr9 lm-texnansi-os lmr9
-texnansi-lmri10 lm-texnansi-os lmri10
-texnansi-lmri12 lm-texnansi-os lmri12
-texnansi-lmri7 lm-texnansi-os lmri7
-texnansi-lmri8 lm-texnansi-os lmri8
-texnansi-lmri9 lm-texnansi-os lmri9
-texnansi-lmro10 lm-texnansi-os lmro10
-texnansi-lmro12 lm-texnansi-os lmro12
-texnansi-lmro17 lm-texnansi-os lmro17
-texnansi-lmro8 lm-texnansi-os lmro8
-texnansi-lmro9 lm-texnansi-os lmro9
-texnansi-lmss10 lm-texnansi-os lmss10
-texnansi-lmss12 lm-texnansi-os lmss12
-texnansi-lmss17 lm-texnansi-os lmss17
-texnansi-lmss8 lm-texnansi-os lmss8
-texnansi-lmss9 lm-texnansi-os lmss9
-texnansi-lmssbo10 lm-texnansi-os lmssbo10
-texnansi-lmssbx10 lm-texnansi-os lmssbx10
-texnansi-lmssdc10 lm-texnansi-os lmssdc10
-texnansi-lmssdo10 lm-texnansi-os lmssdo10
-texnansi-lmsso10 lm-texnansi-os lmsso10
-texnansi-lmsso12 lm-texnansi-os lmsso12
-texnansi-lmsso17 lm-texnansi-os lmsso17
-texnansi-lmsso8 lm-texnansi-os lmsso8
-texnansi-lmsso9 lm-texnansi-os lmsso9
-texnansi-lmssq8 lm-texnansi-os lmssq8
-texnansi-lmssqbo8 lm-texnansi-os lmssqbo8
-texnansi-lmssqbx8 lm-texnansi-os lmssqbx8
-texnansi-lmssqo8 lm-texnansi-os lmssqo8
-texnansi-lmtcsc10 lm-texnansi-os lmtcsc10
-texnansi-lmtcso10 lm-texnansi-os lmtcso10
-texnansi-lmtl10 lm-texnansi-os lmtl10
-texnansi-lmtlo10 lm-texnansi-os lmtlo10
-texnansi-lmtlc10 lm-texnansi-os lmtlc10
-texnansi-lmtlco10 lm-texnansi-os lmtlco10
-texnansi-lmtk10 lm-texnansi-os lmtk10
-texnansi-lmtko10 lm-texnansi-os lmtko10
-texnansi-lmtt10 lm-texnansi-os lmtt10
-texnansi-lmtt12 lm-texnansi-os lmtt12
-texnansi-lmtt8 lm-texnansi-os lmtt8
-texnansi-lmtt9 lm-texnansi-os lmtt9
-texnansi-lmtti10 lm-texnansi-os lmtti10
-texnansi-lmtto10 lm-texnansi-os lmtto10
-texnansi-lmvtt10 lm-texnansi-os lmvtt10
-texnansi-lmvtto10 lm-texnansi-os lmvtto10
-texnansi-lmvtl10 lm-texnansi-os lmvtl10
-texnansi-lmvtlo10 lm-texnansi-os lmvtlo10
-texnansi-lmvtk10 lm-texnansi-os lmvtk10
-texnansi-lmvtko10 lm-texnansi-os lmvtko10
diff --git a/fonts/map/dvipdfm/context/texnansi-public-lm.map b/fonts/map/dvipdfm/context/texnansi-public-lm.map
deleted file mode 100644
index 41e267905..000000000
--- a/fonts/map/dvipdfm/context/texnansi-public-lm.map
+++ /dev/null
@@ -1,69 +0,0 @@
-texnansi-lmb10 lm-texnansi lmb10
-texnansi-lmbo10 lm-texnansi lmbo10
-texnansi-lmbx10 lm-texnansi lmbx10
-texnansi-lmbx12 lm-texnansi lmbx12
-texnansi-lmbx5 lm-texnansi lmbx5
-texnansi-lmbx6 lm-texnansi lmbx6
-texnansi-lmbx7 lm-texnansi lmbx7
-texnansi-lmbx8 lm-texnansi lmbx8
-texnansi-lmbx9 lm-texnansi lmbx9
-texnansi-lmbxi10 lm-texnansi lmbxi10
-texnansi-lmbxo10 lm-texnansi lmbxo10
-texnansi-lmcsc10 lm-texnansi lmcsc10
-texnansi-lmcsco10 lm-texnansi lmcsco10
-texnansi-lmr10 lm-texnansi lmr10
-texnansi-lmr12 lm-texnansi lmr12
-texnansi-lmr17 lm-texnansi lmr17
-texnansi-lmr5 lm-texnansi lmr5
-texnansi-lmr6 lm-texnansi lmr6
-texnansi-lmr7 lm-texnansi lmr7
-texnansi-lmr8 lm-texnansi lmr8
-texnansi-lmr9 lm-texnansi lmr9
-texnansi-lmri10 lm-texnansi lmri10
-texnansi-lmri12 lm-texnansi lmri12
-texnansi-lmri7 lm-texnansi lmri7
-texnansi-lmri8 lm-texnansi lmri8
-texnansi-lmri9 lm-texnansi lmri9
-texnansi-lmro10 lm-texnansi lmro10
-texnansi-lmro12 lm-texnansi lmro12
-texnansi-lmro17 lm-texnansi lmro17
-texnansi-lmro8 lm-texnansi lmro8
-texnansi-lmro9 lm-texnansi lmro9
-texnansi-lmss10 lm-texnansi lmss10
-texnansi-lmss12 lm-texnansi lmss12
-texnansi-lmss17 lm-texnansi lmss17
-texnansi-lmss8 lm-texnansi lmss8
-texnansi-lmss9 lm-texnansi lmss9
-texnansi-lmssbo10 lm-texnansi lmssbo10
-texnansi-lmssbx10 lm-texnansi lmssbx10
-texnansi-lmssdc10 lm-texnansi lmssdc10
-texnansi-lmssdo10 lm-texnansi lmssdo10
-texnansi-lmsso10 lm-texnansi lmsso10
-texnansi-lmsso12 lm-texnansi lmsso12
-texnansi-lmsso17 lm-texnansi lmsso17
-texnansi-lmsso8 lm-texnansi lmsso8
-texnansi-lmsso9 lm-texnansi lmsso9
-texnansi-lmssq8 lm-texnansi lmssq8
-texnansi-lmssqbo8 lm-texnansi lmssqbo8
-texnansi-lmssqbx8 lm-texnansi lmssqbx8
-texnansi-lmssqo8 lm-texnansi lmssqo8
-texnansi-lmtcsc10 lm-texnansi lmtcsc10
-texnansi-lmtcso10 lm-texnansi lmtcso10
-texnansi-lmtl10 lm-texnansi lmtl10
-texnansi-lmtlo10 lm-texnansi lmtlo10
-texnansi-lmtlc10 lm-texnansi lmtlc10
-texnansi-lmtlco10 lm-texnansi lmtlco10
-texnansi-lmtk10 lm-texnansi lmtk10
-texnansi-lmtko10 lm-texnansi lmtko10
-texnansi-lmtt10 lm-texnansi lmtt10
-texnansi-lmtt12 lm-texnansi lmtt12
-texnansi-lmtt8 lm-texnansi lmtt8
-texnansi-lmtt9 lm-texnansi lmtt9
-texnansi-lmtti10 lm-texnansi lmtti10
-texnansi-lmtto10 lm-texnansi lmtto10
-texnansi-lmvtt10 lm-texnansi lmvtt10
-texnansi-lmvtto10 lm-texnansi lmvtto10
-texnansi-lmvtl10 lm-texnansi lmvtl10
-texnansi-lmvtlo10 lm-texnansi lmvtlo10
-texnansi-lmvtk10 lm-texnansi lmvtk10
-texnansi-lmvtko10 lm-texnansi lmvtko10
diff --git a/fonts/map/pdftex/context/original-ams-euler.map b/fonts/map/pdftex/context/original-ams-euler.map
index ecbd65b77..34b94c34c 100644
--- a/fonts/map/pdftex/context/original-ams-euler.map
+++ b/fonts/map/pdftex/context/original-ams-euler.map
@@ -22,4 +22,4 @@ eusb10 EUSB10 0: beginfig(chart_figure) ; fi ;
+ startsavingdata ;
initialize_grid (maxx, maxy) ;
bboxmargin := 0 ;
cmin_x := 1 ;
@@ -932,14 +933,15 @@ def end_chart =
decimal xpart llcorner p & "}{" &
decimal ypart llcorner p & "}{" &
decimal xpart urcorner p & "}{" &
- decimal ypart urcorner p & "}" ;
+ decimal ypart urcorner p & "}%" ;
savedata
"\MPareapath{" &
decimal (xpart llcorner p + 2chart_offset) & "}{" &
decimal (ypart llcorner p + 2chart_offset) & "}{" &
decimal (xpart urcorner p - 2chart_offset) & "}{" &
- decimal (ypart urcorner p - 2chart_offset) & "}" ;
+ decimal (ypart urcorner p - 2chart_offset) & "}%" ;
currentpicture := currentpicture scaled chart_scale ;
+ stopsavingdata ;
if chart_figure>0: endfig ; fi ;
enddef ;
diff --git a/metapost/context/base/mp-core.mp b/metapost/context/base/mp-core.mp
index 2b62559b8..0bf19b8a5 100644
--- a/metapost/context/base/mp-core.mp
+++ b/metapost/context/base/mp-core.mp
@@ -1,15 +1,3 @@
-%D \module
-%D [ file=mp-core.mp,
-%D version=2000.something, % 1999.08.12,
-%D title=\CONTEXT\ \METAPOST\ graphics,
-%D subtitle=core interfacing,
-%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 licen-en.pdf for
-%C details.
if unknown context_tool : input mp-tool ; fi ;
if known context_core : endinput ; fi ;
@@ -135,7 +123,6 @@ def initialize_area_par (expr fn,fx,fy,fw,fh,fd,
numeric mpos ; mpos := 6 ; freeze_box(mpos) ;
-% do_initialize_area (fpos, tpos) ;
do_initialize_par (fpos, tpos, mpos, ffpos, 0,0,0,0,0,0) ;
enddef ;
@@ -422,7 +409,6 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
pair par_start_pos ;
-% par_start_pos := llxy[fpos] if par_indent<0: shifted (-par_indent,0) fi ;
par_start_pos := llxy[fpos]
if par_indent <0: shifted (-par_indent, 0) fi
@@ -521,10 +507,8 @@ par_hang_after := ra + estimated_par_lines(py-fy) ;
if (par_hang_indent>0) and (par_hang_after<0) and obey_multi_par_hang :
pair _ul_ ; _ul_ := (xpart ulcorner multipar, ypart snapped_multi_pos(ulxy[fpos]));
pair _pa_ ; _pa_ := _ul_ shifted (0,par_hang_after*par_line_height) ;
-% _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
_pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llcorner multipar)) ;
if same_area :
-% _pa_ := (xpart _pa_,max(ypart _pa_,ypart llxy[tpos])) ;
_pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llxy[tpos])) ;
fi ;
if obey_multi_par_more and (round(par_line_height)>0) :
@@ -541,7 +525,6 @@ par_hang_after := ra + estimated_par_lines(py-fy) ;
vardef right_top_hang (expr same_area) =
-% par_hang_after := ra - estimated_par_lines(py-fy) ;
par_hang_after := ra + estimated_par_lines(py-fy) ;
if (par_hang_indent<0) and (par_hang_after<0) and obey_multi_par_hang :
@@ -588,7 +571,6 @@ fi ;
fi
enddef ;
-% here
vardef x_right_top_hang (expr i, t) =
par_hang_after := min(0,ra + estimated_multi_par_height(i,t)) ;
@@ -600,14 +582,6 @@ if t :
_pa_ := (xpart _pa_,max(ypart _pa_,ypart snapped_multi_pos(urxy[tpos]))) ;
fi ;
-%todo
-%
-%if abs(ypart _pa_-ypart llxy[tpos]) 1) :
% rest of chain / todo : hang
-% we need to test, else we get a RealPageNumber)) :
@@ -1079,9 +1043,6 @@ def sort_multi_pars =
fi ;
enddef ;
-% This collapses successive areas (possibly interrupted by
-% floats. First we need to sort the areas, since they are
-% normally in de order start, end, inbetween.
def collapse_multi_pars =
if nofmultipars>1 :
@@ -1110,20 +1071,40 @@ multirefs[_nofmultipars_] := multirefs[i+1] ;
fi ;
enddef ;
+% def draw_multi_pars =
+% for i=1 upto nofmultipars :
+% do_draw_par(multipars[i]) ;
+% if boxgridtype= 1 :
+% draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
+% elseif boxgridtype= 2 :
+% draw baseline_grid (multipars[i],up,false) ; % withcolor boxgridcolor ;
+% elseif boxgridtype= 3 :
+% draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
+% draw baseline_grid (multipars[i],up,true )
+% shifted (0,ExHeight) ; % withcolor boxgridcolor ;
+% elseif boxgridtype= 4 :
+% draw baseline_grid (multipars[i],up,true )
+% shifted (0,ExHeight/2) ; % withcolor boxgridcolor ;
+% elseif boxgridtype=11 :
+% draw graphic_grid(multipars[i],boxgriddistance,boxgriddistance,boxgriddistance/2,boxgriddistance/2) ;
+% elseif boxgridtype=12 :
+% draw graphic_grid(multipars[i],boxgriddistance,boxgriddistance,0,0) ;
+% fi ;
+% endfor ;
+% enddef ;
+
def draw_multi_pars =
for i=1 upto nofmultipars :
do_draw_par(multipars[i]) ;
if boxgridtype= 1 :
- draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) ; % withcolor boxgridcolor ;
elseif boxgridtype= 2 :
- draw baseline_grid (multipars[i],up,false) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,false) ; % withcolor boxgridcolor ;
elseif boxgridtype= 3 :
- draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
- draw baseline_grid (multipars[i],up,true )
- shifted (0,ExHeight) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) shifted (0,ExHeight) ; % withcolor boxgridcolor ;
elseif boxgridtype= 4 :
- draw baseline_grid (multipars[i],up,true )
- shifted (0,ExHeight/2) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) shifted (0,ExHeight/2) ; % withcolor boxgridcolor ;
elseif boxgridtype=11 :
draw graphic_grid(multipars[i],boxgriddistance,boxgriddistance,boxgriddistance/2,boxgriddistance/2) ;
elseif boxgridtype=12 :
@@ -1231,7 +1212,6 @@ let draw_area = draw_box ;
let anchor_area = anchor_box ;
let anchor_par = anchor_box ;
-% new and experimental and yet undocumented
numeric sync_n[], sync_p[][], sync_w[][], sync_h[][], sync_d[][], sync_t[][] ;
pair sync_xy[][] ; color sync_c[][] ;
@@ -1286,7 +1266,6 @@ vardef PrepareSyncTasks(expr n, collapse, extendtop, prestartnext) =
NOfSyncPaths := NOfSyncPaths + 1 ;
if not ok :
if i>1 :
-% not yet correct when two of the same follow each other
if sync_t[n][i-1] = sync_t[n][i] :
SyncPaths[NOfSyncPaths] := SyncBox(n, i, SyncLeftOffset, SyncWidth, PaperHeight, -PaperHeight) ;
SyncTasks[NOfSyncPaths] := i ;
@@ -1394,3 +1373,5 @@ def ProcessSyncTask(expr p, c) =
enddef ;
endinput ;
+
+end
diff --git a/metapost/context/base/mp-mlib.mp b/metapost/context/base/mp-mlib.mp
index 81bb07caf..134cd12a3 100644
--- a/metapost/context/base/mp-mlib.mp
+++ b/metapost/context/base/mp-mlib.mp
@@ -35,29 +35,51 @@ vardef rawtextext(expr str) =
_tt_n_ := _tt_n_ + 1 ;
_tt_p_ := image (
draw _tt_p_ ;
- draw unitsquare withprescript "tf" withpostscript decimal _tt_n_ & ":" & str ;
+ addto currentpicture doublepath unitsquare withprescript "tf" withpostscript decimal _tt_n_ & ":" & str ;
) ;
- draw unitsquare ;
+ draw unitsquare withpen pencircle scaled 0 ;
)
else :
image (
_tt_n_ := _tt_n_ + 1 ;
- draw unitsquare
+ addto currentpicture doublepath unitsquare
xscaled _tt_w_[_tt_n_]
yscaled (_tt_h_[_tt_n_] + _tt_d_[_tt_n_])
withprescript "ts"
withpostscript decimal _tt_n_ & ":" & str ;
- )
+ ) shifted (0,-_tt_d_[_tt_n_])
fi
enddef ;
+pair laboff.d, laboff.dlft, laboff.drt ; % new positional suffixes
+pair laboff.origin, laboff.raw ; % graph mess
+
+laboff.d := laboff ; labxf.d := labxf ; labyf.d := labyf ;
+laboff.dlft := laboff.lft ; labxf.dlft := labxf.lft ; labyf.dlft := labyf.lft ;
+laboff.drt := laboff.rt ; labxf.drt := labxf.rt ; labyf.drt := labyf.rt ;
+
+labtype := 0 ; labtype.lft := 1 ; labtype.rt := 2 ;
+labtype.bot := 3 ; labtype.top := 4 ; labtype.ulft := 5 ;
+labtype.urt := 6 ; labtype.llft := 7 ; labtype.lrt := 8 ;
+labtype.d := 10 ; labtype.dlft := 11 ; labtype.drt := 12 ;
+labtype.origin := 0 ; labtype.raw := 0 ;
+
+laboff.origin = (infinity,infinity) ; labxf.origin := 0 ; labyf.origin := 0 ;
+laboff.raw = (infinity,infinity) ; labxf.raw := 0 ; labyf.raw := 0 ;
+
+vardef thetextext@#(expr p,z) = % adapted copy of thelabel@
+ p
+ if (labtype@# >= 10) : shifted (0,ypart center p) fi
+ shifted (z + labeloffset*laboff@# - (labxf@#*lrcorner p + labyf@#*ulcorner p + (1-labxf@#-labyf@#)*llcorner p))
+enddef;
+
vardef textext@#(expr txt) =
- interim labeloffset := textextoffset ;
- if string txt :
- thelabel@#(rawtextext(txt),origin)
- else :
- thelabel@#(txt,origin)
- fi
+ interim labeloffset := textextoffset ;
+ if string txt :
+ thetextext@#(rawtextext(txt),origin)
+ else :
+ thetextext@#(txt,origin)
+ fi
enddef ;
def circular_shade (expr p, n, ca, cb) =
diff --git a/metapost/context/base/mp-tool.mp b/metapost/context/base/mp-tool.mp
index c1def83b3..ccec2f3c8 100644
--- a/metapost/context/base/mp-tool.mp
+++ b/metapost/context/base/mp-tool.mp
@@ -115,6 +115,12 @@ enddef ;
% & "&ddecimal urcorner currentpicture"
% & ");";
+%D Crap (experimental, not used):
+
+def forcemultipass =
+ % extra_endfig := extra_endfig & "special(" & ditto & "%%MetaPostOption: multipass" & ditto & ");" ;
+enddef ;
+
%D Colors:
nocolormodel := 1 ;
@@ -228,6 +234,7 @@ enddef ;
def finishsavingdata =
if savingdatadone :
write EOF to data_mpd_file ;
+ savingdatadone := false ;
fi ;
enddef ;
diff --git a/scripts/context/lua/luatools.lua b/scripts/context/lua/luatools.lua
index 936b32e7b..1e38edeab 100644
--- a/scripts/context/lua/luatools.lua
+++ b/scripts/context/lua/luatools.lua
@@ -17,7 +17,7 @@
-- the future. As long as Luatex is under development the
-- interfaces and names of functions may change.
-banner = "version 1.2.0 - 2006+ - PRAGMA ADE / CONTEXT"
+banner = "version 1.2.2 - 2006+ - PRAGMA ADE / CONTEXT"
texlua = true
-- For the sake of independence we optionally can merge the library
@@ -163,7 +163,7 @@ end
--~ end end
-string.chr_to_esc = {
+local chr_to_esc = {
["%"] = "%%",
["."] = "%.",
["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
@@ -173,16 +173,18 @@ string.chr_to_esc = {
["{"] = "%{", ["}"] = "%}"
}
+string.chr_to_esc = chr_to_esc
+
function string:esc() -- variant 2
- return (self:gsub("(.)",string.chr_to_esc))
+ return (self:gsub("(.)",chr_to_esc))
end
-function string.unquote(str)
- return (str:gsub("^([\"\'])(.*)%1$","%2"))
+function string:unquote()
+ return (self:gsub("^([\"\'])(.*)%1$","%2"))
end
-function string.quote(str)
- return '"' .. str:unquote() .. '"'
+function string:quote()
+ return '"' .. self:unquote() .. '"'
end
function string:count(pattern) -- variant 3
@@ -432,6 +434,30 @@ function string:splitlines()
return capture:match(self)
end
+--~ local p = lpeg.splitat("->",false) print(p:match("oeps->what->more")) -- oeps what more
+--~ local p = lpeg.splitat("->",true) print(p:match("oeps->what->more")) -- oeps what->more
+--~ local p = lpeg.splitat("->",false) print(p:match("oeps")) -- oeps
+--~ local p = lpeg.splitat("->",true) print(p:match("oeps")) -- oeps
+
+local splitters_s, splitters_m = { }, { }
+
+function lpeg.splitat(separator,single)
+ local splitter = (single and splitters_s[separator]) or splitters_m[separator]
+ if not splitter then
+ separator = lpeg.P(separator)
+ if single then
+ local other, any = lpeg.C((1 - separator)^0), lpeg.P(1)
+ splitter = other * (separator * lpeg.C(any^0) + "")
+ splitters_s[separator] = splitter
+ else
+ local other = lpeg.C((1 - separator)^0)
+ splitter = other * (separator * other)^0
+ splitters_m[separator] = splitter
+ end
+ end
+ return splitter
+end
+
-- filename : l-table.lua
-- comment : split off from luat-lib
@@ -443,11 +469,15 @@ if not versions then versions = { } end versions['l-table'] = 1.001
table.join = table.concat
+local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
+local format = string.format
+local getmetatable, setmetatable = getmetatable, setmetatable
+local pairs, ipairs, type, next, tostring = pairs, ipairs, type, next, tostring
+
function table.strip(tab)
local lst = { }
- for k, v in ipairs(tab) do
- -- s = string.gsub(v, "^%s*(.-)%s*$", "%1")
- s = v:gsub("^%s*(.-)%s*$", "%1")
+ for i=1,#tab do
+ local s = tab[i]:gsub("^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
@@ -457,16 +487,7 @@ function table.strip(tab)
return lst
end
---~ function table.sortedkeys(tab)
---~ local srt = { }
---~ for key,_ in pairs(tab) do
---~ srt[#srt+1] = key
---~ end
---~ table.sort(srt)
---~ return srt
---~ end
-
-function table.sortedkeys(tab)
+local function sortedkeys(tab)
local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in pairs(tab) do
srt[#srt+1] = key
@@ -486,22 +507,34 @@ function table.sortedkeys(tab)
end
end
if kind == 0 or kind == 3 then
- table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
+ sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
else
- table.sort(srt)
+ sort(srt)
+ end
+ return srt
+end
+
+local function sortedhashkeys(tab) -- fast one
+ local srt = { }
+ for key,_ in pairs(tab) do
+ srt[#srt+1] = key
end
+ sort(srt)
return srt
end
+table.sortedkeys = sortedkeys
+table.sortedhashkeys = sortedhashkeys
+
function table.append(t, list)
for _,v in pairs(list) do
- table.insert(t,v)
+ insert(t,v)
end
end
function table.prepend(t, list)
for k,v in pairs(list) do
- table.insert(t,k,v)
+ insert(t,k,v)
end
end
@@ -548,70 +581,57 @@ function table.imerged(...)
return tmp
end
-if not table.fastcopy then do
-
- local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable
-
- local function fastcopy(old) -- fast one
- if old then
- local new = { }
- for k,v in pairs(old) do
- if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
- else
- new[k] = v
- end
- end
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+local function fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in pairs(old) do
+ if type(v) == "table" then
+ new[k] = fastcopy(v) -- was just table.copy
+ else
+ new[k] = v
end
- return new
- else
- return { }
end
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
+ return new
+ else
+ return { }
end
+end
- table.fastcopy = fastcopy
-
-end end
-
-if not table.copy then do
-
- local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable
-
- local function copy(t, tables) -- taken from lua wiki, slightly adapted
- tables = tables or { }
- local tcopy = {}
- if not tables[t] then
- tables[t] = tcopy
- end
- for i,v in pairs(t) do -- brrr, what happens with sparse indexed
- if type(i) == "table" then
- if tables[i] then
- i = tables[i]
- else
- i = copy(i, tables)
- end
- end
- if type(v) ~= "table" then
- tcopy[i] = v
- elseif tables[v] then
- tcopy[i] = tables[v]
+local function copy(t, tables) -- taken from lua wiki, slightly adapted
+ tables = tables or { }
+ local tcopy = {}
+ if not tables[t] then
+ tables[t] = tcopy
+ end
+ for i,v in pairs(t) do -- brrr, what happens with sparse indexed
+ if type(i) == "table" then
+ if tables[i] then
+ i = tables[i]
else
- tcopy[i] = copy(v, tables)
+ i = copy(i, tables)
end
end
- local mt = getmetatable(t)
- if mt then
- setmetatable(tcopy,mt)
+ if type(v) ~= "table" then
+ tcopy[i] = v
+ elseif tables[v] then
+ tcopy[i] = tables[v]
+ else
+ tcopy[i] = copy(v, tables)
end
- return tcopy
end
+ local mt = getmetatable(t)
+ if mt then
+ setmetatable(tcopy,mt)
+ end
+ return tcopy
+end
- table.copy = copy
-
-end end
+table.fastcopy = fastcopy
+table.copy = copy
-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
@@ -640,257 +660,22 @@ function table.starts_at(t)
return ipairs(t,1)(t,0)
end
---~ do
-
---~ -- one of my first exercises in lua ...
-
---~ table.serialize_functions = true
---~ table.serialize_compact = true
---~ table.serialize_inline = true
-
---~ local function key(k,noquotes)
---~ if type(k) == "number" then -- or k:find("^%d+$") then
---~ return "["..k.."]"
---~ elseif noquotes and k:find("^%a[%a%d%_]*$") then
---~ return k
---~ else
---~ return '["'..k..'"]'
---~ end
---~ end
-
---~ local function simple_table(t)
---~ if #t > 0 then
---~ local n = 0
---~ for _,v in pairs(t) do
---~ n = n + 1
---~ end
---~ if n == #t then
---~ local tt = { }
---~ for i=1,#t do
---~ local v = t[i]
---~ local tv = type(v)
---~ if tv == "number" or tv == "boolean" then
---~ tt[#tt+1] = tostring(v)
---~ elseif tv == "string" then
---~ tt[#tt+1] = ("%q"):format(v)
---~ else
---~ tt = nil
---~ break
---~ end
---~ end
---~ return tt
---~ end
---~ end
---~ return nil
---~ end
-
---~ local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed)
---~ handle = handle or print
---~ reduce = reduce or false
---~ if depth then
---~ depth = depth .. " "
---~ if indexed then
---~ handle(("%s{"):format(depth))
---~ else
---~ handle(("%s%s={"):format(depth,key(name,noquotes)))
---~ end
---~ else
---~ depth = ""
---~ local tname = type(name)
---~ if tname == "string" then
---~ if name == "return" then
---~ handle("return {")
---~ else
---~ handle(name .. "={")
---~ end
---~ elseif tname == "number" then
---~ handle("[" .. name .. "]={")
---~ elseif tname == "boolean" then
---~ if name then
---~ handle("return {")
---~ else
---~ handle("{")
---~ end
---~ else
---~ handle("t={")
---~ end
---~ end
---~ if root and next(root) then
---~ local compact = table.serialize_compact
---~ local inline = compact and table.serialize_inline
---~ local first, last = nil, 0 -- #root cannot be trusted here
---~ if compact then
---~ for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
---~ if not first then first = k end
---~ last = last + 1
---~ end
---~ end
---~ for _,k in pairs(table.sortedkeys(root)) do
---~ local v = root[k]
---~ local t = type(v)
---~ if compact and first and type(k) == "number" and k >= first and k <= last then
---~ if t == "number" then
---~ handle(("%s %s,"):format(depth,v))
---~ elseif t == "string" then
---~ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
---~ handle(("%s %s,"):format(depth,v))
---~ else
---~ handle(("%s %q,"):format(depth,v))
---~ end
---~ elseif t == "table" then
---~ if not next(v) then
---~ handle(("%s {},"):format(depth))
---~ elseif inline then
---~ local st = simple_table(v)
---~ if st then
---~ handle(("%s { %s },"):format(depth,table.concat(st,", ")))
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
---~ end
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
---~ end
---~ elseif t == "boolean" then
---~ handle(("%s %s,"):format(depth,tostring(v)))
---~ elseif t == "function" then
---~ if table.serialize_functions then
---~ handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
---~ else
---~ handle(('%s "function",'):format(depth))
---~ end
---~ else
---~ handle(("%s %q,"):format(depth,tostring(v)))
---~ end
---~ elseif k == "__p__" then -- parent
---~ if false then
---~ handle(("%s __p__=nil,"):format(depth))
---~ end
---~ elseif t == "number" then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),v))
---~ elseif t == "string" then
---~ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),v))
---~ else
---~ handle(("%s %s=%q,"):format(depth,key(k,noquotes),v))
---~ end
---~ elseif t == "table" then
---~ if not next(v) then
---~ handle(("%s %s={},"):format(depth,key(k,noquotes)))
---~ elseif inline then
---~ local st = simple_table(v)
---~ if st then
---~ handle(("%s %s={ %s },"):format(depth,key(k,noquotes),table.concat(st,", ")))
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes)
---~ end
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes)
---~ end
---~ elseif t == "boolean" then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),tostring(v)))
---~ elseif t == "function" then
---~ if table.serialize_functions then
---~ handle(('%s %s=loadstring(%q),'):format(depth,key(k,noquotes),string.dump(v)))
---~ else
---~ handle(('%s %s="function",'):format(depth,key(k,noquotes)))
---~ end
---~ else
---~ handle(("%s %s=%q,"):format(depth,key(k,noquotes),tostring(v)))
---~ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k,noquotes),string.dump(function() return v end)))
---~ end
---~ end
---~ if level > 0 then
---~ handle(("%s},"):format(depth))
---~ else
---~ handle(("%s}"):format(depth))
---~ end
---~ else
---~ handle(("%s}"):format(depth))
---~ end
---~ end
-
---~ --~ name:
---~ --~
---~ --~ true : return { }
---~ --~ false : { }
---~ --~ nil : t = { }
---~ --~ string : string = { }
---~ --~ 'return' : return { }
---~ --~ number : [number] = { }
-
---~ function table.serialize(root,name,reduce,noquotes)
---~ local t = { }
---~ local function flush(s)
---~ t[#t+1] = s
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ return table.concat(t,"\n")
---~ end
-
---~ function table.tohandle(handle,root,name,reduce,noquotes)
---~ serialize(root, name, handle, nil, 0, reduce, noquotes)
---~ end
-
---~ -- sometimes tables are real use (zapfino extra pro is some 85M) in which
---~ -- case a stepwise serialization is nice; actually, we could consider:
---~ --
---~ -- for line in table.serializer(root,name,reduce,noquotes) do
---~ -- ...(line)
---~ -- end
---~ --
---~ -- so this is on the todo list
-
---~ table.tofile_maxtab = 2*1024
-
---~ function table.tofile(filename,root,name,reduce,noquotes)
---~ local f = io.open(filename,'w')
---~ if f then
---~ local concat = table.concat
---~ local maxtab = table.tofile_maxtab
---~ if maxtab > 1 then
---~ local t = { }
---~ local function flush(s)
---~ t[#t+1] = s
---~ if #t > maxtab then
---~ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
---~ t = { }
---~ end
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ f:write(concat(t,"\n"),"\n")
---~ else
---~ local function flush(s)
---~ f:write(s,"\n")
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ end
---~ f:close()
---~ end
---~ end
-
---~ end
+function table.tohash(t,value)
+ local h = { }
+ if value == nil then value = true end
+ for _, v in pairs(t) do -- no ipairs here
+ h[v] = value
+ end
+ return h
+end
---~ t = {
---~ b = "123",
---~ a = "x",
---~ c = 1.23,
---~ d = "1.23",
---~ e = true,
---~ f = {
---~ d = "1.23",
---~ a = "x",
---~ b = "123",
---~ c = 1.23,
---~ e = true,
---~ f = {
---~ e = true,
---~ f = {
---~ e = true
---~ },
---~ },
---~ },
---~ g = function() end
---~ }
+function table.fromhash(t)
+ local h = { }
+ for k, v in pairs(t) do -- no ipairs here
+ if v then h[#h+1] = k end
+ end
+ return h
+end
--~ print(table.serialize(t), "\n")
--~ print(table.serialize(t,"name"), "\n")
@@ -899,320 +684,339 @@ end
--~ print(table.serialize(t,"name",true), "\n")
--~ print(table.serialize(t,"name",true,true), "\n")
-do
+table.serialize_functions = true
+table.serialize_compact = true
+table.serialize_inline = true
- table.serialize_functions = true
- table.serialize_compact = true
- table.serialize_inline = true
+local noquotes, hexify, handle, reduce, compact, inline, functions
- local sortedkeys = table.sortedkeys
- local format, concat = string.format, table.concat
- local noquotes, hexify, handle, reduce, compact, inline, functions
- local pairs, ipairs, type, next, tostring = pairs, ipairs, type, next, tostring
+local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+ 'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
+ 'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
+}
- local function key(k)
- if type(k) == "number" then -- or k:find("^%d+$") then
- if hexify then
- return ("[0x%04X]"):format(k)
- else
- return "["..k.."]"
- end
- elseif noquotes and k:find("^%a[%a%d%_]*$") then
- return k
+local function key(k)
+ if type(k) == "number" then -- or k:find("^%d+$") then
+ if hexify then
+ return ("[0x%04X]"):format(k)
else
- return '["'..k..'"]'
+ return "["..k.."]"
end
+ elseif noquotes and not reserved[k] and k:find("^%a[%a%d%_]*$") then
+ return k
+ else
+ return '["'..k..'"]'
end
+end
- local function simple_table(t)
- if #t > 0 then
- local n = 0
- for _,v in pairs(t) do
- n = n + 1
- end
- if n == #t then
- local tt = { }
- for i=1,#t do
- local v = t[i]
- local tv = type(v)
- if tv == "number" then
- if hexify then
- tt[#tt+1] = ("0x%04X"):format(v)
- else
- tt[#tt+1] = tostring(v)
- end
- elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
- elseif tv == "string" then
- tt[#tt+1] = ("%q"):format(v)
+local function simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in pairs(t) do
+ n = n + 1
+ end
+ if n == #t then
+ local tt = { }
+ for i=1,#t do
+ local v = t[i]
+ local tv = type(v)
+ if tv == "number" then
+ if hexify then
+ tt[#tt+1] = ("0x%04X"):format(v)
else
- tt = nil
- break
+ tt[#tt+1] = tostring(v)
end
+ elseif tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = ("%q"):format(v)
+ else
+ tt = nil
+ break
end
- return tt
end
+ return tt
end
- return nil
end
+ return nil
+end
- local function do_serialize(root,name,depth,level,indexed)
- if level > 0 then
- depth = depth .. " "
- if indexed then
- handle(("%s{"):format(depth))
- elseif name then
- handle(("%s%s={"):format(depth,key(name)))
- else
- handle(("%s{"):format(depth))
- end
+local function do_serialize(root,name,depth,level,indexed)
+ if level > 0 then
+ depth = depth .. " "
+ if indexed then
+ handle(("%s{"):format(depth))
+ elseif name then
+ handle(("%s%s={"):format(depth,key(name)))
+ else
+ handle(("%s{"):format(depth))
end
- if root and next(root) then
- local first, last = nil, 0 -- #root cannot be trusted here
- if compact then
- for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
- if not first then first = k end
- last = last + 1
- end
+ end
+ if root and next(root) then
+ local first, last = nil, 0 -- #root cannot be trusted here
+ if compact then
+ for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
+ if not first then first = k end
+ last = last + 1
end
- --~ for _,k in pairs(sortedkeys(root)) do -- 1% faster:
- local sk = sortedkeys(root)
- for i=1,#sk do
- local k = sk[i]
- local v = root[k]
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
- if t == "number" then
- if hexify then
- handle(("%s 0x%04X,"):format(depth,v))
- else
- handle(("%s %s,"):format(depth,v))
- end
- elseif t == "string" then
- if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
- handle(("%s %s,"):format(depth,v))
- else
- handle(("%s %q,"):format(depth,v))
- end
- elseif t == "table" then
- if not next(v) then
- handle(("%s {},"):format(depth))
- elseif inline then
- local st = simple_table(v)
- if st then
- handle(("%s { %s },"):format(depth,concat(st,", ")))
- else
- do_serialize(v,k,depth,level+1,true)
- end
- else
- do_serialize(v,k,depth,level+1,true)
- end
- elseif t == "boolean" then
- handle(("%s %s,"):format(depth,tostring(v)))
- elseif t == "function" then
- if functions then
- handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
- else
- handle(('%s "function",'):format(depth))
- end
- else
- handle(("%s %q,"):format(depth,tostring(v)))
- end
- elseif k == "__p__" then -- parent
- if false then
- handle(("%s __p__=nil,"):format(depth))
- end
- elseif t == "number" then
+ end
+ --~ for _,k in pairs(sortedkeys(root)) do -- 1% faster:
+ local sk = sortedkeys(root)
+ for i=1,#sk do
+ local k = sk[i]
+ local v = root[k]
+ local t = type(v)
+ if compact and first and type(k) == "number" and k >= first and k <= last then
+ if t == "number" then
if hexify then
- handle(("%s %s=0x%04X,"):format(depth,key(k),v))
+ handle(("%s 0x%04X,"):format(depth,v))
else
- handle(("%s %s=%s,"):format(depth,key(k),v))
+ handle(("%s %s,"):format(depth,v))
end
elseif t == "string" then
if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
- handle(("%s %s=%s,"):format(depth,key(k),v))
+ handle(("%s %s,"):format(depth,v))
else
- handle(("%s %s=%q,"):format(depth,key(k),v))
+ handle(("%s %q,"):format(depth,v))
end
elseif t == "table" then
if not next(v) then
- handle(("%s %s={},"):format(depth,key(k)))
+ handle(("%s {},"):format(depth))
elseif inline then
local st = simple_table(v)
if st then
- handle(("%s %s={ %s },"):format(depth,key(k),concat(st,", ")))
+ handle(("%s { %s },"):format(depth,concat(st,", ")))
else
- do_serialize(v,k,depth,level+1)
+ do_serialize(v,k,depth,level+1,true)
end
else
- do_serialize(v,k,depth,level+1)
+ do_serialize(v,k,depth,level+1,true)
end
elseif t == "boolean" then
- handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ handle(("%s %s,"):format(depth,tostring(v)))
elseif t == "function" then
if functions then
- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v)))
+ handle(('%s loadstring(%q),'):format(depth,v:dump()))
else
- handle(('%s %s="function",'):format(depth,key(k)))
+ handle(('%s "function",'):format(depth))
end
else
- handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
- -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
+ handle(("%s %q,"):format(depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(("%s __p__=nil,"):format(depth))
+ end
+ elseif t == "number" then
+ if hexify then
+ handle(("%s %s=0x%04X,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%s,"):format(depth,key(k),v))
end
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s %s={},"):format(depth,key(k)))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s %s={ %s },"):format(depth,key(k),concat(st,", ")))
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ elseif t == "function" then
+ if functions then
+ handle(('%s %s=loadstring(%q),'):format(depth,key(k),v:dump()))
+ else
+ handle(('%s %s="function",'):format(depth,key(k)))
+ end
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
+ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
end
end
- if level > 0 then
- handle(("%s},"):format(depth))
- end
end
+ if level > 0 then
+ handle(("%s},"):format(depth))
+ end
+end
- local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
- local tname = type(name)
- if tname == "string" then
- if name == "return" then
- handle("return {")
- else
- handle(name .. "={")
- end
- elseif tname == "number" then
- if hexify then
- handle(format("[0x%04X]={",name))
- else
- handle("[" .. name .. "]={")
- end
- elseif tname == "boolean" then
- if name then
- handle("return {")
- else
- handle("{")
- end
+local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
+ noquotes = _noquotes
+ hexify = _hexify
+ handle = _handle or print
+ reduce = _reduce or false
+ compact = table.serialize_compact
+ inline = compact and table.serialize_inline
+ functions = table.serialize_functions
+ local tname = type(name)
+ if tname == "string" then
+ if name == "return" then
+ handle("return {")
else
- handle("t={")
+ handle(name .. "={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ elseif tname == "number" then
+ if hexify then
+ handle(("[0x%04X]={"):format(name))
+ else
+ handle("[" .. name .. "]={")
end
- handle("}")
- end
-
- --~ name:
- --~
- --~ true : return { }
- --~ false : { }
- --~ nil : t = { }
- --~ string : string = { }
- --~ 'return' : return { }
- --~ number : [number] = { }
-
- function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
- local function flush(s)
- t[#t+1] = s
+ elseif tname == "boolean" then
+ if name then
+ handle("return {")
+ else
+ handle("{")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
- return concat(t,"\n")
+ else
+ handle("t={")
end
+ if root and next(root) then
+ do_serialize(root,name,"",0,indexed)
+ end
+ handle("}")
+end
- function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
+--~ name:
+--~
+--~ true : return { }
+--~ false : { }
+--~ nil : t = { }
+--~ string : string = { }
+--~ 'return' : return { }
+--~ number : [number] = { }
+
+function table.serialize(root,name,reduce,noquotes,hexify)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
end
+ serialize(root,name,flush,reduce,noquotes,hexify)
+ return concat(t,"\n")
+end
- -- sometimes tables are real use (zapfino extra pro is some 85M) in which
- -- case a stepwise serialization is nice; actually, we could consider:
- --
- -- for line in table.serializer(root,name,reduce,noquotes) do
- -- ...(line)
- -- end
- --
- -- so this is on the todo list
+function table.tohandle(handle,root,name,reduce,noquotes,hexify)
+ serialize(root,name,handle,reduce,noquotes,hexify)
+end
- table.tofile_maxtab = 2*1024
+-- sometimes tables are real use (zapfino extra pro is some 85M) in which
+-- case a stepwise serialization is nice; actually, we could consider:
+--
+-- for line in table.serializer(root,name,reduce,noquotes) do
+-- ...(line)
+-- end
+--
+-- so this is on the todo list
- function table.tofile(filename,root,name,reduce,noquotes,hexify)
- local f = io.open(filename,'w')
- if f then
- local maxtab = table.tofile_maxtab
- if maxtab > 1 then
- local t = { }
- local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
- f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
- end
- end
- serialize(root,name,flush,reduce,noquotes,hexify)
- f:write(concat(t,"\n"),"\n")
- else
- local function flush(s)
- f:write(s,"\n")
+table.tofile_maxtab = 2*1024
+
+function table.tofile(filename,root,name,reduce,noquotes,hexify)
+ local f = io.open(filename,'w')
+ if f then
+ local maxtab = table.tofile_maxtab
+ if maxtab > 1 then
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ if #t > maxtab then
+ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
+ t = { }
end
- serialize(root,name,flush,reduce,noquotes,hexify)
end
- f:close()
+ serialize(root,name,flush,reduce,noquotes,hexify)
+ f:write(concat(t,"\n"),"\n")
+ else
+ local function flush(s)
+ f:write(s,"\n")
+ end
+ serialize(root,name,flush,reduce,noquotes,hexify)
end
+ f:close()
end
-
end
-do
-
- local function flatten(t,f,complete)
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
- else
- f[#f+1] = v
- end
+local function flatten(t,f,complete)
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if complete or type(v[1]) == "table" then
+ flatten(v,f,complete)
else
f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
end
+end
- function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
- end
+function table.flatten(t)
+ local f = { }
+ flatten(t,f,true)
+ return f
+end
- function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
- end
+function table.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+end
+
+table.flatten_one_level = table.unnest
- table.flatten_one_level = table.unnest
+-- the next three may disappear
+function table.remove_value(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
end
function table.insert_before_value(t,value,str)
- for i=1,#t do
- if t[i] == value then
- table.insert(t,i,str)
- return
+ if str then
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,str)
+ return
+ end
+ end
end
+ insert(t,1,str)
+ elseif value then
+ insert(t,1,value)
end
- table.insert(t,1,str)
end
function table.insert_after_value(t,value,str)
- for i=1,#t do
- if t[i] == value then
- table.insert(t,i+1,str)
- return
+ if str then
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,str)
+ return
+ end
+ end
end
+ t[#t+1] = str
+ elseif value then
+ t[#t+1] = value
end
- t[#t+1] = str
end
function table.are_equal(a,b,n,m)
@@ -1243,27 +1047,11 @@ function table.compact(t)
end
end
-function table.tohash(t)
- local h = { }
- for _, v in pairs(t) do -- no ipairs here
- h[v] = true
- end
- return h
-end
-
-function table.fromhash(t)
- local h = { }
- for k, v in pairs(t) do -- no ipairs here
- if v then h[#h+1] = k end
- end
- return h
-end
-
function table.contains(t, v)
if t then
for i=1, #t do
if t[i] == v then
- return true
+ return i
end
end
end
@@ -1300,11 +1088,10 @@ function table.clone(t,p) -- t is optional or nil or table
return t
end
-
function table.hexed(t,seperator)
local tt = { }
- for i=1,#t do tt[i] = string.format("0x%04X",t[i]) end
- return table.concat(tt,seperator or " ")
+ for i=1,#t do tt[i] = ("0x%04X"):format(t[i]) end
+ return concat(tt,seperator or " ")
end
function table.reverse_hash(h)
@@ -1344,6 +1131,7 @@ function io.loaddata(filename)
local f = io.open(filename,'rb')
if f then
local data = f:read('*all')
+ -- garbagecollector.check(data)
f:close()
return data
else
@@ -1797,6 +1585,8 @@ if not versions then versions = { } end versions['l-file'] = 1.001
if not file then file = { } end
+local concat = table.concat
+
function file.removesuffix(filename)
return (filename:gsub("%.[%a%d]+$",""))
end
@@ -1833,14 +1623,6 @@ end
file.suffix = file.extname
---~ function file.join(...)
---~ local t = { ... }
---~ for i=1,#t do
---~ t[i] = (t[i]:gsub("\\","/")):gsub("/+$","")
---~ end
---~ return table.concat(t,"/")
---~ end
-
--~ print(file.join("x/","/y"))
--~ print(file.join("http://","/y"))
--~ print(file.join("http://a","/y"))
@@ -1848,7 +1630,7 @@ file.suffix = file.extname
--~ print(file.join("//nas-1","/y"))
function file.join(...)
- local pth = table.concat({...},"/")
+ local pth = concat({...},"/")
pth = pth:gsub("\\","/")
local a, b = pth:match("^(.*://)(.*)$")
if a and b then
@@ -1915,7 +1697,7 @@ function file.split_path(str)
end
function file.join_path(tab)
- return table.concat(tab,io.pathseparator) -- can have trailing //
+ return concat(tab,io.pathseparator) -- can have trailing //
end
function file.collapse_path(str)
@@ -2190,30 +1972,6 @@ if lfs then do
dir.glob_pattern = glob_pattern
- --~ local function glob(pattern, action)
- --~ local t = { }
- --~ local path, rest, patt, recurse
- --~ local action = action or function(name) t[#t+1] = name end
- --~ local pattern = pattern:gsub("^%*%*","./**")
- --~ local pattern = pattern:gsub("/%*/","/**/")
- --~ path, rest = pattern:match("^(/)(.-)$")
- --~ if path then
- --~ path = path
- --~ else
- --~ path, rest = pattern:match("^([^/]*)/(.-)$")
- --~ end
- --~ if rest then
- --~ patt = rest:gsub("([%.%-%+])", "%%%1")
- --~ end
- --~ patt = patt:gsub("%*", "[^/]*")
- --~ patt = patt:gsub("%?", "[^/]")
- --~ patt = patt:gsub("%[%^/%]%*%[%^/%]%*", ".*")
- --~ if path == "" then path = "." end
- --~ recurse = patt:find("%.%*/") ~= nil
- --~ glob_pattern(path,patt,recurse,action)
- --~ return t
- --~ end
-
local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
local pattern = Ct {
@@ -2545,6 +2303,9 @@ end
if not versions then versions = { } end versions['l-unicode'] = 1.001
if not unicode then unicode = { } end
+local concat, utfchar, utfgsub = table.concat, unicode.utf8.char, unicode.utf8.gsub
+local char, byte = string.char, string.byte
+
if not garbagecollector then
garbagecollector = {
push = function() collectgarbage("stop") end,
@@ -2592,23 +2353,21 @@ end
function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
--~ garbagecollector.push()
- local result = { }
- local tc, uc = table.concat, unicode.utf8.char
- local tmp, n, m, p = { }, 0, 0, 0
+ local result, tmp, n, m, p = { }, { }, 0, 0, 0
-- lf | cr | crlf / (cr:13, lf:10)
local function doit()
if n == 10 then
if p ~= 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp,"")
tmp = { }
p = 0
end
elseif n == 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp,"")
tmp = { }
p = n
else
- tmp[#tmp+1] = uc(n)
+ tmp[#tmp+1] = utfchar(n)
p = 0
end
end
@@ -2631,7 +2390,7 @@ function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
end
end
if #tmp > 0 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp,"")
end
--~ garbagecollector.pop()
return result
@@ -2640,22 +2399,21 @@ end
function unicode.utf32_to_utf8(str, endian)
--~ garbagecollector.push()
local result = { }
- local tc, uc = table.concat, unicode.utf8.char
local tmp, n, m, p = { }, 0, -1, 0
-- lf | cr | crlf / (cr:13, lf:10)
local function doit()
if n == 10 then
if p ~= 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp,"")
tmp = { }
p = 0
end
elseif n == 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp,"")
tmp = { }
p = n
else
- tmp[#tmp+1] = uc(n)
+ tmp[#tmp+1] = utfchar(n)
p = 0
end
end
@@ -2681,7 +2439,7 @@ function unicode.utf32_to_utf8(str, endian)
end
end
if #tmp > 0 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp,"")
end
--~ garbagecollector.pop()
return result
@@ -2689,7 +2447,7 @@ end
function unicode.utf8_to_utf16(str,littleendian)
if littleendian then
- return char(255,254) .. utf.gsub(str,".",function(c)
+ return char(255,254) .. utfgsub(str,".",function(c)
local b = byte(c)
if b < 0x10000 then
return char(b%256,b/256)
@@ -2700,7 +2458,7 @@ function unicode.utf8_to_utf16(str,littleendian)
end
end)
else
- return char(254,255) .. utf.gsub(str,".",function(c)
+ return char(254,255) .. utfgsub(str,".",function(c)
local b = byte(c)
if b < 0x10000 then
return char(b/256,b%256)
@@ -2714,6 +2472,35 @@ function unicode.utf8_to_utf16(str,littleendian)
end
+-- filename : l-math.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-math'] = 1.001
+
+local floor = math.floor
+
+if not math.round then
+ function math.round(x)
+ return floor(x + 0.5)
+ end
+end
+
+if not math.div then
+ function math.div(n,m)
+ return floor(n/m)
+ end
+end
+
+if not math.mod then
+ function math.mod(n,m)
+ return n % m
+ end
+end
+
+
-- filename : l-utils.lua
-- comment : split off from luat-lib
-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
@@ -2751,8 +2538,11 @@ utils.merger.strip_comment = true
function utils.merger._self_load_(name)
local f, data = io.open(name), ""
if f then
+ utils.report("reading merge from %s",name)
data = f:read("*all")
f:close()
+ else
+ utils.report("unknown file to merge %s",name)
end
if data and utils.merger.strip_comment then
-- saves some 20K
@@ -2765,6 +2555,7 @@ function utils.merger._self_save_(name, data)
if data ~= "" then
local f = io.open(name,'w')
if f then
+ utils.report("saving merge from %s",name)
f:write(data)
f:close()
end
@@ -2790,13 +2581,13 @@ function utils.merger._self_libs_(libs,list)
local name = string.gsub(pth .. "/" .. lib,"\\","/")
f = io.open(name)
if f then
- -- utils.report("merging library",name)
+ utils.report("merging library %s",name)
result[#result+1] = f:read("*all")
f:close()
list = { pth } -- speed up the search
break
else
- -- utils.report("no library",name)
+ utils.report("no library %s",name)
end
end
end
@@ -2911,7 +2702,7 @@ function environment.setargument(name,value)
environment.arguments[name] = value
end
-function environment.argument(name)
+function environment.argument(name) -- todo: default (plus typecheck on default)
local arguments, sortedflags = environment.arguments, environment.sortedflags
if arguments[name] then
return arguments[name]
@@ -2946,30 +2737,85 @@ function environment.split_arguments(separator) -- rather special, cut-off befor
return before, after
end
-function environment.reconstruct_commandline(arg)
+--~ function environment.reconstruct_commandline(arg)
+--~ if not arg then arg = environment.original_arguments end
+--~ local result = { }
+--~ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+--~ local kk, vv = a:match("^(%-+.-)=(.+)$")
+--~ if kk and vv then
+--~ if vv:find(" ") then
+--~ vv = vv:unquote()
+--~ vv = vv:gsub('"','\\"')
+--~ result[#result+1] = kk .. "=" .. vv:quote()
+--~ else
+--~ a = a:unquote()
+--~ a = a:gsub('"','\\"')
+--~ result[#result+1] = a
+--~ end
+--~ elseif a:find(" ") then
+--~ a = a:unquote()
+--~ a = a:gsub('"','\\"')
+--~ result[#result+1] = a:quote()
+--~ else
+--~ result[#result+1] = a
+--~ end
+--~ end
+--~ return table.join(result," ")
+--~ end
+
+function environment.reconstruct_commandline(arg,noquote)
if not arg then arg = environment.original_arguments end
- local result = { }
- for _,a in ipairs(arg) do -- ipairs 1 .. #n
- local kk, vv = a:match("^(%-+.-)=(.+)$")
- if kk and vv then
- if vv:find(" ") then
- result[#result+1] = kk .. "=" .. string.quote(vv)
+ if noquote and #arg == 1 then
+ local a = arg[1]
+ a = input.resolve(a)
+ a = a:unquote()
+ return a
+ elseif #arg == 1 then
+ local result = { }
+ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+ a = input.resolve(a)
+ a = a:unquote()
+ a = a:gsub('"','\\"') -- tricky
+ if a:find(" ") then
+ result[#result+1] = a:quote()
else
result[#result+1] = a
end
- elseif a:find(" ") then
- result[#result+1] = string.quote(a)
- else
- result[#result+1] = a
end
+ return table.join(result," ")
end
- return table.join(result," ")
end
if arg then
- environment.initialize_arguments(arg)
- environment.original_arguments = arg
+
+ -- new, reconstruct quoted snippets (maybe better just remnove the " then and add them later)
+ local newarg, instring = { }, false
+
+ for index, argument in ipairs(arg) do
+ if argument:find("^\"") then
+ newarg[#newarg+1] = argument:gsub("^\"","")
+ if not argument:find("\"$") then
+ instring = true
+ end
+ elseif argument:find("\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument:gsub("\"$","")
+ instring = false
+ elseif instring then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument
+ else
+ newarg[#newarg+1] = argument
+ end
+ end
+ for i=1,-5,-1 do
+ newarg[i] = arg[i]
+ end
+
+ environment.initialize_arguments(newarg)
+ environment.original_arguments = newarg
+ environment.raw_arguments = arg
+
arg = { } -- prevent duplicate handling
+
end
@@ -3012,7 +2858,7 @@ if not input.hashers then input.hashers = { } end -- load databases
if not input.generators then input.generators = { } end -- generate databases
if not input.filters then input.filters = { } end -- conversion filters
-local format = string.format
+local format, concat, sortedkeys = string.format, table.concat, table.sortedkeys
input.locators.notfound = { nil }
input.hashers.notfound = { nil }
@@ -3816,8 +3662,6 @@ function input.serialize(files)
-- luatools and mtxtools are called frequently. Okay,
-- we pay a small price for properly tabbed tables.
local t = { }
- local concat = table.concat
- local sorted = table.sortedkeys
local function dump(k,v,m)
if type(v) == 'string' then
return m .. "['" .. k .. "']='" .. v .. "',"
@@ -3829,11 +3673,11 @@ function input.serialize(files)
end
t[#t+1] = "return {"
if input.instance.sortdata then
- for _, k in pairs(sorted(files)) do
+ for _, k in pairs(sortedkeys(files)) do
local fk = files[k]
if type(fk) == 'table' then
t[#t+1] = "\t['" .. k .. "']={"
- for _, kk in pairs(sorted(fk)) do
+ for _, kk in pairs(sortedkeys(fk)) do
t[#t+1] = dump(kk,fk[kk],"\t\t")
end
t[#t+1] = "\t},"
@@ -4305,7 +4149,6 @@ end
function input.aux.splitpathexpr(str, t, validate)
-- no need for optimization, only called a few times, we can use lpeg for the sub
t = t or { }
- local concat = table.concat
str = str:gsub(",}",",@}")
str = str:gsub("{,","{@,")
-- str = "@" .. str .. "@"
@@ -4630,7 +4473,7 @@ function input.aux.find_file(filename) -- todo : plugin (scanners, checkers etc)
if input.trace > 2 then
input.logger('? filename: %s',filename)
input.logger('? filetype: %s',filetype or '?')
- input.logger('? wanted files: %s',table.concat(wantedfiles," | "))
+ input.logger('? wanted files: %s',concat(wantedfiles," | "))
end
for _, fname in pairs(wantedfiles) do
if fname and input.is_readable.file(fname) then
@@ -4653,8 +4496,8 @@ function input.aux.find_file(filename) -- todo : plugin (scanners, checkers etc)
local doscan, recurse
if input.trace > 2 then
input.logger('? filename: %s',filename)
- -- if pathlist then input.logger('? path list: %s',table.concat(pathlist," | ")) end
- -- if filelist then input.logger('? file list: %s',table.concat(filelist," | ")) end
+ -- if pathlist then input.logger('? path list: %s',concat(pathlist," | ")) end
+ -- if filelist then input.logger('? file list: %s',concat(filelist," | ")) end
end
-- a bit messy ... esp the doscan setting here
for _, path in pairs(pathlist) do
@@ -4863,6 +4706,8 @@ function input.find_wildcard_files(filename) -- todo: remap:
if done and not allresults then break end
end
end
+ -- we can consider also searching the paths not in the database, but then
+ -- we end up with a messy search (all // in all path specs)
return result
end
@@ -4883,7 +4728,7 @@ function input.save_used_files_in_trees(filename,jobname)
f:write("\t" .. jobname .. " \n")
end
f:write("\t\n")
- for _,v in pairs(table.sortedkeys(instance.foundintrees)) do
+ for _,v in pairs(sorted(instance.foundintrees)) do -- ipairs
f:write("\t\t" .. v .. " \n")
end
f:write("\t \n")
@@ -4989,7 +4834,7 @@ function table.sequenced(t,sep) -- temp here
for k, v in pairs(t) do
s[#s+1] = k .. "=" .. v
end
- return table.concat(s, sep or " | ")
+ return concat(s, sep or " | ")
end
function input.methodhandler(what, filename, filetype) -- ...
@@ -5225,7 +5070,7 @@ do
str[k] = resolve(v) or v
end
elseif str and str ~= "" then
- str = str:gsub("([a-z]+):([^ ]*)", function(method,target)
+ str = str:gsub("([a-z]+):([^ \"\']*)", function(method,target)
if resolvers[method] then
return resolvers[method](target)
else
@@ -5249,7 +5094,7 @@ do
end
function input.boolean_variable(str,default)
- local b = input.expansion("PURGECACHE")
+ local b = input.expansion(str)
if b == "" then
return default
else
@@ -5390,6 +5235,14 @@ function input.reportlines(str) -- todo:
end
end
+input.moreinfo = [[
+more information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
function input.help(banner,message)
if not input.verbose then
input.verbose = true
@@ -5398,6 +5251,10 @@ function input.help(banner,message)
input.report(banner,"\n")
input.report("")
input.reportlines(message)
+ if input.moreinfo and input.moreinfo ~= "" then
+ input.report("")
+ input.reportlines(input.moreinfo)
+ end
end
logs.set_level('error')
@@ -5563,16 +5420,6 @@ function caches.is_writable(filepath,filename)
return file.is_writable(tmaname)
end
-function input.boolean_variable(str,default)
- local b = input.expansion("PURGECACHE")
- if b == "" then
- return default
- else
- b = toboolean(b)
- return (b == nil and default) or b
- end
-end
-
function caches.savedata(filepath,filename,data,raw)
local tmaname, tmcname = caches.setluanames(filepath,filename)
local reduce, simplify = true, true
@@ -5778,7 +5625,7 @@ input.storage.data = { }
input.storage.min = 0 -- 500
input.storage.max = input.storage.min - 1
input.storage.trace = false -- true
-input.storage.done = 0
+input.storage.done = input.storage.done or 0
input.storage.evaluators = { }
-- (evaluate,message,names)
@@ -5836,6 +5683,8 @@ function input.storage.dump()
end
end
+-- we also need to count at generation time (nicer for message)
+
if lua.bytecode then -- from 0 upwards
local i = input.storage.min
while lua.bytecode[i] do
@@ -6176,6 +6025,7 @@ if texconfig and not texlua then
input.logger('= closer: %s (%s), file: %s',tag,unicode.utfname[u],filename)
end
input.show_close(filename)
+ t = nil
end,
--~ getline = function(n)
--~ local line = t.lines[n]
@@ -6237,6 +6087,7 @@ if texconfig and not texlua then
end
input.show_close(filename)
file_handle:close()
+ t = nil
end,
handle = function()
return file_handle
@@ -6273,6 +6124,7 @@ if texconfig and not texlua then
input.logger('+ loader: %s, file: %s',tag,filename)
end
local s = f:read("*a")
+ garbagecollector.check(s)
f:close()
if s then
return true, s, #s
@@ -6306,15 +6158,12 @@ if texconfig and not texlua then do
ctx = ctx or { }
- local ss = { }
-
- function ctx.writestatus(a,b,...)
- local s = ss[a]
- if not ss[a] then
- s = a:rpadd(15) .. ": "
- ss[a] = s
+ function ctx.writestatus(a,b,c,...)
+ if c then
+ texio.write_nl(("%-15s: %s\n"):format(a,b:format(c,...)))
+ else
+ texio.write_nl(("%-15s: %s\n"):format(a,b)) -- b can have %'s
end
- texio.write_nl(s .. format(b,...) .. "\n")
end
-- this will become: ctx.install_statistics(fnc() return ..,.. end) etc
@@ -6326,6 +6175,11 @@ if texconfig and not texlua then do
if #tag > n then n = #tag end
end
+ function ctx.memused()
+ -- collectgarbage("collect")
+ return string.format("%s MB (ctx: %s MB)",math.round(collectgarbage("count")), math.round(status.luastate_bytes/1000))
+ end
+
function ctx.show_statistics() -- todo: move calls
local loadtime, register_statistics = input.loadtime, ctx.register_statistics
if caches then
@@ -6371,8 +6225,8 @@ if texconfig and not texlua then do
if metapost then
register_statistics("metapost processing time", "%s seconds, loading: %s seconds, execution: %s seconds, n: %s", function() return loadtime(metapost), loadtime(mplib), loadtime(metapost.exectime), metapost.n end)
end
- if status.luastate_bytes then
- register_statistics("current memory usage", "%s bytes", function() return status.luastate_bytes end)
+ if status.luastate_bytes and ctx.memused then
+ register_statistics("current memory usage", "%s", ctx.memused)
end
if nodes then
register_statistics("cleaned up reserved nodes", "%s nodes, %s lists of %s", function() return nodes.cleanup_reserved(tex.count[24]) end) -- \topofboxstack
@@ -6775,6 +6629,7 @@ own.libs = { -- todo: check which ones are really needed
'l-dir.lua',
'l-boolean.lua',
'l-unicode.lua',
+ 'l-math.lua',
'l-utils.lua',
'luat-lib.lua',
'luat-inp.lua',
@@ -7099,7 +6954,7 @@ function input.listers.configurations()
for i,c in ipairs(instance.order) do
local str = c[key]
if str then
- print(format("\t%s\t\t%s",i,input.aux.tabstr(str)))
+ print(format("\t%s\t%s",i,str))
end
end
print()
@@ -7185,11 +7040,7 @@ elseif environment.arguments["configurations"] or environment.arguments["show-co
input.my_prepare_a()
input.listers.configurations()
elseif environment.arguments["help"] or (environment.files[1]=='help') or (#environment.files==0) then
- if not input.verbose then
- input.verbose = true
- input.report("%s\n",banner)
- end
- input.reportlines(messages.help) -- input.help ?
+ input.help(banner,messages.help)
else
input.my_prepare_b()
input.for_files(input.find_files, environment.files, instance.my_format)
@@ -7203,5 +7054,3 @@ end
if os.platform == "unix" then
io.write("\n")
end
-
-
diff --git a/scripts/context/lua/mtx-babel.lua b/scripts/context/lua/mtx-babel.lua
index 44254352c..92b1cd597 100644
--- a/scripts/context/lua/mtx-babel.lua
+++ b/scripts/context/lua/mtx-babel.lua
@@ -1,5 +1,5 @@
if not modules then modules = { } end modules ['mtx-babel'] = {
- version = 1.001,
+ version = 1.002,
comment = "companion to mtxrun.lua",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
@@ -188,6 +188,7 @@ do
o = "á½¹",
u = "á½»",
w = "á½½",
+ ["'"] = "’",
}
local replace_20 = { -- ` *
@@ -304,8 +305,10 @@ do
F = "Φ",
Q = "Χ",
Y = "Ψ",
- W = "Ω"
- }
+ W = "Ω",
+ [";"] = "·",
+ ["?"] = ";",
+}
local skips_01 = lpeg.P("\\") * lpeg.R("az", "AZ")^1
local skips_02 = lpeg.P("[") * (1- lpeg.S("[]"))^1 * lpeg.P("]")
@@ -410,7 +413,7 @@ do
end
-banner = banner .. " | babel conversion tools "
+banner = banner .. " | babel conversion tools | version 1.2"
messages.help = [[
--language=string conversion language (e.g. greek)
diff --git a/scripts/context/lua/mtx-context.lua b/scripts/context/lua/mtx-context.lua
index b67bafe9a..7d5eb7e80 100644
--- a/scripts/context/lua/mtx-context.lua
+++ b/scripts/context/lua/mtx-context.lua
@@ -508,6 +508,45 @@ scripts.context.aftersuffixes = {
"pdf", "tuo", "tuc", "log"
}
+scripts.context.interfaces = {
+ en = "cont-en",
+ uk = "cont-uk",
+ de = "cont-de",
+ fr = "cont-fr",
+ nl = "cont-nl",
+ cz = "cont-cz",
+ it = "cont-it",
+ ro = "cont-ro",
+ pe = "cont-pe",
+}
+
+scripts.context.defaultformats = {
+ "cont-en",
+ "cont-nl",
+ "mptopdf",
+ "plain"
+}
+
+local function analyze(filename)
+ local f = io.open(file.addsuffix(filename,"tex"))
+ if f then
+ local t = { }
+ local line = f:read("*line") or ""
+ local preamble = line:match("^%% *(.*)$")
+ if preamble then
+ for key, value in preamble:gmatch("(%S+)=(%S+)") do
+ t[key] = value
+ end
+ t.type = "tex"
+ elseif line:find("^\n",what,language)
+ xmlresult[#xmlresult+1] = format("\t",what)
+ for _, key in ipairs(table.sortedkeys(t)) do
+ local v = t[key]
+ local value = v[language] or v["en"]
+ if not value then
+ input.report(format("warning, no value for key '%s' for language '%s'",key,language))
+ else
+ local value = t[key][language] or t[key].en
+ texresult[#texresult+1] = format("\\setinterface%s{%s}{%s}",tag,key,value)
+ xmlresult[#xmlresult+1] = format("\t\t ",tag,key,value)
+ end
+ end
+ xmlresult[#xmlresult+1] = format("\t \n",tag)
+ end
+ local function replace(str, element, attribute, category, othercategory, language)
+ return str:gsub(format("(<%s[^>]-%s=)([\"\'])([^\"\']-)([\"\'])",element,attribute), function(a,b,c)
+ local cc = category[c]
+ if not cc and othercategory then
+ cc = othercategory[c]
+ end
+ if cc then
+ ccl = cc[language]
+ if ccl then
+ return a .. b .. ccl .. b
+ end
+ end
+ return a .. b .. c .. b
+ end)
+ end
+ for language, _ in pairs(commands.setuplayout) do
+ local texresult, xmlresult = { }, { }
+ texresult[#texresult+1] = format("%% this file is auto-generated, don't edit this file\n%%")
+ xmlresult[#xmlresult+1] = format("\n",tag)
+ xmlresult[#xmlresult+1] = format("\n",language)
+ flush(texresult,xmlresult,language,"variables","variable")
+ flush(texresult,xmlresult,language,"constants","constant")
+ flush(texresult,xmlresult,language,"elements", "element")
+ flush(texresult,xmlresult,language,"commands", "command")
+ texresult[#texresult+1] = format("%%\n\\endinput")
+ xmlresult[#xmlresult+1] = format(" ")
+ local texfilename = format("mult-%s.tex",language)
+ local xmlfilename = format("keys-%s.xml",language)
+ io.savedata(texfilename,table.concat(texresult,"\n"))
+ input.report(format("saving interface definitions '%s'",texfilename))
+ io.savedata(xmlfilename,table.concat(xmlresult,"\n"))
+ input.report(format("saving interface translations '%s'",xmlfilename))
+ if language ~= "en" and xmldata ~= "" then
+ local newdata = xmldata:gsub("(\n"
t[#t+1] = ""
- if modes then
- for k, v in ipairs(modes) do
- local key, value = v:match("^(.*):([^:]-)$")
- if key and value then
- t[#t+1] = string.format("\t%s ",key,value)
- end
+ if joblog.values then
+ for k, v in pairs(joblog.values) do
+ t[#t+1] = string.format("\t%s ", k, tostring(v))
end
+ else
+ t[#t+1] = ""
end
t[#t+1] = " "
- os.remove(ctmname)
- io.savedata(ctmname,table.concat(t,"\n"))
end
+ os.remove(ctmname)
+ io.savedata(ctmname,table.concat(t,"\n"))
end
function scripts.watch.watch()
@@ -97,11 +96,11 @@ do
if newpath ~= "" and newpath ~= "." then
local oldpath = lfs.currentdir()
lfs.chdir(newpath)
- scripts.watch.save_exa_modes(joblog.modes,ctmname)
+ scripts.watch.save_exa_modes(joblog,ctmname)
if pipe then result = os.resultof(command) else result = os.spawn(command) end
lfs.chdir(oldpath)
else
- scripts.watch.save_exa_modes(joblog.modes,ctmname)
+ scripts.watch.save_exa_modes(joblog,ctmname)
if pipe then result = os.resultof(command) else result = os.spawn(command) end
end
logs.report("watch",string.format("return value: %s", result))
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index 45a881839..6c68ec51a 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -37,10 +37,9 @@ if not modules then modules = { } end modules ['mtxrun'] = {
-- remember for subruns: _CTX_K_S_#{original}_
-- remember for subruns: TEXMFSTART.#{original} [tex.rb texmfstart.rb]
+banner = "version 1.1.2 - 2007+ - PRAGMA ADE / CONTEXT" -- not local
texlua = true
-banner = "version 1.1.0 - 2007+ - PRAGMA ADE / CONTEXT" -- not local
-
-- begin library merge
-- filename : l-string.lua
-- comment : split off from luat-lib
@@ -176,7 +175,7 @@ end
--~ end end
-string.chr_to_esc = {
+local chr_to_esc = {
["%"] = "%%",
["."] = "%.",
["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
@@ -186,16 +185,18 @@ string.chr_to_esc = {
["{"] = "%{", ["}"] = "%}"
}
+string.chr_to_esc = chr_to_esc
+
function string:esc() -- variant 2
- return (self:gsub("(.)",string.chr_to_esc))
+ return (self:gsub("(.)",chr_to_esc))
end
-function string.unquote(str)
- return (str:gsub("^([\"\'])(.*)%1$","%2"))
+function string:unquote()
+ return (self:gsub("^([\"\'])(.*)%1$","%2"))
end
-function string.quote(str)
- return '"' .. str:unquote() .. '"'
+function string:quote()
+ return '"' .. self:unquote() .. '"'
end
function string:count(pattern) -- variant 3
@@ -445,6 +446,30 @@ function string:splitlines()
return capture:match(self)
end
+--~ local p = lpeg.splitat("->",false) print(p:match("oeps->what->more")) -- oeps what more
+--~ local p = lpeg.splitat("->",true) print(p:match("oeps->what->more")) -- oeps what->more
+--~ local p = lpeg.splitat("->",false) print(p:match("oeps")) -- oeps
+--~ local p = lpeg.splitat("->",true) print(p:match("oeps")) -- oeps
+
+local splitters_s, splitters_m = { }, { }
+
+function lpeg.splitat(separator,single)
+ local splitter = (single and splitters_s[separator]) or splitters_m[separator]
+ if not splitter then
+ separator = lpeg.P(separator)
+ if single then
+ local other, any = lpeg.C((1 - separator)^0), lpeg.P(1)
+ splitter = other * (separator * lpeg.C(any^0) + "")
+ splitters_s[separator] = splitter
+ else
+ local other = lpeg.C((1 - separator)^0)
+ splitter = other * (separator * other)^0
+ splitters_m[separator] = splitter
+ end
+ end
+ return splitter
+end
+
-- filename : l-table.lua
-- comment : split off from luat-lib
@@ -456,11 +481,15 @@ if not versions then versions = { } end versions['l-table'] = 1.001
table.join = table.concat
+local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
+local format = string.format
+local getmetatable, setmetatable = getmetatable, setmetatable
+local pairs, ipairs, type, next, tostring = pairs, ipairs, type, next, tostring
+
function table.strip(tab)
local lst = { }
- for k, v in ipairs(tab) do
- -- s = string.gsub(v, "^%s*(.-)%s*$", "%1")
- s = v:gsub("^%s*(.-)%s*$", "%1")
+ for i=1,#tab do
+ local s = tab[i]:gsub("^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
@@ -470,16 +499,7 @@ function table.strip(tab)
return lst
end
---~ function table.sortedkeys(tab)
---~ local srt = { }
---~ for key,_ in pairs(tab) do
---~ srt[#srt+1] = key
---~ end
---~ table.sort(srt)
---~ return srt
---~ end
-
-function table.sortedkeys(tab)
+local function sortedkeys(tab)
local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in pairs(tab) do
srt[#srt+1] = key
@@ -499,22 +519,34 @@ function table.sortedkeys(tab)
end
end
if kind == 0 or kind == 3 then
- table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
+ sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
else
- table.sort(srt)
+ sort(srt)
+ end
+ return srt
+end
+
+local function sortedhashkeys(tab) -- fast one
+ local srt = { }
+ for key,_ in pairs(tab) do
+ srt[#srt+1] = key
end
+ sort(srt)
return srt
end
+table.sortedkeys = sortedkeys
+table.sortedhashkeys = sortedhashkeys
+
function table.append(t, list)
for _,v in pairs(list) do
- table.insert(t,v)
+ insert(t,v)
end
end
function table.prepend(t, list)
for k,v in pairs(list) do
- table.insert(t,k,v)
+ insert(t,k,v)
end
end
@@ -561,70 +593,57 @@ function table.imerged(...)
return tmp
end
-if not table.fastcopy then do
-
- local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable
-
- local function fastcopy(old) -- fast one
- if old then
- local new = { }
- for k,v in pairs(old) do
- if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
- else
- new[k] = v
- end
- end
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+local function fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in pairs(old) do
+ if type(v) == "table" then
+ new[k] = fastcopy(v) -- was just table.copy
+ else
+ new[k] = v
end
- return new
- else
- return { }
end
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
+ return new
+ else
+ return { }
end
+end
- table.fastcopy = fastcopy
-
-end end
-
-if not table.copy then do
-
- local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable
-
- local function copy(t, tables) -- taken from lua wiki, slightly adapted
- tables = tables or { }
- local tcopy = {}
- if not tables[t] then
- tables[t] = tcopy
- end
- for i,v in pairs(t) do -- brrr, what happens with sparse indexed
- if type(i) == "table" then
- if tables[i] then
- i = tables[i]
- else
- i = copy(i, tables)
- end
- end
- if type(v) ~= "table" then
- tcopy[i] = v
- elseif tables[v] then
- tcopy[i] = tables[v]
+local function copy(t, tables) -- taken from lua wiki, slightly adapted
+ tables = tables or { }
+ local tcopy = {}
+ if not tables[t] then
+ tables[t] = tcopy
+ end
+ for i,v in pairs(t) do -- brrr, what happens with sparse indexed
+ if type(i) == "table" then
+ if tables[i] then
+ i = tables[i]
else
- tcopy[i] = copy(v, tables)
+ i = copy(i, tables)
end
end
- local mt = getmetatable(t)
- if mt then
- setmetatable(tcopy,mt)
+ if type(v) ~= "table" then
+ tcopy[i] = v
+ elseif tables[v] then
+ tcopy[i] = tables[v]
+ else
+ tcopy[i] = copy(v, tables)
end
- return tcopy
end
+ local mt = getmetatable(t)
+ if mt then
+ setmetatable(tcopy,mt)
+ end
+ return tcopy
+end
- table.copy = copy
-
-end end
+table.fastcopy = fastcopy
+table.copy = copy
-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
@@ -653,257 +672,22 @@ function table.starts_at(t)
return ipairs(t,1)(t,0)
end
---~ do
-
---~ -- one of my first exercises in lua ...
-
---~ table.serialize_functions = true
---~ table.serialize_compact = true
---~ table.serialize_inline = true
-
---~ local function key(k,noquotes)
---~ if type(k) == "number" then -- or k:find("^%d+$") then
---~ return "["..k.."]"
---~ elseif noquotes and k:find("^%a[%a%d%_]*$") then
---~ return k
---~ else
---~ return '["'..k..'"]'
---~ end
---~ end
-
---~ local function simple_table(t)
---~ if #t > 0 then
---~ local n = 0
---~ for _,v in pairs(t) do
---~ n = n + 1
---~ end
---~ if n == #t then
---~ local tt = { }
---~ for i=1,#t do
---~ local v = t[i]
---~ local tv = type(v)
---~ if tv == "number" or tv == "boolean" then
---~ tt[#tt+1] = tostring(v)
---~ elseif tv == "string" then
---~ tt[#tt+1] = ("%q"):format(v)
---~ else
---~ tt = nil
---~ break
---~ end
---~ end
---~ return tt
---~ end
---~ end
---~ return nil
---~ end
-
---~ local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed)
---~ handle = handle or print
---~ reduce = reduce or false
---~ if depth then
---~ depth = depth .. " "
---~ if indexed then
---~ handle(("%s{"):format(depth))
---~ else
---~ handle(("%s%s={"):format(depth,key(name,noquotes)))
---~ end
---~ else
---~ depth = ""
---~ local tname = type(name)
---~ if tname == "string" then
---~ if name == "return" then
---~ handle("return {")
---~ else
---~ handle(name .. "={")
---~ end
---~ elseif tname == "number" then
---~ handle("[" .. name .. "]={")
---~ elseif tname == "boolean" then
---~ if name then
---~ handle("return {")
---~ else
---~ handle("{")
---~ end
---~ else
---~ handle("t={")
---~ end
---~ end
---~ if root and next(root) then
---~ local compact = table.serialize_compact
---~ local inline = compact and table.serialize_inline
---~ local first, last = nil, 0 -- #root cannot be trusted here
---~ if compact then
---~ for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
---~ if not first then first = k end
---~ last = last + 1
---~ end
---~ end
---~ for _,k in pairs(table.sortedkeys(root)) do
---~ local v = root[k]
---~ local t = type(v)
---~ if compact and first and type(k) == "number" and k >= first and k <= last then
---~ if t == "number" then
---~ handle(("%s %s,"):format(depth,v))
---~ elseif t == "string" then
---~ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
---~ handle(("%s %s,"):format(depth,v))
---~ else
---~ handle(("%s %q,"):format(depth,v))
---~ end
---~ elseif t == "table" then
---~ if not next(v) then
---~ handle(("%s {},"):format(depth))
---~ elseif inline then
---~ local st = simple_table(v)
---~ if st then
---~ handle(("%s { %s },"):format(depth,table.concat(st,", ")))
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
---~ end
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
---~ end
---~ elseif t == "boolean" then
---~ handle(("%s %s,"):format(depth,tostring(v)))
---~ elseif t == "function" then
---~ if table.serialize_functions then
---~ handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
---~ else
---~ handle(('%s "function",'):format(depth))
---~ end
---~ else
---~ handle(("%s %q,"):format(depth,tostring(v)))
---~ end
---~ elseif k == "__p__" then -- parent
---~ if false then
---~ handle(("%s __p__=nil,"):format(depth))
---~ end
---~ elseif t == "number" then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),v))
---~ elseif t == "string" then
---~ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),v))
---~ else
---~ handle(("%s %s=%q,"):format(depth,key(k,noquotes),v))
---~ end
---~ elseif t == "table" then
---~ if not next(v) then
---~ handle(("%s %s={},"):format(depth,key(k,noquotes)))
---~ elseif inline then
---~ local st = simple_table(v)
---~ if st then
---~ handle(("%s %s={ %s },"):format(depth,key(k,noquotes),table.concat(st,", ")))
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes)
---~ end
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes)
---~ end
---~ elseif t == "boolean" then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),tostring(v)))
---~ elseif t == "function" then
---~ if table.serialize_functions then
---~ handle(('%s %s=loadstring(%q),'):format(depth,key(k,noquotes),string.dump(v)))
---~ else
---~ handle(('%s %s="function",'):format(depth,key(k,noquotes)))
---~ end
---~ else
---~ handle(("%s %s=%q,"):format(depth,key(k,noquotes),tostring(v)))
---~ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k,noquotes),string.dump(function() return v end)))
---~ end
---~ end
---~ if level > 0 then
---~ handle(("%s},"):format(depth))
---~ else
---~ handle(("%s}"):format(depth))
---~ end
---~ else
---~ handle(("%s}"):format(depth))
---~ end
---~ end
-
---~ --~ name:
---~ --~
---~ --~ true : return { }
---~ --~ false : { }
---~ --~ nil : t = { }
---~ --~ string : string = { }
---~ --~ 'return' : return { }
---~ --~ number : [number] = { }
-
---~ function table.serialize(root,name,reduce,noquotes)
---~ local t = { }
---~ local function flush(s)
---~ t[#t+1] = s
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ return table.concat(t,"\n")
---~ end
-
---~ function table.tohandle(handle,root,name,reduce,noquotes)
---~ serialize(root, name, handle, nil, 0, reduce, noquotes)
---~ end
-
---~ -- sometimes tables are real use (zapfino extra pro is some 85M) in which
---~ -- case a stepwise serialization is nice; actually, we could consider:
---~ --
---~ -- for line in table.serializer(root,name,reduce,noquotes) do
---~ -- ...(line)
---~ -- end
---~ --
---~ -- so this is on the todo list
-
---~ table.tofile_maxtab = 2*1024
-
---~ function table.tofile(filename,root,name,reduce,noquotes)
---~ local f = io.open(filename,'w')
---~ if f then
---~ local concat = table.concat
---~ local maxtab = table.tofile_maxtab
---~ if maxtab > 1 then
---~ local t = { }
---~ local function flush(s)
---~ t[#t+1] = s
---~ if #t > maxtab then
---~ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
---~ t = { }
---~ end
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ f:write(concat(t,"\n"),"\n")
---~ else
---~ local function flush(s)
---~ f:write(s,"\n")
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ end
---~ f:close()
---~ end
---~ end
-
---~ end
+function table.tohash(t,value)
+ local h = { }
+ if value == nil then value = true end
+ for _, v in pairs(t) do -- no ipairs here
+ h[v] = value
+ end
+ return h
+end
---~ t = {
---~ b = "123",
---~ a = "x",
---~ c = 1.23,
---~ d = "1.23",
---~ e = true,
---~ f = {
---~ d = "1.23",
---~ a = "x",
---~ b = "123",
---~ c = 1.23,
---~ e = true,
---~ f = {
---~ e = true,
---~ f = {
---~ e = true
---~ },
---~ },
---~ },
---~ g = function() end
---~ }
+function table.fromhash(t)
+ local h = { }
+ for k, v in pairs(t) do -- no ipairs here
+ if v then h[#h+1] = k end
+ end
+ return h
+end
--~ print(table.serialize(t), "\n")
--~ print(table.serialize(t,"name"), "\n")
@@ -912,320 +696,339 @@ end
--~ print(table.serialize(t,"name",true), "\n")
--~ print(table.serialize(t,"name",true,true), "\n")
-do
+table.serialize_functions = true
+table.serialize_compact = true
+table.serialize_inline = true
- table.serialize_functions = true
- table.serialize_compact = true
- table.serialize_inline = true
+local noquotes, hexify, handle, reduce, compact, inline, functions
- local sortedkeys = table.sortedkeys
- local format, concat = string.format, table.concat
- local noquotes, hexify, handle, reduce, compact, inline, functions
- local pairs, ipairs, type, next, tostring = pairs, ipairs, type, next, tostring
+local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+ 'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
+ 'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
+}
- local function key(k)
- if type(k) == "number" then -- or k:find("^%d+$") then
- if hexify then
- return ("[0x%04X]"):format(k)
- else
- return "["..k.."]"
- end
- elseif noquotes and k:find("^%a[%a%d%_]*$") then
- return k
+local function key(k)
+ if type(k) == "number" then -- or k:find("^%d+$") then
+ if hexify then
+ return ("[0x%04X]"):format(k)
else
- return '["'..k..'"]'
+ return "["..k.."]"
end
+ elseif noquotes and not reserved[k] and k:find("^%a[%a%d%_]*$") then
+ return k
+ else
+ return '["'..k..'"]'
end
+end
- local function simple_table(t)
- if #t > 0 then
- local n = 0
- for _,v in pairs(t) do
- n = n + 1
- end
- if n == #t then
- local tt = { }
- for i=1,#t do
- local v = t[i]
- local tv = type(v)
- if tv == "number" then
- if hexify then
- tt[#tt+1] = ("0x%04X"):format(v)
- else
- tt[#tt+1] = tostring(v)
- end
- elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
- elseif tv == "string" then
- tt[#tt+1] = ("%q"):format(v)
+local function simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in pairs(t) do
+ n = n + 1
+ end
+ if n == #t then
+ local tt = { }
+ for i=1,#t do
+ local v = t[i]
+ local tv = type(v)
+ if tv == "number" then
+ if hexify then
+ tt[#tt+1] = ("0x%04X"):format(v)
else
- tt = nil
- break
+ tt[#tt+1] = tostring(v)
end
+ elseif tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = ("%q"):format(v)
+ else
+ tt = nil
+ break
end
- return tt
end
+ return tt
end
- return nil
end
+ return nil
+end
- local function do_serialize(root,name,depth,level,indexed)
- if level > 0 then
- depth = depth .. " "
- if indexed then
- handle(("%s{"):format(depth))
- elseif name then
- handle(("%s%s={"):format(depth,key(name)))
- else
- handle(("%s{"):format(depth))
- end
+local function do_serialize(root,name,depth,level,indexed)
+ if level > 0 then
+ depth = depth .. " "
+ if indexed then
+ handle(("%s{"):format(depth))
+ elseif name then
+ handle(("%s%s={"):format(depth,key(name)))
+ else
+ handle(("%s{"):format(depth))
end
- if root and next(root) then
- local first, last = nil, 0 -- #root cannot be trusted here
- if compact then
- for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
- if not first then first = k end
- last = last + 1
- end
+ end
+ if root and next(root) then
+ local first, last = nil, 0 -- #root cannot be trusted here
+ if compact then
+ for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
+ if not first then first = k end
+ last = last + 1
end
- --~ for _,k in pairs(sortedkeys(root)) do -- 1% faster:
- local sk = sortedkeys(root)
- for i=1,#sk do
- local k = sk[i]
- local v = root[k]
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
- if t == "number" then
- if hexify then
- handle(("%s 0x%04X,"):format(depth,v))
- else
- handle(("%s %s,"):format(depth,v))
- end
- elseif t == "string" then
- if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
- handle(("%s %s,"):format(depth,v))
- else
- handle(("%s %q,"):format(depth,v))
- end
- elseif t == "table" then
- if not next(v) then
- handle(("%s {},"):format(depth))
- elseif inline then
- local st = simple_table(v)
- if st then
- handle(("%s { %s },"):format(depth,concat(st,", ")))
- else
- do_serialize(v,k,depth,level+1,true)
- end
- else
- do_serialize(v,k,depth,level+1,true)
- end
- elseif t == "boolean" then
- handle(("%s %s,"):format(depth,tostring(v)))
- elseif t == "function" then
- if functions then
- handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
- else
- handle(('%s "function",'):format(depth))
- end
- else
- handle(("%s %q,"):format(depth,tostring(v)))
- end
- elseif k == "__p__" then -- parent
- if false then
- handle(("%s __p__=nil,"):format(depth))
- end
- elseif t == "number" then
+ end
+ --~ for _,k in pairs(sortedkeys(root)) do -- 1% faster:
+ local sk = sortedkeys(root)
+ for i=1,#sk do
+ local k = sk[i]
+ local v = root[k]
+ local t = type(v)
+ if compact and first and type(k) == "number" and k >= first and k <= last then
+ if t == "number" then
if hexify then
- handle(("%s %s=0x%04X,"):format(depth,key(k),v))
+ handle(("%s 0x%04X,"):format(depth,v))
else
- handle(("%s %s=%s,"):format(depth,key(k),v))
+ handle(("%s %s,"):format(depth,v))
end
elseif t == "string" then
if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
- handle(("%s %s=%s,"):format(depth,key(k),v))
+ handle(("%s %s,"):format(depth,v))
else
- handle(("%s %s=%q,"):format(depth,key(k),v))
+ handle(("%s %q,"):format(depth,v))
end
elseif t == "table" then
if not next(v) then
- handle(("%s %s={},"):format(depth,key(k)))
+ handle(("%s {},"):format(depth))
elseif inline then
local st = simple_table(v)
if st then
- handle(("%s %s={ %s },"):format(depth,key(k),concat(st,", ")))
+ handle(("%s { %s },"):format(depth,concat(st,", ")))
else
- do_serialize(v,k,depth,level+1)
+ do_serialize(v,k,depth,level+1,true)
end
else
- do_serialize(v,k,depth,level+1)
+ do_serialize(v,k,depth,level+1,true)
end
elseif t == "boolean" then
- handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ handle(("%s %s,"):format(depth,tostring(v)))
elseif t == "function" then
if functions then
- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v)))
+ handle(('%s loadstring(%q),'):format(depth,v:dump()))
else
- handle(('%s %s="function",'):format(depth,key(k)))
+ handle(('%s "function",'):format(depth))
end
else
- handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
- -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
+ handle(("%s %q,"):format(depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(("%s __p__=nil,"):format(depth))
+ end
+ elseif t == "number" then
+ if hexify then
+ handle(("%s %s=0x%04X,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ end
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s %s={},"):format(depth,key(k)))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s %s={ %s },"):format(depth,key(k),concat(st,", ")))
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ elseif t == "function" then
+ if functions then
+ handle(('%s %s=loadstring(%q),'):format(depth,key(k),v:dump()))
+ else
+ handle(('%s %s="function",'):format(depth,key(k)))
end
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
+ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
end
end
- if level > 0 then
- handle(("%s},"):format(depth))
- end
end
+ if level > 0 then
+ handle(("%s},"):format(depth))
+ end
+end
- local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
- local tname = type(name)
- if tname == "string" then
- if name == "return" then
- handle("return {")
- else
- handle(name .. "={")
- end
- elseif tname == "number" then
- if hexify then
- handle(format("[0x%04X]={",name))
- else
- handle("[" .. name .. "]={")
- end
- elseif tname == "boolean" then
- if name then
- handle("return {")
- else
- handle("{")
- end
+local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
+ noquotes = _noquotes
+ hexify = _hexify
+ handle = _handle or print
+ reduce = _reduce or false
+ compact = table.serialize_compact
+ inline = compact and table.serialize_inline
+ functions = table.serialize_functions
+ local tname = type(name)
+ if tname == "string" then
+ if name == "return" then
+ handle("return {")
else
- handle("t={")
+ handle(name .. "={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ elseif tname == "number" then
+ if hexify then
+ handle(("[0x%04X]={"):format(name))
+ else
+ handle("[" .. name .. "]={")
end
- handle("}")
- end
-
- --~ name:
- --~
- --~ true : return { }
- --~ false : { }
- --~ nil : t = { }
- --~ string : string = { }
- --~ 'return' : return { }
- --~ number : [number] = { }
-
- function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
- local function flush(s)
- t[#t+1] = s
+ elseif tname == "boolean" then
+ if name then
+ handle("return {")
+ else
+ handle("{")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
- return concat(t,"\n")
+ else
+ handle("t={")
+ end
+ if root and next(root) then
+ do_serialize(root,name,"",0,indexed)
end
+ handle("}")
+end
- function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
+--~ name:
+--~
+--~ true : return { }
+--~ false : { }
+--~ nil : t = { }
+--~ string : string = { }
+--~ 'return' : return { }
+--~ number : [number] = { }
+
+function table.serialize(root,name,reduce,noquotes,hexify)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
end
+ serialize(root,name,flush,reduce,noquotes,hexify)
+ return concat(t,"\n")
+end
- -- sometimes tables are real use (zapfino extra pro is some 85M) in which
- -- case a stepwise serialization is nice; actually, we could consider:
- --
- -- for line in table.serializer(root,name,reduce,noquotes) do
- -- ...(line)
- -- end
- --
- -- so this is on the todo list
+function table.tohandle(handle,root,name,reduce,noquotes,hexify)
+ serialize(root,name,handle,reduce,noquotes,hexify)
+end
- table.tofile_maxtab = 2*1024
+-- sometimes tables are real use (zapfino extra pro is some 85M) in which
+-- case a stepwise serialization is nice; actually, we could consider:
+--
+-- for line in table.serializer(root,name,reduce,noquotes) do
+-- ...(line)
+-- end
+--
+-- so this is on the todo list
- function table.tofile(filename,root,name,reduce,noquotes,hexify)
- local f = io.open(filename,'w')
- if f then
- local maxtab = table.tofile_maxtab
- if maxtab > 1 then
- local t = { }
- local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
- f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
- end
- end
- serialize(root,name,flush,reduce,noquotes,hexify)
- f:write(concat(t,"\n"),"\n")
- else
- local function flush(s)
- f:write(s,"\n")
+table.tofile_maxtab = 2*1024
+
+function table.tofile(filename,root,name,reduce,noquotes,hexify)
+ local f = io.open(filename,'w')
+ if f then
+ local maxtab = table.tofile_maxtab
+ if maxtab > 1 then
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ if #t > maxtab then
+ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
+ t = { }
end
- serialize(root,name,flush,reduce,noquotes,hexify)
end
- f:close()
+ serialize(root,name,flush,reduce,noquotes,hexify)
+ f:write(concat(t,"\n"),"\n")
+ else
+ local function flush(s)
+ f:write(s,"\n")
+ end
+ serialize(root,name,flush,reduce,noquotes,hexify)
end
+ f:close()
end
-
end
-do
-
- local function flatten(t,f,complete)
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
- else
- f[#f+1] = v
- end
+local function flatten(t,f,complete)
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if complete or type(v[1]) == "table" then
+ flatten(v,f,complete)
else
f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
end
+end
- function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
- end
+function table.flatten(t)
+ local f = { }
+ flatten(t,f,true)
+ return f
+end
- function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
- end
+function table.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+end
+
+table.flatten_one_level = table.unnest
- table.flatten_one_level = table.unnest
+-- the next three may disappear
+function table.remove_value(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
end
function table.insert_before_value(t,value,str)
- for i=1,#t do
- if t[i] == value then
- table.insert(t,i,str)
- return
+ if str then
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,str)
+ return
+ end
+ end
end
+ insert(t,1,str)
+ elseif value then
+ insert(t,1,value)
end
- table.insert(t,1,str)
end
function table.insert_after_value(t,value,str)
- for i=1,#t do
- if t[i] == value then
- table.insert(t,i+1,str)
- return
+ if str then
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,str)
+ return
+ end
+ end
end
+ t[#t+1] = str
+ elseif value then
+ t[#t+1] = value
end
- t[#t+1] = str
end
function table.are_equal(a,b,n,m)
@@ -1256,27 +1059,11 @@ function table.compact(t)
end
end
-function table.tohash(t)
- local h = { }
- for _, v in pairs(t) do -- no ipairs here
- h[v] = true
- end
- return h
-end
-
-function table.fromhash(t)
- local h = { }
- for k, v in pairs(t) do -- no ipairs here
- if v then h[#h+1] = k end
- end
- return h
-end
-
function table.contains(t, v)
if t then
for i=1, #t do
if t[i] == v then
- return true
+ return i
end
end
end
@@ -1313,11 +1100,10 @@ function table.clone(t,p) -- t is optional or nil or table
return t
end
-
function table.hexed(t,seperator)
local tt = { }
- for i=1,#t do tt[i] = string.format("0x%04X",t[i]) end
- return table.concat(tt,seperator or " ")
+ for i=1,#t do tt[i] = ("0x%04X"):format(t[i]) end
+ return concat(tt,seperator or " ")
end
function table.reverse_hash(h)
@@ -1357,6 +1143,7 @@ function io.loaddata(filename)
local f = io.open(filename,'rb')
if f then
local data = f:read('*all')
+ -- garbagecollector.check(data)
f:close()
return data
else
@@ -1810,6 +1597,8 @@ if not versions then versions = { } end versions['l-file'] = 1.001
if not file then file = { } end
+local concat = table.concat
+
function file.removesuffix(filename)
return (filename:gsub("%.[%a%d]+$",""))
end
@@ -1846,14 +1635,6 @@ end
file.suffix = file.extname
---~ function file.join(...)
---~ local t = { ... }
---~ for i=1,#t do
---~ t[i] = (t[i]:gsub("\\","/")):gsub("/+$","")
---~ end
---~ return table.concat(t,"/")
---~ end
-
--~ print(file.join("x/","/y"))
--~ print(file.join("http://","/y"))
--~ print(file.join("http://a","/y"))
@@ -1861,7 +1642,7 @@ file.suffix = file.extname
--~ print(file.join("//nas-1","/y"))
function file.join(...)
- local pth = table.concat({...},"/")
+ local pth = concat({...},"/")
pth = pth:gsub("\\","/")
local a, b = pth:match("^(.*://)(.*)$")
if a and b then
@@ -1928,7 +1709,7 @@ function file.split_path(str)
end
function file.join_path(tab)
- return table.concat(tab,io.pathseparator) -- can have trailing //
+ return concat(tab,io.pathseparator) -- can have trailing //
end
function file.collapse_path(str)
@@ -2098,30 +1879,6 @@ if lfs then do
dir.glob_pattern = glob_pattern
- --~ local function glob(pattern, action)
- --~ local t = { }
- --~ local path, rest, patt, recurse
- --~ local action = action or function(name) t[#t+1] = name end
- --~ local pattern = pattern:gsub("^%*%*","./**")
- --~ local pattern = pattern:gsub("/%*/","/**/")
- --~ path, rest = pattern:match("^(/)(.-)$")
- --~ if path then
- --~ path = path
- --~ else
- --~ path, rest = pattern:match("^([^/]*)/(.-)$")
- --~ end
- --~ if rest then
- --~ patt = rest:gsub("([%.%-%+])", "%%%1")
- --~ end
- --~ patt = patt:gsub("%*", "[^/]*")
- --~ patt = patt:gsub("%?", "[^/]")
- --~ patt = patt:gsub("%[%^/%]%*%[%^/%]%*", ".*")
- --~ if path == "" then path = "." end
- --~ recurse = patt:find("%.%*/") ~= nil
- --~ glob_pattern(path,patt,recurse,action)
- --~ return t
- --~ end
-
local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
local pattern = Ct {
@@ -2444,6 +2201,35 @@ function boolean.falsetrue()
end
+-- filename : l-math.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-math'] = 1.001
+
+local floor = math.floor
+
+if not math.round then
+ function math.round(x)
+ return floor(x + 0.5)
+ end
+end
+
+if not math.div then
+ function math.div(n,m)
+ return floor(n/m)
+ end
+end
+
+if not math.mod then
+ function math.mod(n,m)
+ return n % m
+ end
+end
+
+
if not modules then modules = { } end modules ['l-xml'] = {
version = 1.001,
comment = "this module is the basis for the lxml-* ones",
@@ -2487,11 +2273,11 @@ xml.trace_lpath = false
xml.trace_print = false
xml.trace_remap = false
-local format, concat = string.format, table.concat
+local format, concat, remove, insert, type, next = string.format, table.concat, table.remove, table.insert, type, next
--~ local pairs, next, type = pairs, next, type
--- todo: some things per xml file, liek namespace remapping
+-- todo: some things per xml file, like namespace remapping
--[[ldx--
First a hack to enable namespace resolving. A namespace is characterized by
@@ -2600,7 +2386,7 @@ do
-- not just one big nested table capture (lpeg overflow)
- local remove, nsremap, resolvens = table.remove, xml.xmlns, xml.resolvens
+ local nsremap, resolvens = xml.xmlns, xml.resolvens
local stack, top, dt, at, xmlns, errorstr, entities = {}, {}, {}, {}, {}, nil, {}
@@ -3091,8 +2877,8 @@ do
end
end
if not found then
- table.insert(dt, 1, { special=true, ns="", tg="@pi@", dt = { "xml version='1.0' standalone='yes'"} } )
- table.insert(dt, 2, "\n" )
+ insert(dt, 1, { special=true, ns="", tg="@pi@", dt = { "xml version='1.0' standalone='yes'"} } )
+ insert(dt, 2, "\n" )
end
end
end
@@ -3235,9 +3021,11 @@ local lpathcached = 0 -- statisctics
do
- xml.functions = xml.functions or { }
+ xml.functions = xml.functions or { }
+ xml.expressions = xml.expressions or { }
- local functions = xml.functions
+ local functions = xml.functions
+ local expressions = xml.expressions
local actions = {
[10] = "stay",
@@ -3261,34 +3049,32 @@ do
[40] = "processing instruction",
}
- --~ local function make_expression(str) --could also be an lpeg
- --~ str = str:gsub("@([a-zA-Z%-_]+)", "(a['%1'] or '')")
- --~ str = str:gsub("position%(%)", "i")
- --~ str = str:gsub("text%(%)", "t")
- --~ str = str:gsub("!=", "~=")
- --~ str = str:gsub("([^=!~<>])=([^=!~<>])", "%1==%2")
- --~ str = str:gsub("([a-zA-Z%-_]+)%(", "functions.%1(")
- --~ return str, loadstring(format("return function(functions,i,a,t) return %s end", str))()
- --~ end
-
-- a rather dumb lpeg
local P, S, R, C, V, Cc = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc
- local lp_position = P("position()") / "id"
+ -- instead of using functions we just parse a few names which saves a call
+ -- later on
+
+ local lp_position = P("position()") / "ps"
+ local lp_index = P("index()") / "id"
local lp_text = P("text()") / "tx"
- local lp_name = P("name()") / "((rt.ns~='' and rt.ns..':'..rt.tg) or '')"
- local lp_tag = P("tag()") / "(rt.tg or '')"
- local lp_ns = P("ns()") / "(rt.ns or '')"
+ local lp_name = P("name()") / "(ns~='' and ns..':'..tg)" -- "((rt.ns~='' and rt.ns..':'..rt.tg) or '')"
+ local lp_tag = P("tag()") / "tg" -- (rt.tg or '')
+ local lp_ns = P("ns()") / "ns" -- (rt.ns or '')
local lp_noequal = P("!=") / "~=" + P("<=") + P(">=") + P("==")
local lp_doequal = P("=") / "=="
local lp_attribute = P("@") / "" * Cc("(at['") * R("az","AZ","--","__")^1 * Cc("'] or '')")
- local lp_function = C(R("az","AZ","--","__")^1) * P("(") / function(t)
- if functions[t] then
- return "functions." .. t .. "("
+ local lp_lua_function = C(R("az","AZ","--","__")^1 * (P(".") * R("az","AZ","--","__")^1)^1) * P("(") / function(t) -- todo: better . handling
+ return t .. "("
+ end
+
+ local lp_function = C(R("az","AZ","--","__")^1) * P("(") / function(t) -- todo: better . handling
+ if expressions[t] then
+ return "expressions." .. t .. "("
else
- return "functions.error("
+ return "expressions.error("
end
end
@@ -3296,34 +3082,45 @@ do
local rparent = lpeg.P(")")
local noparent = 1 - (lparent+rparent)
local nested = lpeg.P{lparent * (noparent + lpeg.V(1))^0 * rparent}
- local value = lpeg.P(lparent * lpeg.C((noparent + nested)^0) * rparent)
+ local value = lpeg.P(lparent * lpeg.C((noparent + nested)^0) * rparent) -- lpeg.P{"("*C(((1-S("()"))+V(1))^0)*")"}
---~ local value = P { "(" * C(((1 - S("()")) + V(1))^0) * ")" }
+ -- if we use a dedicated namespace then we don't need to pass rt and k
local lp_special = (C(P("name")+P("text")+P("tag"))) * value / function(t,s)
- if functions[t] then
+ if expressions[t] then
if s then
- return "functions." .. t .. "(rt,k," .. s ..")"
+ return "expressions." .. t .. "(r,k," .. s ..")"
else
- return "functions." .. t .. "(rt,k)"
+ return "expressions." .. t .. "(r,k)"
end
else
- return "functions.error(" .. t .. ")"
+ return "expressions.error(" .. t .. ")"
end
end
local converter = lpeg.Cs ( (
lp_position +
+ lp_index +
lp_text + lp_name + -- fast one
lp_special +
lp_noequal + lp_doequal +
lp_attribute +
+ lp_lua_function +
lp_function +
1 )^1 )
+ -- expressions,root,rootdt,k,e,edt,ns,tg,idx,hsh[tg] or 1
+
+ local template = [[
+ return function(expressions,r,d,k,e,dt,ns,tg,id,ps)
+ local at, tx = e.at or { }, dt[1] or ""
+ return %s
+ end
+ ]]
+
local function make_expression(str)
str = converter:match(str)
- return str, loadstring(format("return function(functions,id,at,tx,rt,k) return %s end", str))()
+ return str, loadstring(format(template,str))()
end
local map = { }
@@ -3433,7 +3230,7 @@ do
local selector = (
instruction +
- many + any +
+--~ many + any + -- brrr, not here !
parent + stay +
dont_position + position +
dont_match_one_of_and_eq + dont_match_one_of_and_ne +
@@ -3445,6 +3242,7 @@ do
has_attribute + has_value +
dont_match_one_of + match_one_of +
dont_match + match +
+ many + any +
crap + empty
)
@@ -3481,7 +3279,7 @@ do
return { map[2] }
end
if m ~= 11 and m ~= 12 and m ~= 13 and m ~= 14 and m ~= 15 and m ~= 16 then
- table.insert(map, 1, { 16 })
+ insert(map, 1, { 16 })
end
-- print((table.serialize(map)):gsub("[ \n]+"," "))
return map
@@ -3580,22 +3378,25 @@ functions.
do
- local functions = xml.functions
+ local functions = xml.functions
+ local expressions = xml.expressions
- functions.contains = string.find
- functions.find = string.find
- functions.upper = string.upper
- functions.lower = string.lower
- functions.number = tonumber
- functions.boolean = toboolean
+ expressions.contains = string.find
+ expressions.find = string.find
+ expressions.upper = string.upper
+ expressions.lower = string.lower
+ expressions.number = tonumber
+ expressions.boolean = toboolean
- functions.oneof = function(s,...) -- slow
+ expressions.oneof = function(s,...) -- slow
local t = {...} for i=1,#t do if s == t[i] then return true end end return false
end
- functions.error = function(str)
- xml.error_handler("unknown function in lpath expression",str)
+
+ expressions.error = function(str)
+ xml.error_handler("unknown function in lpath expression",str or "?")
return false
end
+
functions.text = function(root,k,n) -- unchecked, maybe one deeper
local t = type(t)
if t == "string" then
@@ -3605,6 +3406,7 @@ do
return (rdt and rdt[k]) or root[k] or ""
end
end
+
functions.name = function(d,k,n) -- ns + tg
local found = false
n = n or 0
@@ -3649,6 +3451,7 @@ do
return ""
end
end
+
functions.tag = function(d,k,n) -- only tg
local found = false
n = n or 0
@@ -3685,6 +3488,10 @@ do
return (found and found.tg) or ""
end
+ expressions.text = functions.text
+ expressions.name = functions.name
+ expressions.tag = functions.tag
+
local function traverse(root,pattern,handle,reverse,index,parent,wildcard) -- multiple only for tags, not for namespaces
if not root then -- error
return false
@@ -3757,10 +3564,13 @@ do
start, stop, step = stop, start, -1
end
local idx = 0
+ local hsh = { } -- this will slooow down the lot
for k=start,stop,step do -- we used to have functions for all but a case is faster
local e = rootdt[k]
local ns, tg = e.rn or e.ns, e.tg
if tg then
+ -- we can optimize this for simple searches, but it probably does not pay off
+ hsh[tg] = (hsh[tg] or 0) + 1
idx = idx + 1
if command == 30 then
local ns_a, tg_a = action[3], action[4]
@@ -3883,7 +3693,7 @@ do
end
if not action[2] then matched = not matched end
if matched then
- matched = action[6](functions,idx,e.at or { },edt[1],rootdt,k)
+ matched = action[6](expressions,root,rootdt,k,e,edt,ns,tg,idx,hsh[tg] or 1)
end
end
if matched then -- combine tg test and at test
@@ -4358,10 +4168,10 @@ do
local r, d, k, element = m[1], m[2], m[3], m[4]
if not before then k = k + 1 end
if element.tg then
- table.insert(d,k,element) -- untested
+ insert(d,k,element) -- untested
elseif element.dt then
for _,v in ipairs(element.dt) do -- i added
- table.insert(d,k,v)
+ insert(d,k,v)
k = k + 1
end
end
@@ -4449,7 +4259,7 @@ do
xml.each_element(xmldata, pattern, include)
end
- function xml.strip_whitespace(root, pattern) -- strips all leading and trailing space !
+ function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
traverse(root, lpath(pattern), function(r,d,k)
local dkdt = d[k].dt
if dkdt then -- can be optimized
@@ -4457,11 +4267,18 @@ do
for i=1,#dkdt do
local str = dkdt[i]
if type(str) == "string" then
- str = str:gsub("^[ \n\r\t]*(.-)[ \n\r\t]*$","%1")
+
if str == "" then
-- stripped
else
- t[#t+1] = str
+ if nolines then
+ str = str:gsub("[ \n\r\t]+"," ")
+ end
+ if str == "" then
+ -- stripped
+ else
+ t[#t+1] = str
+ end
end
else
t[#t+1] = str
@@ -4853,8 +4670,11 @@ utils.merger.strip_comment = true
function utils.merger._self_load_(name)
local f, data = io.open(name), ""
if f then
+ utils.report("reading merge from %s",name)
data = f:read("*all")
f:close()
+ else
+ utils.report("unknown file to merge %s",name)
end
if data and utils.merger.strip_comment then
-- saves some 20K
@@ -4867,6 +4687,7 @@ function utils.merger._self_save_(name, data)
if data ~= "" then
local f = io.open(name,'w')
if f then
+ utils.report("saving merge from %s",name)
f:write(data)
f:close()
end
@@ -4892,13 +4713,13 @@ function utils.merger._self_libs_(libs,list)
local name = string.gsub(pth .. "/" .. lib,"\\","/")
f = io.open(name)
if f then
- -- utils.report("merging library",name)
+ utils.report("merging library %s",name)
result[#result+1] = f:read("*all")
f:close()
list = { pth } -- speed up the search
break
else
- -- utils.report("no library",name)
+ utils.report("no library %s",name)
end
end
end
@@ -5013,7 +4834,7 @@ function environment.setargument(name,value)
environment.arguments[name] = value
end
-function environment.argument(name)
+function environment.argument(name) -- todo: default (plus typecheck on default)
local arguments, sortedflags = environment.arguments, environment.sortedflags
if arguments[name] then
return arguments[name]
@@ -5048,30 +4869,85 @@ function environment.split_arguments(separator) -- rather special, cut-off befor
return before, after
end
-function environment.reconstruct_commandline(arg)
+--~ function environment.reconstruct_commandline(arg)
+--~ if not arg then arg = environment.original_arguments end
+--~ local result = { }
+--~ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+--~ local kk, vv = a:match("^(%-+.-)=(.+)$")
+--~ if kk and vv then
+--~ if vv:find(" ") then
+--~ vv = vv:unquote()
+--~ vv = vv:gsub('"','\\"')
+--~ result[#result+1] = kk .. "=" .. vv:quote()
+--~ else
+--~ a = a:unquote()
+--~ a = a:gsub('"','\\"')
+--~ result[#result+1] = a
+--~ end
+--~ elseif a:find(" ") then
+--~ a = a:unquote()
+--~ a = a:gsub('"','\\"')
+--~ result[#result+1] = a:quote()
+--~ else
+--~ result[#result+1] = a
+--~ end
+--~ end
+--~ return table.join(result," ")
+--~ end
+
+function environment.reconstruct_commandline(arg,noquote)
if not arg then arg = environment.original_arguments end
- local result = { }
- for _,a in ipairs(arg) do -- ipairs 1 .. #n
- local kk, vv = a:match("^(%-+.-)=(.+)$")
- if kk and vv then
- if vv:find(" ") then
- result[#result+1] = kk .. "=" .. string.quote(vv)
+ if noquote and #arg == 1 then
+ local a = arg[1]
+ a = input.resolve(a)
+ a = a:unquote()
+ return a
+ elseif #arg == 1 then
+ local result = { }
+ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+ a = input.resolve(a)
+ a = a:unquote()
+ a = a:gsub('"','\\"') -- tricky
+ if a:find(" ") then
+ result[#result+1] = a:quote()
else
result[#result+1] = a
end
- elseif a:find(" ") then
- result[#result+1] = string.quote(a)
- else
- result[#result+1] = a
end
+ return table.join(result," ")
end
- return table.join(result," ")
end
if arg then
- environment.initialize_arguments(arg)
- environment.original_arguments = arg
+
+ -- new, reconstruct quoted snippets (maybe better just remnove the " then and add them later)
+ local newarg, instring = { }, false
+
+ for index, argument in ipairs(arg) do
+ if argument:find("^\"") then
+ newarg[#newarg+1] = argument:gsub("^\"","")
+ if not argument:find("\"$") then
+ instring = true
+ end
+ elseif argument:find("\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument:gsub("\"$","")
+ instring = false
+ elseif instring then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument
+ else
+ newarg[#newarg+1] = argument
+ end
+ end
+ for i=1,-5,-1 do
+ newarg[i] = arg[i]
+ end
+
+ environment.initialize_arguments(newarg)
+ environment.original_arguments = newarg
+ environment.raw_arguments = arg
+
arg = { } -- prevent duplicate handling
+
end
@@ -5114,7 +4990,7 @@ if not input.hashers then input.hashers = { } end -- load databases
if not input.generators then input.generators = { } end -- generate databases
if not input.filters then input.filters = { } end -- conversion filters
-local format = string.format
+local format, concat, sortedkeys = string.format, table.concat, table.sortedkeys
input.locators.notfound = { nil }
input.hashers.notfound = { nil }
@@ -5918,8 +5794,6 @@ function input.serialize(files)
-- luatools and mtxtools are called frequently. Okay,
-- we pay a small price for properly tabbed tables.
local t = { }
- local concat = table.concat
- local sorted = table.sortedkeys
local function dump(k,v,m)
if type(v) == 'string' then
return m .. "['" .. k .. "']='" .. v .. "',"
@@ -5931,11 +5805,11 @@ function input.serialize(files)
end
t[#t+1] = "return {"
if input.instance.sortdata then
- for _, k in pairs(sorted(files)) do
+ for _, k in pairs(sortedkeys(files)) do
local fk = files[k]
if type(fk) == 'table' then
t[#t+1] = "\t['" .. k .. "']={"
- for _, kk in pairs(sorted(fk)) do
+ for _, kk in pairs(sortedkeys(fk)) do
t[#t+1] = dump(kk,fk[kk],"\t\t")
end
t[#t+1] = "\t},"
@@ -6407,7 +6281,6 @@ end
function input.aux.splitpathexpr(str, t, validate)
-- no need for optimization, only called a few times, we can use lpeg for the sub
t = t or { }
- local concat = table.concat
str = str:gsub(",}",",@}")
str = str:gsub("{,","{@,")
-- str = "@" .. str .. "@"
@@ -6732,7 +6605,7 @@ function input.aux.find_file(filename) -- todo : plugin (scanners, checkers etc)
if input.trace > 2 then
input.logger('? filename: %s',filename)
input.logger('? filetype: %s',filetype or '?')
- input.logger('? wanted files: %s',table.concat(wantedfiles," | "))
+ input.logger('? wanted files: %s',concat(wantedfiles," | "))
end
for _, fname in pairs(wantedfiles) do
if fname and input.is_readable.file(fname) then
@@ -6755,8 +6628,8 @@ function input.aux.find_file(filename) -- todo : plugin (scanners, checkers etc)
local doscan, recurse
if input.trace > 2 then
input.logger('? filename: %s',filename)
- -- if pathlist then input.logger('? path list: %s',table.concat(pathlist," | ")) end
- -- if filelist then input.logger('? file list: %s',table.concat(filelist," | ")) end
+ -- if pathlist then input.logger('? path list: %s',concat(pathlist," | ")) end
+ -- if filelist then input.logger('? file list: %s',concat(filelist," | ")) end
end
-- a bit messy ... esp the doscan setting here
for _, path in pairs(pathlist) do
@@ -6965,6 +6838,8 @@ function input.find_wildcard_files(filename) -- todo: remap:
if done and not allresults then break end
end
end
+ -- we can consider also searching the paths not in the database, but then
+ -- we end up with a messy search (all // in all path specs)
return result
end
@@ -6985,7 +6860,7 @@ function input.save_used_files_in_trees(filename,jobname)
f:write("\t" .. jobname .. " \n")
end
f:write("\t\n")
- for _,v in pairs(table.sortedkeys(instance.foundintrees)) do
+ for _,v in pairs(sorted(instance.foundintrees)) do -- ipairs
f:write("\t\t" .. v .. " \n")
end
f:write("\t \n")
@@ -7091,7 +6966,7 @@ function table.sequenced(t,sep) -- temp here
for k, v in pairs(t) do
s[#s+1] = k .. "=" .. v
end
- return table.concat(s, sep or " | ")
+ return concat(s, sep or " | ")
end
function input.methodhandler(what, filename, filetype) -- ...
@@ -7327,7 +7202,7 @@ do
str[k] = resolve(v) or v
end
elseif str and str ~= "" then
- str = str:gsub("([a-z]+):([^ ]*)", function(method,target)
+ str = str:gsub("([a-z]+):([^ \"\']*)", function(method,target)
if resolvers[method] then
return resolvers[method](target)
else
@@ -7351,7 +7226,7 @@ do
end
function input.boolean_variable(str,default)
- local b = input.expansion("PURGECACHE")
+ local b = input.expansion(str)
if b == "" then
return default
else
@@ -7492,6 +7367,14 @@ function input.reportlines(str) -- todo:
end
end
+input.moreinfo = [[
+more information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
function input.help(banner,message)
if not input.verbose then
input.verbose = true
@@ -7500,6 +7383,10 @@ function input.help(banner,message)
input.report(banner,"\n")
input.report("")
input.reportlines(message)
+ if input.moreinfo and input.moreinfo ~= "" then
+ input.report("")
+ input.reportlines(input.moreinfo)
+ end
end
logs.set_level('error')
@@ -7665,16 +7552,6 @@ function caches.is_writable(filepath,filename)
return file.is_writable(tmaname)
end
-function input.boolean_variable(str,default)
- local b = input.expansion("PURGECACHE")
- if b == "" then
- return default
- else
- b = toboolean(b)
- return (b == nil and default) or b
- end
-end
-
function caches.savedata(filepath,filename,data,raw)
local tmaname, tmcname = caches.setluanames(filepath,filename)
local reduce, simplify = true, true
@@ -7880,7 +7757,7 @@ input.storage.data = { }
input.storage.min = 0 -- 500
input.storage.max = input.storage.min - 1
input.storage.trace = false -- true
-input.storage.done = 0
+input.storage.done = input.storage.done or 0
input.storage.evaluators = { }
-- (evaluate,message,names)
@@ -7938,6 +7815,8 @@ function input.storage.dump()
end
end
+-- we also need to count at generation time (nicer for message)
+
if lua.bytecode then -- from 0 upwards
local i = input.storage.min
while lua.bytecode[i] do
@@ -8080,6 +7959,14 @@ function input.reportlines(str) -- todo:
end
end
+input.moreinfo = [[
+more information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
function input.help(banner,message)
if not input.verbose then
input.verbose = true
@@ -8088,6 +7975,10 @@ function input.help(banner,message)
input.report(banner,"\n")
input.report("")
input.reportlines(message)
+ if input.moreinfo and input.moreinfo ~= "" then
+ input.report("")
+ input.reportlines(input.moreinfo)
+ end
end
logs.set_level('error')
@@ -8294,6 +8185,7 @@ own.libs = { -- todo: check which ones are really needed
'l-file.lua',
'l-dir.lua',
'l-boolean.lua',
+ 'l-math.lua',
'l-xml.lua',
-- 'l-unicode.lua',
'l-utils.lua',
@@ -8358,15 +8250,11 @@ if not input then
end
input.instance = input.reset()
-input.verbose = environment.argument("verbose") or false
input.banner = 'MtxRun'
utils.report = input.report
local instance = input.instance
-instance.engine = environment.argument("engine") or 'luatex'
-instance.progname = environment.argument("progname") or 'context'
-instance.lsrmode = environment.argument("lsr") or false
-- use os.env or environment when available
@@ -8509,6 +8397,8 @@ function os.currentplatform(name, default)
local architecture = os.arch()
if architecture:find("x86_64") then
return "linux-64"
+ elseif architecture:find("ppc") then
+ return "linux-ppc"
else
return "linux"
end
@@ -8550,7 +8440,7 @@ input.runners.registered = {
mptopdf = { 'mptopdf.pl', true },
pstopdf = { 'pstopdf.rb', true },
- examplex = { 'examplex.rb', false },
+-- examplex = { 'examplex.rb', false },
concheck = { 'concheck.rb', false },
runtools = { 'runtools.rb', true },
@@ -8571,8 +8461,8 @@ input.runners.registered = {
if not messages then messages = { } end
messages.help = [[
---script run an mtx script
---execute run a script or program
+--script run an mtx script (--noquotes)
+--execute run a script or program (--noquotes)
--resolve resolve prefixed arguments
--ctxlua run internally (using preloaded libs)
--locate locate given filename
@@ -8661,6 +8551,7 @@ end
function input.runners.execute_script(fullname,internal)
local instance = input.instance
+ local noquote = environment.argument("noquotes")
if fullname and fullname ~= "" then
local state = input.runners.prepare()
if state == 'error' then
@@ -8709,7 +8600,7 @@ function input.runners.execute_script(fullname,internal)
result = binary .. " " .. result
end
local before, after = environment.split_arguments(fullname)
- local command = result .. " " .. environment.reconstruct_commandline(after)
+ local command = result .. " " .. environment.reconstruct_commandline(after,noquote)
input.report("")
input.report("executing: %s",command)
input.report("\n \n")
@@ -8724,6 +8615,7 @@ function input.runners.execute_script(fullname,internal)
end
function input.runners.execute_program(fullname)
+ local noquote = environment.argument("noquotes")
if fullname and fullname ~= "" then
local state = input.runners.prepare()
if state == 'error' then
@@ -8734,7 +8626,7 @@ function input.runners.execute_program(fullname)
local before, after = environment.split_arguments(fullname)
environment.initialize_arguments(after)
fullname = fullname:gsub("^bin:","")
- local command = fullname .. " " .. environment.reconstruct_commandline(after)
+ local command = fullname .. " " .. (environment.reconstruct_commandline(after or "",noquote) or "")
input.report("")
input.report("executing: %s",command)
input.report("\n \n")
@@ -8813,11 +8705,17 @@ function input.runners.report_location(result)
end
end
-function input.runners.edit_script(filename)
- local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'scite'
+function input.runners.edit_script(filename) -- we assume that vim is present on most systems
+ local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'vim'
local rest = input.resolve(filename)
if rest ~= "" then
- os.launch(editor .. " " .. rest)
+ local command = editor .. " " .. rest
+ if input.verbose then
+ input.report("")
+ input.report("starting editor: %s",command)
+ input.report("\n \n")
+ end
+ os.launch(command)
end
end
@@ -8894,7 +8792,7 @@ function input.runners.launch_file(filename)
end
end
-function input.runners.execute_ctx_script(filename,arguments)
+function input.runners.find_mtx_script(filename)
local function found(name)
local path = file.dirname(name)
if path and path ~= "" then
@@ -8904,27 +8802,45 @@ function input.runners.execute_ctx_script(filename,arguments)
return io.exists(fullname) and fullname
end
end
- local suffix = ""
- if not filename:find("%.lua$") then suffix = ".lua" end
- local fullname = filename
- -- just
- fullname = filename .. suffix
- fullname = input.find_file(fullname)
- -- mtx-
- if not fullname or fullname == "" then
- fullname = "mtx-" .. filename .. suffix
- fullname = found(fullname) or input.find_file(fullname)
+ filename = file.addsuffix(filename,"lua")
+ local basename = file.stripsuffix(file.basename(filename))
+ local suffix = file.extname(filename)
+ -- qualified path, raw name
+ local fullname = input.aux.qualified_path(filename) and io.exists(filename) and filename
+ if fullname and fullname ~= "" then
+ return fullname
+ end
+ -- current path, raw name
+ fullname = "./" .. filename
+ fullname = io.exists(fullname) and fullname
+ if fullname and fullname ~= "" then
+ return fullname
end
- -- mtx-s
- if not fullname or fullname == "" then
- fullname = "mtx-" .. filename .. "s" .. suffix
- fullname = found(fullname) or input.find_file(fullname)
+ -- context namespace, mtx-
+ fullname = "mtx-" .. filename
+ fullname = found(fullname) or input.find_file(fullname)
+ if fullname and fullname ~= "" then
+ return fullname
+ end
+ -- context namespace, mtx-s
+ fullname = "mtx-" .. basename .. "s" .. "." .. suffix
+ fullname = found(fullname) or input.find_file(fullname)
+ if fullname and fullname ~= "" then
+ return fullname
end
- -- mtx-
- if not fullname or fullname == "" then
- fullname = "mtx-" .. filename:gsub("s$","") .. suffix
- fullname = found(fullname) or input.find_file(fullname)
+ -- context namespace, mtx-
+ fullname = "mtx-" .. basename:gsub("s$","") .. "." .. suffix
+ fullname = found(fullname) or input.find_file(fullname)
+ if fullname and fullname ~= "" then
+ return fullname
end
+ -- context namespace, just
+ fullname = input.find_file(fullname)
+ return fullname
+end
+
+function input.runners.execute_ctx_script(filename,arguments)
+ local fullname = input.runners.find_mtx_script(filename)
-- that should do it
if fullname and fullname ~= "" then
local state = input.runners.prepare()
@@ -8957,10 +8873,13 @@ function input.runners.execute_ctx_script(filename,arguments)
end
else
input.verbose = true
+ filename = file.addsuffix(filename,"lua")
if filename == "" then
- input.report("unknown script")
+ input.report("unknown script, no name given")
+ elseif input.aux.qualified_path(filename) then
+ input.report("unknown script '%s'",filename)
else
- input.report("unknown script: %s",filename)
+ input.report("unknown script '%s' or 'mtx-%s'",filename,filename)
end
return false
end
@@ -8976,12 +8895,14 @@ local filename = environment.files[1] or ""
local ok = true
local before, after = environment.split_arguments(filename)
+environment.initialize_arguments(before)
-input.runners.my_prepare_b()
-before = input.resolve(before) -- experimental here
-after = input.resolve(after) -- experimental here
+instance.engine = environment.argument("engine") or 'luatex'
+instance.progname = environment.argument("progname") or 'context'
+instance.lsrmode = environment.argument("lsr") or false
+input.verbose = environment.argument("verbose") or false
-environment.initialize_arguments(before)
+input.runners.my_prepare_b()
if environment.argument("selfmerge") then
-- embed used libraries
@@ -9027,11 +8948,10 @@ elseif environment.argument("platform")then
elseif environment.argument("help") or filename=='help' or filename == "" then
input.help(banner,messages.help)
-- execute script
- if filename:find("^bin:") then
- ok = input.runners.execute_program(filename)
- else
- ok = input.runners.execute_script(filename)
- end
+elseif filename:find("^bin:") then
+ ok = input.runners.execute_program(filename)
+else
+ ok = input.runners.execute_script(filename)
end
if os.platform == "unix" then
diff --git a/scripts/context/ruby/base/tex.rb b/scripts/context/ruby/base/tex.rb
index 55d62c8ac..4f3e51299 100644
--- a/scripts/context/ruby/base/tex.rb
+++ b/scripts/context/ruby/base/tex.rb
@@ -127,6 +127,7 @@ class TEX
['cont-cs','cs','cont-cz','cz','czech'] .each do |f| @@texformats[f] = 'cont-cs' end
['cont-ro','ro','romanian'] .each do |f| @@texformats[f] = 'cont-ro' end
['cont-gb','gb','cont-uk','uk','british'] .each do |f| @@texformats[f] = 'cont-gb' end
+ ['cont-pe','pe','persian'] .each do |f| @@texformats[f] = 'cont-pe' end
['mptopdf'] .each do |f| @@texformats[f] = 'mptopdf' end
['latex'] .each do |f| @@texformats[f] = 'latex.ltx' end
@@ -141,7 +142,8 @@ class TEX
['plain','default','standard','mptopdf'] .each do |f| @@texmethods[f] = 'plain' end
['cont-en','cont-nl','cont-de','cont-it',
- 'cont-fr','cont-cs','cont-ro','cont-gb'] .each do |f| @@texmethods[f] = 'context' end
+ 'cont-fr','cont-cs','cont-ro','cont-gb',
+ 'cont-pe'] .each do |f| @@texmethods[f] = 'context' end
['latex','pdflatex'] .each do |f| @@texmethods[f] = 'latex' end
['plain','default','standard'] .each do |f| @@mpsmethods[f] = 'plain' end
@@ -151,7 +153,8 @@ class TEX
@@mpsmakestr['plain'] = @@platformslash + "dump"
['cont-en','cont-nl','cont-de','cont-it',
- 'cont-fr','cont-cs','cont-ro','cont-gb'] .each do |f| @@texprocstr[f] = @@platformslash + "emergencyend" end
+ 'cont-fr','cont-cs','cont-ro','cont-gb',
+ 'cont-pe'] .each do |f| @@texprocstr[f] = @@platformslash + "emergencyend" end
@@runoptions['aleph'] = ['--8bit']
@@runoptions['luatex'] = ['--file-line-error']
diff --git a/scripts/context/ruby/base/texutil.rb b/scripts/context/ruby/base/texutil.rb
index 063f67f2d..9e66aecff 100644
--- a/scripts/context/ruby/base/texutil.rb
+++ b/scripts/context/ruby/base/texutil.rb
@@ -483,10 +483,16 @@ class TeXUtil
attr_writer :sortkey
def build(sorter)
- @sortkey = sorter.normalize(sorter.tokenize(@sortkey))
- @sortkey = sorter.remap(sorter.simplify(@key.downcase)) # ??
- if @sortkey.empty? then
- @sortkey = sorter.remap(@command.downcase)
+ if @key then
+ @sortkey = sorter.normalize(sorter.tokenize(@sortkey))
+ @sortkey = sorter.remap(sorter.simplify(@key.downcase)) # ??
+ if @sortkey.empty? then
+ @sortkey = sorter.remap(@command.downcase)
+ end
+ else
+ @key = ""
+ @sortkey = ""
+ # weird
end
end
@@ -618,6 +624,9 @@ class TeXUtil
if special then
@sortkey = "#{@@specialsymbol}#{@sortkey}"
end
+ if @realpage == 0 then
+ @realpage = 999999
+ end
@sortkey = [
@sortkey.downcase,
@sortkey,
@@ -687,7 +696,6 @@ class TeXUtil
alphaclass, alpha = '', ''
@@savedhowto, @@savedfrom, @@savedto, @@savedentry = '', '', '', ''
if @@debug then
- # if true then
list.each do |entry|
handle << "% [#{entry.sortkey.gsub(/#{@@split}/o,'] [')}]\n"
end
@@ -773,7 +781,8 @@ class TeXUtil
copied = true
end
@nofentries += 1 if copied
- if entry.realpage.to_i == 0 then
+ # if entry.realpage.to_i == 0 then
+ if entry.realpage.to_i == 999999 then
Register.flushsavedline(handle)
handle << "\\registersee{#{entry.type}}{#{entry.pagehowto},#{entry.texthowto}}{#{entry.seetoo}}{#{entry.page}}%\n" ;
lastpage, lastrealpage = entry.page, entry.realpage
diff --git a/scripts/context/ruby/ctxtools.rb b/scripts/context/ruby/ctxtools.rb
index 70c9ce243..b5e231e27 100644
--- a/scripts/context/ruby/ctxtools.rb
+++ b/scripts/context/ruby/ctxtools.rb
@@ -305,112 +305,112 @@ class Commands
end
-class Commands
-
- include CommandBase
-
- public
-
- def translateinterface
-
- # since we know what kind of file we're dealing with,
- # we do it quick and dirty instead of using rexml or
- # xslt
-
- interfaces = @commandline.arguments
-
- if interfaces.empty? then
- interfaces = ['cs','de','it','nl','ro','fr']
- else
- interfaces.delete('en')
- end
-
- interfaces.flatten.each do |interface|
-
- variables, constants, strings, list, data = Hash.new, Hash.new, Hash.new, '', ''
-
- keyfile, intfile, outfile = "keys-#{interface}.xml", "cont-en.xml", "cont-#{interface}.xml"
-
- report("generating #{keyfile}")
-
- begin
- one = "texexec --make --all #{interface}"
- two = "texexec --batch --silent --interface=#{interface} x-set-01"
- if @commandline.option("force") then
- system(one)
- system(two)
- elsif not system(two) then
- system(one)
- system(two)
- end
- rescue
- end
-
- unless File.file?(keyfile) then
- report("no #{keyfile} generated")
- next
- end
-
- report("loading #{keyfile}")
-
- begin
- list = IO.read(keyfile)
- rescue
- list = empty
- end
-
- if list.empty? then
- report("error in loading #{keyfile}")
- next
- end
-
- list.i_load('cd:variable', variables)
- list.i_load('cd:constant', constants)
- list.i_load('cd:command' , strings)
- # list.i_load('cd:element' , strings)
-
- report("loading #{intfile}")
-
- begin
- data = IO.read(intfile)
- rescue
- data = empty
- end
-
- if data.empty? then
- report("error in loading #{intfile}")
- next
- end
-
- report("translating interface en to #{interface}")
-
- data.i_translate('cd:string' , 'value', strings)
- data.i_translate('cd:variable' , 'value', variables)
- data.i_translate('cd:parameter', 'name' , constants)
- data.i_translate('cd:constant' , 'type' , variables)
- data.i_translate('cd:variable' , 'type' , variables)
- data.i_translate('cd:inherit' , 'name' , strings)
- # data.i_translate('cd:command' , 'name' , strings)
-
- data.gsub!(/(\]*?language=")en(")/) do
- $1 + interface + $2
- end
-
- report("saving #{outfile}")
-
- begin
- if f = File.open(outfile, 'w') then
- f.write(data)
- f.close
- end
- rescue
- end
-
- end
-
- end
-
-end
+# class Commands
+#
+# include CommandBase
+#
+# public
+#
+# def translateinterface
+#
+# # since we know what kind of file we're dealing with,
+# # we do it quick and dirty instead of using rexml or
+# # xslt
+#
+# interfaces = @commandline.arguments
+#
+# if interfaces.empty? then
+# interfaces = ['cs','de','it','nl','ro','fr']
+# else
+# interfaces.delete('en')
+# end
+#
+# interfaces.flatten.each do |interface|
+#
+# variables, constants, strings, list, data = Hash.new, Hash.new, Hash.new, '', ''
+#
+# keyfile, intfile, outfile = "keys-#{interface}.xml", "cont-en.xml", "cont-#{interface}.xml"
+#
+# report("generating #{keyfile}")
+#
+# begin
+# one = "texexec --make --all #{interface}"
+# two = "texexec --batch --silent --interface=#{interface} x-set-01"
+# if @commandline.option("force") then
+# system(one)
+# system(two)
+# elsif not system(two) then
+# system(one)
+# system(two)
+# end
+# rescue
+# end
+#
+# unless File.file?(keyfile) then
+# report("no #{keyfile} generated")
+# next
+# end
+#
+# report("loading #{keyfile}")
+#
+# begin
+# list = IO.read(keyfile)
+# rescue
+# list = empty
+# end
+#
+# if list.empty? then
+# report("error in loading #{keyfile}")
+# next
+# end
+#
+# list.i_load('cd:variable', variables)
+# list.i_load('cd:constant', constants)
+# list.i_load('cd:command' , strings)
+# # list.i_load('cd:element' , strings)
+#
+# report("loading #{intfile}")
+#
+# begin
+# data = IO.read(intfile)
+# rescue
+# data = empty
+# end
+#
+# if data.empty? then
+# report("error in loading #{intfile}")
+# next
+# end
+#
+# report("translating interface en to #{interface}")
+#
+# data.i_translate('cd:string' , 'value', strings)
+# data.i_translate('cd:variable' , 'value', variables)
+# data.i_translate('cd:parameter', 'name' , constants)
+# data.i_translate('cd:constant' , 'type' , variables)
+# data.i_translate('cd:variable' , 'type' , variables)
+# data.i_translate('cd:inherit' , 'name' , strings)
+# # data.i_translate('cd:command' , 'name' , strings)
+#
+# data.gsub!(/(\]*?language=")en(")/) do
+# $1 + interface + $2
+# end
+#
+# report("saving #{outfile}")
+#
+# begin
+# if f = File.open(outfile, 'w') then
+# f.write(data)
+# f.close
+# end
+# rescue
+# end
+#
+# end
+#
+# end
+#
+# end
class Commands
@@ -2742,7 +2742,7 @@ commandline.registeraction('jeditinterface' , 'generate jedit syntax files [-
commandline.registeraction('bbeditinterface' , 'generate bbedit syntax files [--pipe]')
commandline.registeraction('sciteinterface' , 'generate scite syntax files [--pipe]')
commandline.registeraction('rawinterface' , 'generate raw syntax files [--pipe]')
-commandline.registeraction('translateinterface', 'generate interface files (xml) [nl de ..]')
+# commandline.registeraction('translateinterface', 'generate interface files (xml) [nl de ..]')
commandline.registeraction('purgefiles' , 'remove temporary files [--all --recurse] [basename]')
commandline.registeraction('documentation' , 'generate documentation [--type=] [filename]')
commandline.registeraction('filterpages' ) # no help, hidden temporary feature
diff --git a/tex/context/base/attr-ini.lua b/tex/context/base/attr-ini.lua
index 34e1bb12a..204cabce1 100644
--- a/tex/context/base/attr-ini.lua
+++ b/tex/context/base/attr-ini.lua
@@ -42,8 +42,7 @@ do
for i=1,nofboxes do
local l = tb[i]
if l then
- -- flush(l)
- tb[i] = nil
+ free(tb[i])
nl = nl + 1
end
end
@@ -186,8 +185,7 @@ end
-- shipouts
-shipouts = shipouts or { }
-shipouts.plugins = shipouts.plugins or { }
+shipouts = shipouts or { }
do
@@ -208,116 +206,48 @@ do
local starttiming, stoptiming = input.starttiming, input.stoptiming
local trigger, numbers = nodes.trigger, attributes.numbers
- local function process_attributes(head,plugins)
- if head then -- is already tested
- starttiming(attributes)
- local done, used = false, { }
- for p=1,#plugins do
- local plugin = plugins[p]
- local name = plugin.name
- local attribute = numbers[name]
- if attribute then
- local namespace = plugin.namespace
- if namespace.enabled then
- local initializer = plugin.initializer
- local processor = plugin.processor
- local finalizer = plugin.finalizer
- local resolver = plugin.resolver
- if initializer then
- initializer(namespace,attribute,head)
- end
- if processor then
- local inheritance = (resolver and resolver()) or -1
- local ok -- = false
- head, ok = processor(namespace,attribute,head,inheritance)
- done = done or ok
- end
- if finalizer then -- no need when not ok
- local ok -- = false
- head, ok, used[attribute] = finalizer(namespace,attribute,head)
- done = done or ok
- end
- end
- else
- texio.write_nl(format("undefined attribute %s",name))
+ local function process_attribute(head,plugin) -- head,attribute,enabled,initializer,resolver,processor,finalizer
+ starttiming(attributes)
+ local done, used, ok = false, nil, false
+ local name = plugin.name
+ local attribute = numbers[name]
+ local namespace = plugin.namespace
+ if namespace.enabled then
+ local processor = plugin.processor
+ if processor then
+ local initializer = plugin.initializer
+ local resolver = plugin.resolver
+ local inheritance = (resolver and resolver()) or -1
+ if initializer then
+ initializer(namespace,attribute,head)
end
- end
- if done then
- for p=1,#plugins do
- local plugin = plugins[p]
- local name = plugin.name
- local attribute = numbers[name]
- if used[attribute] then
- local namespace = plugin.namespace
- if namespace.enabled then
- local flusher = plugin.flusher
+ head, ok = processor(namespace,attribute,head,inheritance)
+ if ok then
+ local finalizer = plugin.finalizer
+ if finalizer then
+ head, ok, used = finalizer(namespace,attribute,head)
+ if used then
+ local flusher = plugin.flusher
if flusher then
- local h, d = flusher(namespace,attribute,head,used[attribute])
+ local h, d = flusher(namespace,attribute,head,used)
head = h
end
end
end
+ done = true
end
end
- stoptiming(attributes)
- return head, done
- else
- return head, false
- end
- end
-
- nodes.process_attributes = process_attributes
-
- --~ glyph = 746876
- --~ glue = 376096
- --~ hlist = 152284
- --~ disc = 47224
- --~ kern = 41504
- --~ penalty = 31964
- --~ whatsit = 29048
- --~ vlist = 20136
- --~ rule = 13292
- --~ mark = 4304
- --~ math = 1072
-
- local disc, mark, free = node.id('disc'), node.id('mark'), node.free
-
- local function cleanup_page(head) -- rough
- local prev, start = nil, head
- while start do
- local id, nx = start.id, start.next
- if id == disc or id == mark then
- if prev then
- prev.next = nx
- end
- if start == head then
- head = nx
- end
- local tmp = start
- start = nx
- free(tmp)
- elseif id == hlist or id == vlist then
- local sl = start.list
- if sl then
- start.list = cleanup_page(sl)
- end
- prev, start = start, nx
- else
- prev, start = start, nx
- end
end
- return head
+ stoptiming(attributes)
+ return head, done
end
- nodes.cleanup_page = cleanup_page
-
- nodes.cleanup_page_first = false
+ nodes.process_attribute = process_attribute
- function nodes.process_page(head)
- if nodes.cleanup_page_first then
- head = cleanup_page(head)
+ function nodes.install_attribute_handler(plugin)
+ return function(head)
+ return process_attribute(head,plugin)
end
- return process_attributes(head,shipouts.plugins)
end
end
@@ -330,18 +260,21 @@ states = { }
do
- local glyph, rule, whatsit, hlist, vlist = node.id('glyph'), node.id('rule'), node.id('whatsit'), node.id('hlist'), node.id('vlist')
+ local glyph, glue, rule, whatsit, hlist, vlist = node.id('glyph'), node.id('glue'), node.id('rule'), node.id('whatsit'), node.id('hlist'), node.id('vlist')
local has_attribute, copy = node.has_attribute, node.copy
- local current, used, done = 0, { }, false
+ local current, current_selector, used, done = 0, 0, { }, false
function states.initialize(what, attribute, stack)
- current, used, done = 0, { }, false
+ current, current_selector, used, done = 0, 0, { }, false
end
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
n = copy(n)
n.next = stack
if previous then
@@ -380,7 +313,8 @@ do
local nsdata, nsreviver, nsnone = namespace.data, namespace.reviver, namespace.none
while stack do
local id = stack.id
- if id == glyph or id == whatsit or id == rule then -- or disc
+ -- if id == glyph or (id == whatsit and stack.subtype == 8) or id == rule or (id == glue and stack.leader) then -- or disc
+ if id == glyph or id == rule or (id == glue and stack.leader) then -- or disc
local c = has_attribute(stack,attribute)
if c then
if default and c == inheritance then
@@ -394,6 +328,24 @@ do
stack, head = insert(data,stack,previous,head)
current, done, used[c] = c, true, true
end
+ if id == glue then --leader
+ -- same as *list
+ local content = stack.leader
+ if content then
+ local ok = false
+ if trigger and has_attribute(stack,trigger) then
+ local outer = has_attribute(stack,attribute)
+ if outer ~= inheritance then
+ stack.leader, ok = process(namespace,attribute,content,inheritance,outer)
+ else
+ stack.leader, ok = process(namespace,attribute,content,inheritance,default)
+ end
+ else
+ stack.leader, ok = process(namespace,attribute,content,inheritance,default)
+ end
+ done = done or ok
+ end
+ end
elseif default and inheritance then
if current ~= default then
local data = nsdata[default] or nsreviver(default)
@@ -430,16 +382,21 @@ do
states.process = process
-- we can force a selector, e.g. document wide color spaces, saves a little
+ -- watch out, we need to check both the selector state (like colorspace) and
+ -- the main state (like color), otherwise we get into troubles when a selector
+ -- state changes while the main state stays the same (like two glyphs following
+ -- 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 = namespace.triggering and nodes.triggering and nodes.trigger
local stack, previous, done = head, nil, false
- local nsselector, nsforced, nsselector = namespace.default, namespace.forced, namespace.selector
+ -- local nsselector, nsforced, nsselector = namespace.default, namespace.forced, namespace.selector
+ local nsforced, nsselector = namespace.forced, namespace.selector
local nsdata, nsreviver, nsnone = namespace.data, namespace.reviver, namespace.none
while stack do
local id = stack.id
- if id == glyph or id == whatsit or id == rule then -- or disc
- -- todo: maybe track two states, also selector
+ -- if id == glyph or (id == whatsit and stack.subtype == 8) or id == rule or (id == glue and stack.leader) then -- or disc
+ if id == glyph or id == rule or (id == glue and stack.leader) then -- or disc
local c = has_attribute(stack,attribute)
if c then
if default and c == inheritance then
@@ -448,10 +405,13 @@ do
stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head)
current, done, used[default] = default, true, true
end
- elseif current ~= c then
- local data = nsdata[c] or nsreviver(c)
- stack, head = insert(data[nsforced or has_attribute(stack,nsselector) or nsselector],stack,previous,head)
- current, done, used[c] = c, true, true
+ 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
+ end
end
elseif default and inheritance then
if current ~= default then
@@ -461,7 +421,25 @@ do
end
elseif current > 0 then
stack, head = insert(nsnone,stack,previous,head)
- current, done, used[0] = 0, true, true
+ current, current_selector, done, used[0] = 0, 0, true, true
+ end
+ if id == glue then -- leader
+ -- same as *list
+ local content = stack.leader
+ if content then
+ local ok = false
+ if trigger and has_attribute(stack,trigger) then
+ local outer = has_attribute(stack,attribute)
+ if outer ~= inheritance then
+ stack.leader, ok = selective(namespace,attribute,content,inheritance,outer)
+ else
+ stack.leader, ok = selective(namespace,attribute,content,inheritance,default)
+ end
+ else
+ stack.leader, ok = selective(namespace,attribute,content,inheritance,default)
+ end
+ done = done or ok
+ end
end
elseif id == hlist or id == vlist then
local content = stack.list
@@ -642,12 +620,26 @@ do
return { 4, s, r, g, b, c, m, y, k }
end
+ --~ function colors.spot(parent,f,d,p)
+ --~ return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
+ --~ end
+
function colors.spot(parent,f,d,p)
---~ if type(p) == "string" and p:find(",") then
---~ -- use converted replacement (combination color)
---~ else
---~ -- todo: map gray, rgb, cmyk onto fraction*parent
---~ end
+ if type(p) == "number" then
+ local n = attributes.list[attributes.numbers.color][parent] -- hard coded ref to color number
+ if n then
+ local v = colors.values[n]
+ if v then
+ -- the via cmyk hack is dirty, but it scales better
+ local c, m, y, k = p*v[6], p*v[7], p*v[8], p*v[8]
+ local r, g, b = cmyktorgb(c,m,y,k)
+ local s = cmyktogray(c,m,y,k)
+ return { 5, s, r, g, b, c, m, y, k, parent, f, d, p }
+ end
+ end
+ else
+ -- todo, multitone (maybe p should be a table)
+ end
return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
end
@@ -711,7 +703,7 @@ function colors.value(id)
return colors.values[id]
end
-shipouts.plugins[#shipouts.plugins+1] = {
+shipouts.handle_color = nodes.install_attribute_handler {
name = "color",
namespace = colors,
initializer = states.initialize,
@@ -771,15 +763,13 @@ end
-- check if there is an identity
---~ transparencies.none = transparencies.reference(transparencies.register(nil,1,1))
-
transparencies.none = transparencies.reference(0) -- for the moment the pdf backend does this
function transparencies.value(id)
return transparencies.values[id]
end
-shipouts.plugins[#shipouts.plugins+1] = {
+shipouts.handle_transparency = nodes.install_attribute_handler {
name = "transparency",
namespace = transparencies,
initializer = states.initialize,
@@ -796,19 +786,22 @@ overprints.enabled = false
overprints.data[1] = backends.pdf.literal(format("/GSoverprint gs"))
overprints.data[2] = backends.pdf.literal(format("/GSknockout gs"))
-overprints.none = overprints.data[1]
+overprints.none = overprints.data[2]
overprints.registered = {
overprint = 1,
knockout = 2,
}
+--~ input.storage.register(false, "overprints/registered", overprints.registered, "overprints.registered")
+--~ input.storage.register(false, "overprints/data", overprints.data, "overprints.data")
+
function overprints.register(stamp)
-- states.collect(texsprint(tex.ctxcatcodes,"\\initializePDFoverprint")) -- to be testd
return overprints.registered[stamp] or overprints.registered.overprint
end
-shipouts.plugins[#shipouts.plugins+1] = {
+shipouts.handle_overprint = nodes.install_attribute_handler {
name = "overprint",
namespace = overprints,
initializer = states.initialize,
@@ -818,7 +811,7 @@ shipouts.plugins[#shipouts.plugins+1] = {
--- negative / positive
-negatives = netatives or { }
+negatives = negatives or { }
negatives.data = negatives.data or { }
negatives.enabled = false
@@ -837,7 +830,7 @@ function negatives.register(stamp)
return negatives.registered[stamp] or negatives.registered.positive
end
-shipouts.plugins[#shipouts.plugins+1] = {
+shipouts.handle_negative = nodes.install_attribute_handler {
name = "negative",
namespace = negatives,
initializer = states.initialize,
@@ -885,7 +878,7 @@ end
effects.none = effects.reference(0,0,0) -- faster: backends.pdf.literal("0 Tc 0 w 0 Tr")
-shipouts.plugins[#shipouts.plugins+1] = {
+shipouts.handle_effect = nodes.install_attribute_handler {
name = "effect",
namespace = effects,
initializer = states.initialize,
@@ -893,7 +886,69 @@ shipouts.plugins[#shipouts.plugins+1] = {
processor = states.process,
}
--- layers
+-- layers (ugly code, due to no grouping and such)
+
+viewerlayers = viewerlayers or { }
+viewerlayers.data = viewerlayers.data or { }
+viewerlayers.registered = viewerlayers.registered or { }
+viewerlayers.stamp = "%s"
+viewerlayers.enabled = false
+
+input.storage.register(false, "viewerlayers/registered", viewerlayers.registered, "viewerlayers.registered")
+--~ input.storage.register(false, "viewerlayers/data", viewerlayers.data, "viewerlayers.data")
+
+local somedone = false
+local somedata = { }
+local nonedata = backends.pdf.literal("EMC")
+
+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 = {
+ backends.pdf.literal(format("EMC /OC /%s BDC",name)),
+ backends.pdf.literal(format( "/OC /%s BDC",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)
+ local stamp = format(viewerlayers.stamp,name)
+ local n = viewerlayers.registered[stamp]
+ if not n then
+ n = #viewerlayers.data + 1
+ viewerlayers.data[n] = function() return some(name) end
+ viewerlayers.registered[stamp] = n
+ end
+ return viewerlayers.registered[stamp]
+end
+
+shipouts.handle_viewerlayer = nodes.install_attribute_handler {
+ name = "viewerlayer",
+ namespace = viewerlayers,
+ initializer = initializer,
+ finalizer = states.finalize,
+ processor = states.process,
+}
---~ /OC /somename BDC
---~ EMC
+--~ nodes.tasks.appendaction("shipouts", "finishers", "shipouts.handle_viewerlayer", nil, "notail")
diff --git a/tex/context/base/attr-ini.tex b/tex/context/base/attr-ini.tex
index 5cd49818c..c9e4110e5 100644
--- a/tex/context/base/attr-ini.tex
+++ b/tex/context/base/attr-ini.tex
@@ -126,32 +126,32 @@
\defineattribute[overprint]
\def\registeroverprint#1#2%
- {\initializePDFoverprint % temp here, to be tested in la code (states.collect)
- \setvalue{(os:#1)}{\dosetattribute{overprint}{\ctxlua{tex.print(overprints.register('#2'))}}}}
+ {\setevalue{(os:#1)}{\dosetattribute{overprint}{\ctxlua{tex.print(overprints.register('#2'))}}}}
\def\dotriggeroverprint
- {\ctxlua{overprints.enabled=true}%
+ {\initializePDFoverprint % temp here, to be tested in la code (states.collect)
+ \ctxlua{overprints.enabled=true}%
\gdef\dotriggeroverprint##1{\csname(os:##1)\endcsname}%
\dotriggeroverprint}
-% \registeroverprint{knockout} {knockout}
-% \registeroverprint{overprint}{overprint}
+\registeroverprint{knockout} {knockout}
+\registeroverprint{overprint}{overprint}
% negative
\defineattribute[negative]
\def\registernegative#1#2%
- {\initializePDFnegative % temp here, to be tested in la code (states.collect)
- \setvalue{(ns:#1)}{\dosetattribute{negative}{\ctxlua{tex.print(negatives.register('#2'))}}}}
+ {\setevalue{(ns:#1)}{\dosetattribute{negative}{\ctxlua{tex.print(negatives.register('#2'))}}}}
\def\dotriggernegative
- {\ctxlua{negatives.enabled=true}%
+ {\initializePDFnegative % temp here, to be tested in la code (states.collect)
+ \ctxlua{negatives.enabled=true}%
\gdef\dotriggernegative##1{\csname(ns:##1)\endcsname}%
\dotriggernegative}
-% \registernegative{positive}{positive}
-% \registernegative{negative}{negative}
+\registernegative{positive}{positive}
+\registernegative{negative}{negative}
% effect
@@ -174,8 +174,22 @@
% \registereffect{both}
% \registereffect{hidden}
-% ugly solution
-%
+% viewerlayers
+
+\defineattribute[viewerlayer]
+
+\def\registerviewerlayer#1#2%
+ {\setevalue{(vl:#1)}{\dosetattribute{viewerlayer}{\ctxlua{tex.print(viewerlayers.register('#2'))}}}}
+
+\setevalue{(vl:)}{\doresetattribute{viewerlayer}}
+
+\def\dotriggerviewerlayer
+ {\ctxlua{viewerlayers.enabled=true}%
+ \gdef\dotriggerviewerlayer##1{\csname(vl:##1)\endcsname}%
+ \dotriggerviewerlayer}
+
+% ugly solution for backend handling
+
% \def\shipout
% {%\writestatus{SHIPOUT}{CALLED AT PAGE \realfolio}%
% \dowithnextbox
@@ -247,3 +261,8 @@
% \enableattributeinheritance % will become default
\protect \endinput
+
+% test case
+%
+% {\green \hbox to \hsize{\leaders\hrule \hfill a}\par}
+% {\red \hbox to \hsize{\leaders\hbox{x}\hfill a}\par}
diff --git a/tex/context/base/char-def.lua b/tex/context/base/char-def.lua
index 51fcd8bd0..701eadfe6 100644
--- a/tex/context/base/char-def.lua
+++ b/tex/context/base/char-def.lua
@@ -1213,7 +1213,7 @@ characters.data={
direction="on",
linebreak="op",
mathclass="open",
- mathname="lbrace",
+ mathname=false, -- "lbrace",
mirror=0x007D,
unicodeslot=0x007B,
},
@@ -1238,7 +1238,7 @@ characters.data={
direction="on",
linebreak="cl",
mathclass="close",
- mathname="rbrace",
+ mathname=false, -- "rbrace",
mirror=0x007B,
unicodeslot=0x007D,
},
@@ -50215,6 +50215,8 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL C",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="complexes",
specials={ "font", 0x0043 },
unicodeslot=0x2102,
},
@@ -50321,6 +50323,8 @@ characters.data={
description="PLANCK CONSTANT OVER TWO PI",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="hbar",
specials={ "font", 0x0127 },
unicodeslot=0x210F,
},
@@ -50375,6 +50379,8 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL N",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="naturalnumbers",
specials={ "font", 0x004E },
unicodeslot=0x2115,
},
@@ -50411,6 +50417,8 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL P",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="primes",
specials={ "font", 0x0050 },
unicodeslot=0x2119,
},
@@ -50419,6 +50427,8 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL Q",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="rationals",
specials={ "font", 0x0051 },
unicodeslot=0x211A,
},
@@ -50446,6 +50456,8 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL R",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="reals",
specials={ "font", 0x0052 },
unicodeslot=0x211D,
},
@@ -50504,6 +50516,8 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL Z",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="integers",
specials={ "font", 0x005A },
unicodeslot=0x2124,
},
@@ -50522,6 +50536,8 @@ characters.data={
direction="l",
lccode=0x03C9,
linebreak="al",
+ mathclass="variable",
+ mathname="Omega", --AM: Should we do this or does specials take care of it
specials={ "char", 0x03A9 },
unicodeslot=0x2126,
},
@@ -50530,6 +50546,8 @@ characters.data={
description="INVERTED OHM SIGN",
direction="on",
linebreak="al",
+ mathclass="variable",
+ mathname="mho",
unicodeslot=0x2127,
},
[0x2128]={
@@ -50563,6 +50581,8 @@ characters.data={
direction="l",
lccode=0x00E5,
linebreak="ai",
+ mathclass="variable",
+ mathname="Angstrom",
specials={ "char", 0x00C5 },
unicodeslot=0x212B,
},
@@ -52287,7 +52307,7 @@ characters.data={
direction="on",
linebreak="ai",
mathclass="relation",
- mathname=false,
+ mathname=false, -- in
mirror=0x220B,
unicodeslot=0x2208,
},
diff --git a/tex/context/base/char-def.tex b/tex/context/base/char-def.tex
deleted file mode 100644
index 6e81a3d44..000000000
--- a/tex/context/base/char-def.tex
+++ /dev/null
@@ -1,52 +0,0 @@
-%D \module
-%D [ file=char-def,
-%D version=2005.04.25,
-%D title=\CONTEXT\ Lua Macros,
-%D subtitle=Unicode Support,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright=PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\writestatus{loading}{Unicode Support (tables)}
-
-\unprotect
-
-%D An auxiliary macro:
-
-\def\setcclcuc #1 #2 #3 %
- {\global\catcode#1=11 %
- \global\lccode #1=#2 %
- \global\uccode #1=#3 }
-
-\registerctxluafile{char-def}{1.001}
-\registerctxluafile{char-map}{1.001}
-\registerctxluafile{char-syn}{1.001}
-
-%D The codes are stored in the format, so we don't need to reinitialize
-%D them (unless of course we have adapted the table).
-
-\ctxlua{characters.setcodes()}
-
-% \startruntimeluacode
-% \ctxlua{characters.setpdfunicodes()}% pdftounicode mappings can only be done runtime
-% \stopruntimeluacode
-
-%D There may be a problem with the turkisch patterns. By now it's taken care of in
-%D ctxtools (thanks to Mojca). There seems to be a bug in the patterns (^^11 refers
-%D to a double quote but it should be ^^19 since the original is in ec encoding).
-
-% \setcclcuc "201C "201C "201C
-% \setcclcuc "201D "201D "201D
-
-\protect \endinput
-
-% \ctxlua{characters.context.show(123)}
-% \ctxlua{characters.context.show(0x7B)}
-% \ctxlua{characters.context.show("7B")}
-
-% \dostepwiserecurse{`A}{`Z}{1}
-% {\ctxlua{characters.context.show(\recurselevel)}}
diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua
index de3266b73..0dd7a266a 100644
--- a/tex/context/base/char-ini.lua
+++ b/tex/context/base/char-ini.lua
@@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['char-ini'] = {
tex = tex or { }
xml = xml or { }
-local format, texsprint, utfchar, utfbyte = string.format, tex.sprint, unicode.utf8.char, unicode.utf8.byte
+local format, texsprint, utfchar, utfbyte, concat = string.format, tex.sprint, unicode.utf8.char, unicode.utf8.byte, table.concat
--[[ldx--
This module implements some methods and creates additional datastructured
@@ -201,18 +201,18 @@ function characters.getrange(name)
tag = name:gsub("[^a-z]", "")
local range = characters.blocks[tag]
if range then
- return range[1], range[2]
+ return range[1], range[2], range[3]
end
name = name:gsub('"',"0x") -- goodie: tex hex notation
local start, stop = name:match("^(.-)[%-%:](.-)$")
if start and stop then
start, stop = tonumber(start,16) or tonumber(start), tonumber(stop,16) or tonumber(stop)
if start and stop then
- return start, stop
+ return start, stop, nil
end
end
local slot = tonumber(name,16) or tonumber(name)
- return slot, slot
+ return slot, slot, nil
end
characters.categories = {
@@ -382,40 +382,50 @@ function tex.uprint(n)
texsprint(tex.ctxcatcodes,utfchar(n))
end
-characters.activated = { }
-
-function characters.context.define()
+function characters.context.define(tobelettered, tobeactivated)
local unicodes, utfcodes = characters.unicodes, characters.utfcodes
local tc = tex.ctxcatcodes
local is_character, is_command = characters.is_character, characters.is_command
+ local lettered, activated = { }, { }
for u, chr in pairs(characters.data) do
local fallback = chr.fallback
if fallback then
texsprint("{\\catcode"..u.."=13\\unexpanded\\gdef "..utfchar(u).."{\\checkedchar{"..u.."}{"..fallback.."}}}")
- characters.activated[u] = true
+ activated[#activated+1] = "\\c"..u.."=".."13"
else
local contextname = chr.contextname
+ local category = chr.category
if contextname then
- local category = chr.category
if is_character[category] then
-- by this time, we're still in normal catcode mode
if chr.unicodeslot < 128 then
texsprint(tc, "\\chardef\\" .. contextname .. "=" .. u) -- unicodes[contextname])
else
texsprint(tc, "\\let\\" .. contextname .. "=" .. utfchar(u)) -- utfcodes[contextname])
+ lettered[#lettered+1] = "\\c"..u.."=".."11"
end
elseif is_command[category] then
texsprint("{\\catcode"..u.."=13\\unexpanded\\gdef "..utfchar(u).."{\\"..contextname.."}}")
- characters.activated[u] = true
+ activated[#activated+1] = "\\c"..u.."=".."13"
+ end
+ else
+ if is_character[category] then
+ if u >= 128 and u <= 65536 then
+ lettered[#lettered+1] = "\\c"..u.."=".."11"
+ end
end
end
end
end
-end
-
-function characters.context.activate()
- for u,_ in pairs(characters.activated) do
- texsprint(tex.ctxcatcodes,"\\catcode "..u.."=13 ")
+ lettered[#lettered+1] = "\\c"..0x200C.."=".."11" -- non-joiner
+ lettered[#lettered+1] = "\\c"..0x200D.."=".."11" -- joiner
+ lettered = concat(lettered)
+ for _, i in ipairs(tobelettered or { }) do
+ texsprint(tc,format("\\startextendcatcodetable{%s}\\let\\c\\catcode%s\\stopextendcatcodetable",i,lettered))
+ end
+ activated = concat(activated)
+ for _, i in ipairs(tobeactivated or { } ) do
+ texsprint(tc,format("\\startextendcatcodetable{%s}\\let\\c\\catcode%s\\stopextendcatcodetable",i,activated))
end
end
diff --git a/tex/context/base/char-ini.tex b/tex/context/base/char-ini.tex
index 929058a5d..ba1ecf15b 100644
--- a/tex/context/base/char-ini.tex
+++ b/tex/context/base/char-ini.tex
@@ -13,26 +13,82 @@
\writestatus{loading}{Character Support (initialization)}
+\registerctxluafile{char-def}{1.001} % let's load this one first
\registerctxluafile{char-ini}{1.001}
\registerctxluafile{char-cmp}{1.001} % maybe we will load this someplace else
\registerctxluafile{char-tok}{1.001} % maybe we will load this someplace else
+\registerctxluafile{char-map}{1.001}
+\registerctxluafile{char-syn}{1.001}
-% \def\defchar
-% {\afterassignment\dodefchar\scratchcounter}
-
-% \def\dodefchar
-% {\catcode\scratchcounter\active\relax
-% \ctxlua{tex.sprint("\\unexpanded\\def"..utf.char(\the\scratchcounter))}}
-
-\def\utfchar#1{\ctxlua{tex.uprint(\number#1)}}
+\unprotect
% \def\checkedchar#1% #2%
% {\relax\iffontchar\font#1 \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi{\char#1}}
%
% impossible in math mode so there always fallback (till we have gyre):
+\def\utfchar #1{\ctxlua{tex.uprint(\number#1)}}
\def\checkedchar {\relax\ifmmode\expandafter\checkedmathchar\else\expandafter\checkedtextchar\fi} % #1#2
\def\checkedmathchar#1#2{#2}
\def\checkedtextchar #1{\iffontchar\font#1 \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi{\char#1}}
+\def\setcclcuc #1 #2 #3 {\global\catcode#1=11 \global\lccode #1=#2 \global\uccode #1=#3 }
+
+%D The codes are stored in the format, so we don't need to reinitialize
+%D them (unless of course we have adapted the table).
+
+\ctxlua{characters.setcodes()}
+
+% obsolete
+%
+% \startruntimeluacode
+% \ctxlua{characters.setpdfunicodes()}% pdftounicode mappings can only be done runtime
+% \stopruntimeluacode
+
+%D There may be a problem with the turkisch patterns. By now it's taken care of in
+%D ctxtools (thanks to Mojca). There seems to be a bug in the patterns (^^11 refers
+%D to a double quote but it should be ^^19 since the original is in ec encoding).
+
+% \setcclcuc "201C "201C "201C
+% \setcclcuc "201D "201D "201D
+
+% definitions
+
+\startruntimectxluacode
+ characters.context.rehash()
+\stopruntimectxluacode
+
+% \ctxlua{characters.context.rehash()}
+
+\ctxlua {
+ characters.context.define(
+ { % letter catcodes
+ \number\texcatcodes,
+ \number\ctxcatcodes,
+ \number\notcatcodes,
+ \number\mthcatcodes,
+ \number\vrbcatcodes,
+ \number\prtcatcodes,
+ \number\xmlcatcodesn,
+ \number\xmlcatcodese,
+ \number\xmlcatcodesr,
+ \number\typcatcodesa,
+ \number\typcatcodesb,
+ },
+ { % activate catcodes
+ \number\ctxcatcodes,
+ \number\notcatcodes,
+ \number\xmlcatcodesn,
+ \number\xmlcatcodese,
+ \number\xmlcatcodesr,
+ }
+ )
+}
+
+\protect \endinput
+
+% \ctxlua{characters.context.show(123)}
+% \ctxlua{characters.context.show(0x7B)}
+% \ctxlua{characters.context.show("7B")}
-\endinput
+% \dostepwiserecurse{`A}{`Z}{1}
+% {\ctxlua{characters.context.show(\recurselevel)}}
diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua
index 3dc0e69a1..273923c36 100644
--- a/tex/context/base/char-utf.lua
+++ b/tex/context/base/char-utf.lua
@@ -19,6 +19,8 @@ in special kinds of output (for instance ).
over a string.
--ldx]]--
+local concat = table.concat
+
utf = utf or unicode.utf8
characters = characters or { }
@@ -30,6 +32,10 @@ characters.filters.utf.initialized = false
characters.filters.utf.collapsing = true
characters.filters.utf.expanding = true
+local graphemes = characters.graphemes
+local utffilters = characters.filters.utf
+local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+
--[[ldx--
It only makes sense to collapse at runtime, since we don't expect
source code to depend on collapsing:
@@ -40,69 +46,48 @@ input.filters.utf_translator = characters.filters.utf.collapse
--ldx]]--
-function characters.filters.utf.initialize()
- if characters.filters.utf.collapsing and not characters.filters.utf.initialized then
- local cg = characters.graphemes
- local uc = utf.char
+function utffilters.initialize()
+ if utffilters.collapsing and not utffilters.initialized then
for k,v in pairs(characters.data) do
-- using vs and first testing for length is faster (.02->.01 s)
local vs = v.specials
if vs and #vs == 3 and vs[1] == 'char' then
- local first, second = uc(vs[2]), uc(vs[3])
- local cgf = cg[first]
+ local first, second = utfchar(vs[2]), utfchar(vs[3])
+ local cgf = graphemes[first]
if not cgf then
cgf = { }
- cg[first] = cgf
+ graphemes[first] = cgf
end
- cgf[second] = uc(k)
+ cgf[second] = utfchar(k)
end
end
- characters.filters.utf.initialized = true
+ utffilters.initialized = true
end
end
--- characters.filters.utf.add_grapheme(utf.char(318),'l','\string~')
--- characters.filters.utf.add_grapheme('c','a','b')
-
---~ function characters.filters.utf.add_grapheme(result,...)
---~ local cg = characters.graphemes
---~ local t = {...}
---~ local n = table.getn(t)
---~ for i=1,n do
---~ local v = t[i]
---~ if not cg[v] then
---~ cg[v] = { }
---~ end
---~ if i == n then
---~ cg[v] = result
---~ else
---~ cg = cg[v]
---~ end
---~ end
---~ end
-
-function characters.filters.utf.add_grapheme(result,first,second)
- local cg, uc = characters.graphemes, utf.char
+-- utffilters.add_grapheme(utfchar(318),'l','\string~')
+-- utffilters.add_grapheme('c','a','b')
+
+function utffilters.add_grapheme(result,first,second)
local r, f, s = tonumber(result), tonumber(first), tonumber(second)
- if r then result = uc(r) end
- if f then first = uc(f) end
- if s then second = uc(s) end
- if not cg[first] then
- cg[first] = { [second] = result }
+ if r then result = utfchar(r) end
+ if f then first = utfchar(f) end
+ if s then second = utfchar(s) end
+ if not graphemes[first] then
+ graphemes[first] = { [second] = result }
else
- cg[first][second] = result
+ graphemes[first][second] = result
end
end
-function characters.filters.utf.collapse(str) -- old one
- if characters.filters.utf.collapsing and str and #str > 1 then
- if not characters.filters.utf.initialized then -- saves a call
- characters.filters.utf.initialize()
+function utffilters.collapse(str) -- old one
+ if utffilters.collapsing and str and #str > 1 then
+ if not utffilters.initialized then -- saves a call
+ utffilters.initialize()
end
local tokens, first, done = { }, false, false
- local cg = characters.graphemes
for second in str:utfcharacters() do
- local cgf = cg[first]
+ local cgf = graphemes[first]
if cgf and cgf[second] then
first, done = cgf[second], true
elseif first then
@@ -114,7 +99,7 @@ function characters.filters.utf.collapse(str) -- old one
end
if done then
tokens[#tokens+1] = first
- return table.concat(tokens,"")
+ return concat(tokens)
end
end
return str
@@ -138,44 +123,38 @@ to their right glyph there.
0x100000.
--ldx]]--
-characters.filters.utf.private = {
+utffilters.private = {
high = { },
low = { },
escapes = { },
}
-do
-
- local low = characters.filters.utf.private.low
- local high = characters.filters.utf.private.high
- local escapes = characters.filters.utf.private.escapes
- local special = "~#$%^&_{}\\"
-
- local ub, uc, ug = utf.byte, utf.char, utf.gsub
+local low = utffilters.private.low
+local high = utffilters.private.high
+local escapes = utffilters.private.escapes
+local special = "~#$%^&_{}\\"
- function characters.filters.utf.private.set(ch)
- local cb
- if type(ch) == "number" then
- cb, ch = ch, uc(ch)
- else
- cb = ub(ch)
- end
- if cb < 256 then
- low [ch] = uc(0x0F0000 + cb)
- high [uc(0x0F0000 + cb)] = ch
- escapes[ch] = "\\" .. ch
- end
+function utffilters.private.set(ch)
+ local cb
+ if type(ch) == "number" then
+ cb, ch = ch, utfchar(ch)
+ else
+ cb = utfbyte(ch)
end
+ if cb < 256 then
+ low[ch] = utfchar(0x0F0000 + cb)
+ high[utfchar(0x0F0000 + cb)] = ch
+ escapes[ch] = "\\" .. ch
+ end
+end
- function characters.filters.utf.private.replace(str) return ug(str,"(.)", low ) end
- function characters.filters.utf.private.revert(str) return ug(str,"(.)", high ) end
- function characters.filters.utf.private.escape(str) return ug(str,"(.)", escapes) end
-
- local set = characters.filters.utf.private.set
+function utffilters.private.replace(str) return utfgsub(str,"(.)", low ) end
+function utffilters.private.revert(str) return utfgsub(str,"(.)", high ) end
+function utffilters.private.escape(str) return utfgsub(str,"(.)", escapes) end
- for ch in special:gmatch(".") do set(ch) end
+local set = utffilters.private.set
-end
+for ch in special:gmatch(".") do set(ch) end
--[[ldx--
We get a more efficient variant of this when we integrate
@@ -188,172 +167,84 @@ first snippet uses the relocated dollars.
--ldx]]--
-do
-
- local cg = characters.graphemes
- local cr = characters.filters.utf.private.high -- kan via een lpeg
- local cf = characters.filters.utf
-
- local concat = table.concat
-
- --~ keep this one, it's the baseline
- --~
- --~ function characters.filters.utf.collapse(str)
- --~ if cf.collapsing and str then
- --~ if #str > 1 then
- --~ if not cf.initialized then -- saves a call
- --~ cf.initialize()
- --~ end
- --~ local tokens, first, done = { }, false, false
- --~ for second in str:utfcharacters() do
- --~ if cr[second] then
- --~ if first then
- --~ tokens[#tokens+1] = first
- --~ end
- --~ first, done = cr[second], true
- --~ else
- --~ local cgf = cg[first]
- --~ if cgf and cgf[second] then
- --~ first, done = cgf[second], true
- --~ elseif first then
- --~ tokens[#tokens+1] = first
- --~ first = second
- --~ else
- --~ first = second
- --~ end
- --~ end
- --~ end
- --~ if done then
- --~ tokens[#tokens+1] = first
- --~ return concat(tokens,"") -- seldom called
- --~ end
- --~ elseif #str > 0 then
- --~ return cr[str] or str
- --~ end
- --~ end
- --~ return str
- --~ end
-
- --[[ldx--
- The next variant has lazy token collecting, on a 140 page mk.tex this saves
- about .25 seconds, which is understandable because we have no graphmes and
- not collecting tokens is not only faster but also saves garbage collecting.
-
- --ldx]]--
-
- function characters.filters.utf.collapse(str) -- not really tested (we could preallocate a table)
- if cf.collapsing and str then
- if #str > 1 then
- if not cf.initialized then -- saves a call
- cf.initialize()
- end
- local tokens, first, done, n = { }, false, false, 0
- for second in str:utfcharacters() do
- if done then
- if cr[second] then
- if first then
- tokens[#tokens+1] = first
- end
- first = cr[second]
+local cr = utffilters.private.high -- kan via een lpeg
+local cf = utffilters
+
+--[[ldx--
+The next variant has lazy token collecting, on a 140 page mk.tex this saves
+about .25 seconds, which is understandable because we have no graphmes and
+not collecting tokens is not only faster but also saves garbage collecting.
+
+--ldx]]--
+
+-- lpeg variant is not faster
+
+function utffilters.collapse(str) -- not really tested (we could preallocate a table)
+ if cf.collapsing and str then
+ if #str > 1 then
+ if not cf.initialized then -- saves a call
+ cf.initialize()
+ end
+ local tokens, first, done, n = { }, false, false, 0
+ for second in str:utfcharacters() do
+ if done then
+ local crs = cr[second]
+ if crs then
+ if first then
+ tokens[#tokens+1] = first
+ end
+ first = crs
+ else
+ local cgf = graphemes[first]
+ if cgf and cgf[second] then
+ first = cgf[second]
+ elseif first then
+ tokens[#tokens+1] = first
+ first = second
else
- local cgf = cg[first]
- if cgf and cgf[second] then
- first = cgf[second]
- elseif first then
- tokens[#tokens+1] = first
- first = second
+ first = second
+ end
+ end
+ else
+ local crs = cr[second]
+ if crs then
+ for s in str:utfcharacters() do
+ if n == 1 then
+ break
else
- first = second
+ tokens[#tokens+1], n = s, n - 1
end
end
+ if first then
+ tokens[#tokens+1] = first
+ end
+ first, done = crs, true
else
- if cr[second] then
+ local cgf = graphemes[first]
+ if cgf and cgf[second] then
for s in str:utfcharacters() do
if n == 1 then
break
else
- tokens[#tokens+1], n = s, n - 1
+ tokens[#tokens+1], n = s, n -1
end
end
- if first then
- tokens[#tokens+1] = first
- end
- first, done = cr[second], true
+ first, done = cgf[second], true
else
- local cgf = cg[first]
- if cgf and cgf[second] then
- for s in str:utfcharacters() do
- if n == 1 then
- break
- else
- tokens[#tokens+1], n = s, n -1
- end
- end
- first, done = cgf[second], true
- else
- first, n = second, n + 1
- end
+ first, n = second, n + 1
end
end
end
- if done then
- tokens[#tokens+1] = first
- return concat(tokens,"") -- seldom called
- end
- elseif #str > 0 then
- return cr[str] or str
end
+ if done then
+ tokens[#tokens+1] = first
+ return concat(tokens) -- seldom called
+ end
+ elseif #str > 0 then
+ return cr[str] or str
end
- return str
end
-
- --~ not faster (0.1 seconds on a 500 k collapsable file)
- --~
- --~ local specials, initials = lpeg.P(false), ""
- --~ for k,v in pairs(cr) do
- --~ specials, initials = specials + lpeg.P(k)/v, initials .. k:sub(1,1)
- --~ end
- --~ specials = lpeg.Cs(lpeg.P((1-lpeg.S(initials)) + specials)^0)
- --~ local graphemes = ""
- --~ for _, v in pairs(cg) do
- --~ for kk, _ in pairs(v) do
- --~ graphemes = graphemes .. kk:sub(1,1)
- --~ end
- --~ end
- --~ graphemes = lpeg.P{ lpeg.S(graphemes) + 1 * lpeg.V(1) }
- --~
- --~ function characters.filters.utf.collapse(str)
- --~ if cf.collapsing and str then
- --~ if #str > 1 then
- --~ str = specials:match(str)
- --~ if graphemes:match(str) then
- --~ if not cf.initialized then -- saves a call
- --~ cf.initialize()
- --~ end
- --~ local tokens, first, done = { }, false, false
- --~ for second in str:utfcharacters() do
- --~ local cgf = cg[first]
- --~ if cgf and cgf[second] then
- --~ first, done = cgf[second], true
- --~ elseif first then
- --~ tokens[#tokens+1] = first
- --~ first = second
- --~ else
- --~ first = second
- --~ end
- --~ end
- --~ if done then
- --~ tokens[#tokens+1] = first
- --~ return table.concat(tokens,"")
- --~ end
- --~ end
- --~ elseif #str > 0 then
- --~ return cr[str] or str
- --~ end
- --~ end
- --~ return str
- --~ end
-
+ return str
end
--[[ldx--
@@ -364,8 +255,8 @@ and since it may interfere with non-text, we will not use this feature
by default.
-characters.filters.utf.collapsing = true
-characters.filters.append(characters.filters.utf.collapse)
+utffilters.collapsing = true
+characters.filters.append(utffilters.collapse)
characters.filters.activated = true
callback.register('process_input_buffer', characters.filters.process)
@@ -423,7 +314,7 @@ function characters.filters.insert_after(name_1,name_2)
end
function characters.filters.list(separator)
- table.concat(characters.filters.sequences,seperator or ' ')
+ concat(characters.filters.sequences,seperator or ' ')
end
function characters.filters.process(str)
@@ -455,7 +346,7 @@ function characters.filters.collector.reset()
end
function characters.filters.collector.flush(separator)
- tex.sprint(table.concat(characters.filters.collector.data,separator))
+ tex.sprint(concat(characters.filters.collector.data,separator))
end
function characters.filters.collector.prune(n)
@@ -467,7 +358,7 @@ end
function characters.filters.collector.numerate(str)
if characters.filters.collector.collecting then
table.insert(characters.filters.collector.data,(unicode.utf8.gsub(str,"(.)", function(c)
- return string.format("0x%04X ",unicode.utf8.byte(c))
+ return ("0x%04X "):format(unicode.utf8.byte(c))
end)))
end
return str
diff --git a/tex/context/base/colo-hex.tex b/tex/context/base/colo-hex.tex
index e60f2a0ae..8d5c3f86f 100644
--- a/tex/context/base/colo-hex.tex
+++ b/tex/context/base/colo-hex.tex
@@ -15,9 +15,7 @@
\endinput
\endLUATEX
-\ifx\dodododefinecolor\undefined
- \beginTEX \endinput \endTEX
-\else
+\ifx\dodododefinecolor\undefined \else
\endinput
\fi
diff --git a/tex/context/base/colo-ini.lua b/tex/context/base/colo-ini.lua
new file mode 100644
index 000000000..777c88572
--- /dev/null
+++ b/tex/context/base/colo-ini.lua
@@ -0,0 +1,567 @@
+if not modules then modules = { } end modules ['colo-ini'] = {
+ version = 1.000,
+ comment = "companion to colo-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ 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
+
+backends = backends or { }
+backends.pdf = backends.pdf or { }
+backend = backends.pdf
+
+local texsprint, format, concat = tex.sprint, string.format, table.concat
+
+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
+
+function backends.pdf.registergrayspotcolor(n,f,d,p,s) states.collect(s_template_g:format(n,f,d,p,s)) end
+function backends.pdf.registerrgbspotcolor (n,f,d,p,r,g,b) states.collect(s_template_r:format(n,f,d,p,r,g,b)) end
+function backends.pdf.registercmykspotcolor(n,f,d,p,c,m,y,k) states.collect(s_template_c:format(n,f,d,p,c,m,y,k)) end
+
+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
+
+function backends.pdf.registergrayindexcolor(n,f,d,p,s) states.collect(m_template_g:format(n,f,d,p,s)) end
+function backends.pdf.registerrgbindexcolor (n,f,d,p,r,g,b) states.collect(m_template_r:format(n,f,d,p,r,g,b)) end
+function backends.pdf.registercmykindexcolor(n,f,d,p,c,m,y,k) states.collect(m_template_c:format(n,f,d,p,c,m,y,k)) end
+
+local s_template_e = "\\doPDFregisterspotcolorname{%s}{%s}" -- name, e
+
+function backends.pdf.registerspotcolorname(name,e)
+ if e and e ~= "" then
+ texsprint(tex.ctxcatcodes,format(s_template_e,name,e)) -- todo in new backend: e:gsub(" ","#20")
+ end
+end
+
+ctx = ctx or { }
+ctx.aux = ctx.aux or { }
+
+local a_l_c_template = "\\setevalue{(ca:%s)}{%s}" ..
+ "\\setevalue{(cs:%s)}{\\dosetattribute{color}{%s}}"
+local a_g_c_template = "\\setxvalue{(ca:%s)}{%s}" ..
+ "\\setxvalue{(cs:%s)}{\\dosetattribute{color}{%s}}"
+local f_l_c_template = "\\setvalue {(ca:%s)}{\\doinheritca{%s}}" ..
+ "\\setvalue {(cs:%s)}{\\doinheritcs{%s}}"
+local f_g_c_template = "\\setgvalue{(ca:%s)}{\\doinheritca{%s}}" ..
+ "\\setgvalue{(cs:%s)}{\\doinheritcs{%s}}"
+local r_l_c_template = "\\letbeundefined{(ca:%s)}" ..
+ "\\letbeundefined{(cs:%s)}"
+local r_g_c_template = "\\global\\letbeundefined{(ca:%s)}" ..
+ "\\global\\letbeundefined{(cs:%s)}"
+
+local a_l_t_template = "\\setevalue{(ta:%s)}{%s}" ..
+ "\\setevalue{(ts:%s)}{\\dosetattribute{transparency}{%s}}"
+local a_g_t_template = "\\setxvalue{(ta:%s)}{%s}" ..
+ "\\setxvalue{(ts:%s)}{\\dosetattribute{transparency}{%s}}"
+local f_l_t_template = "\\setvalue {(ta:%s)}{\\doinheritta{%s}}" ..
+ "\\setvalue {(ts:%s)}{\\doinheritts{%s}}"
+local f_g_t_template = "\\setgvalue{(ta:%s)}{\\doinheritta{%s}}" ..
+ "\\setgvalue{(ts:%s)}{\\doinheritts{%s}}"
+local r_l_t_template = "\\letbeundefined{(ta:%s)}" ..
+ "\\letbeundefined{(ts:%s)}"
+local r_g_t_template = "\\global\\letbeundefined{(ta:%s)}" ..
+ "\\global\\letbeundefined{(ts:%s)}"
+
+function ctx.aux.definecolor(name, ca, global)
+ if ca and ca > 0 then
+ if global then
+ texsprint(tex.ctxcatcodes,a_g_c_template:format(name, ca, name, ca))
+ else
+ texsprint(tex.ctxcatcodes,a_l_c_template:format(name, ca, name, ca))
+ end
+ else
+ if global then
+ texsprint(tex.ctxcatcodes,r_g_c_template:format(name, name))
+ else
+ texsprint(tex.ctxcatcodes,r_l_c_template:format(name, name))
+ end
+ end
+end
+function ctx.aux.inheritcolor(name, ca, global)
+ if ca and ca ~= "" then
+ if global then
+ texsprint(tex.ctxcatcodes,f_g_c_template:format(name, ca, name, ca))
+ else
+ texsprint(tex.ctxcatcodes,f_l_c_template:format(name, ca, name, ca))
+ end
+ else
+ if global then
+ texsprint(tex.ctxcatcodes,r_g_c_template:format(name, name))
+ else
+ texsprint(tex.ctxcatcodes,r_l_c_template:format(name, name))
+ end
+ end
+end
+function ctx.aux.definetransparent(name, ta, global)
+ if ta and ta > 0 then
+ if global then
+ texsprint(tex.ctxcatcodes,a_g_t_template:format(name, ta, name, ta))
+ else
+ texsprint(tex.ctxcatcodes,a_l_t_template:format(name, ta, name, ta))
+ end
+ else
+ if global then
+ texsprint(tex.ctxcatcodes,r_g_t_template:format(name, name))
+ else
+ texsprint(tex.ctxcatcodes,r_l_t_template:format(name, name))
+ end
+ end
+end
+function ctx.aux.inherittransparent(name, ta, global)
+ if ta and ta ~= "" then
+ if global then
+ texsprint(tex.ctxcatcodes,f_g_t_template:format(name, ta, name, ta))
+ else
+ texsprint(tex.ctxcatcodes,f_l_t_template:format(name, ta, name, ta))
+ end
+ else
+ if global then
+ texsprint(tex.ctxcatcodes,r_g_t_template:format(name, name))
+ else
+ texsprint(tex.ctxcatcodes,r_l_t_template:format(name, name))
+ end
+ end
+end
+
+local transparent = {
+ none = 0,
+ normal = 1,
+ multiply = 2,
+ screen = 3,
+ overlay = 4,
+ softlight = 5,
+ hardlight = 6,
+ colordodge = 7,
+ colorburn = 8,
+ darken = 9,
+ lighten = 10,
+ difference = 11,
+ exclusion = 12,
+}
+
+-- 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.
+
+ctx.couplecolors = true
+
+function ctx.definetransparency(name,n)
+ transparent[name] = n
+end
+
+local registered = { }
+
+local function registerspotcolor(parent,name,parentnumber,e,f,d,p)
+ if not registered[parentnumber] then
+ local v = colors.values[parentnumber]
+ if v then
+ local kind = colors.default -- else problems with shading etc
+ if kind == 1 then kind = v[1] end
+ if kind == 2 then -- name noffractions names p's r g b
+ backend.registergrayspotcolor(parent,f,d,p,v[2])
+ elseif kind == 3 then
+ backend.registerrgbspotcolor (parent,f,d,p,v[3],v[4],v[5])
+ elseif kind == 4 then
+ backend.registercmykspotcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
+ end
+ backends.pdf.registerspotcolorname(parent,e)
+ end
+ registered[parentnumber] = true
+ end
+end
+
+local function 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
+ local kind = colors.default -- else problems with shading etc
+ if kind == 1 then kind = v[1] end
+ if kind == 2 then
+ backend.registergrayindexcolor(parent,f,d,p,v[2])
+ elseif kind == 3 then
+ backend.registerrgbindexcolor (parent,f,d,p,v[3],v[4],v[5])
+ elseif kind == 4 then
+ backend.registercmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
+ end
+ end
+ registered[parentnumber] = true
+ end
+end
+
+function ctx.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()
+ 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)
+ 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)
+ 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)
+ else
+ ctx.aux.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
+ end
+ elseif freeze then
+ local ca = attributes.list[attributes.numbers['color']] [str]
+ local ta = attributes.list[attributes.numbers['transparency']][str]
+ if ca then
+ ctx.aux.definecolor(name, ca, global)
+ end
+ if ta then
+ ctx.aux.definetransparent(name, ta, global)
+ end
+ else
+ ctx.aux.inheritcolor(name, str, global)
+ ctx.aux.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[attributes.numbers['color']] [name] = attributes.list[attributes.numbers['color']] [str] or -1 -- reset
+ -- attributes.list[attributes.numbers['transparency']][name] = attributes.list[attributes.numbers['transparency']][str] or -1 -- reset
+ -- end
+ end
+end
+
+function ctx.isblack(ca) -- maybe commands
+ local cv = ca > 0 and colors.value(ca)
+ return (cv and cv[2] == 0) or false
+end
+
+-- function ctx.aux.colorattribute(name)
+-- local al = attributes.list[attributes.numbers['color']]
+-- return al[name] or 0
+-- end
+-- function ctx.aux.transparencyattribute(name)
+-- local al = attributes.list[attributes.numbers['transparency']]
+-- return al[name] or 0
+-- end
+
+function ctx.definespotcolor(name,parent,str,global)
+ if parent == "" or parent:find("=") then
+ ctx.registerspotcolor(name, parent)
+ elseif name ~= parent then
+ local cp = attributes.list[attributes.numbers['color']][parent]
+ if cp then
+ local t = str:split_settings()
+ 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
+ if name and name ~= "" then
+ ctx.aux.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
+ end
+ end
+ end
+ end
+ end
+end
+
+function ctx.registerspotcolor(parent, str)
+ local cp = attributes.list[attributes.numbers['color']][parent]
+ if cp then
+ local e = ""
+ if str then
+ local t = str:split_settings()
+ e = (t and t.e) or ""
+ end
+ registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics
+ end
+end
+
+function ctx.definemultitonecolor(name,multispec,colorspec,selfspec)
+ local dd, pp, nn = { }, { }, { }
+ for k,v in multispec:gmatch("(%a+)=([^%,]*)") do
+ dd[#dd+1] = k
+ pp[#pp+1] = v
+ nn[#nn+1] = k
+ nn[#nn+1] = format("%1.3g",tonumber(v))
+ end
+--~ v = tonumber(v) * p
+ local nof = #dd
+ if nof > 0 then
+ dd, pp, nn = concat(dd,','), concat(pp,','), concat(nn,'_')
+ local parent = (nn:lower()):gsub("[^%d%a%.]+","_")
+ ctx.defineprocesscolor(parent,colorspec..","..selfspec,true,true)
+ local cp = attributes.list[attributes.numbers['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()
+ 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
+ end
+ end
+ end
+end
+
+function ctx.mpcolor(model,ca,ta,default)
+ local cv = colors.value(ca) -- faster when direct colors.values[ca]
+ if cv then
+ local tv = transparencies.value(ta)
+ if model == 1 then
+ model = cv[1]
+ end
+ if tv then
+ if model == 2 then
+ return format("transparent(%s,%s,(%s,%s,%s))",tv[1],tv[2],cv[3],cv[4],cv[5])
+ elseif model == 3 then
+ return format("transparent(%s,%s,(%s,%s,%s))",tv[1],tv[2],cv[3],cv[4],cv[5])
+ elseif model == 4 then
+ return format("transparent(%s,%s,cmyk(%s,%s,%s,%s))",tv[1],tv[2],cv[6],cv[7],cv[8],cv[9])
+ else
+ return format("transparent(%s,%s,multitonecolor(\"%s\",%s,\"%s\",\"%s\"))",tv[1],tv[2],cv[10],cv[11],cv[12],cv[13])
+ end
+ else
+ if model == 2 then
+ return format("(%s,%s,%s)",cv[3],cv[4],cv[5])
+ elseif model == 3 then
+ return format("(%s,%s,%s)",cv[3],cv[4],cv[5])
+ elseif model == 4 then
+ return format("cmyk(%s,%s,%s,%s)",cv[6],cv[7],cv[8],cv[9])
+ else
+ return format("multitonecolor(\"%s\",%s,\"%s\",\"%s\")",cv[10],cv[11],cv[12],cv[13])
+ end
+ end
+ else
+ default = default or 0 -- rgb !
+ return format("(%s,%s,%s)",default,default,default)
+ end
+end
+
+function ctx.formatcolor(ca,separator)
+ local cv = colors.value(ca)
+ if cv then
+ local model = cv[1]
+ if model == 2 then
+ return tostring(cv[2])
+ elseif model == 3 then
+ return concat(cv,separator,3,5)
+ elseif model == 4 then
+ return concat(cv,separator,6,9)
+ else
+ return tostring(cv[13])
+ end
+ else
+ return tostring(0)
+ end
+end
+
+function ctx.formatgray(ca,separator)
+ local cv = colors.value(ca)
+ if cv then
+ return tostring(cv[2])
+ else
+ return tostring(0)
+ end
+end
+
+function ctx.colorcomponents(ca)
+ local cv = colors.value(ca)
+ if cv then
+ local model = cv[1]
+ if model == 2 then
+ return format("s=%1.3f",cv[2])
+ elseif model == 3 then
+ return format("r=%1.3f g=%1.3f b=%1.3f",cv[3],cv[4],cv[5])
+ elseif model == 4 then
+ return format("c=%1.3f m=%1.3f y=%1.3f k=%1.3f",cv[6],cv[7],cv[8],cv[9])
+ elseif type(cv[13]) == "string" then
+ return format("p=%s",cv[13])
+ else
+ return format("p=%1.3f",cv[13])
+ end
+ else
+ return ""
+ end
+end
+
+function ctx.transparencycomponents(ta)
+ local tv = transparencies.value(ta)
+ if tv then
+ return format("a=%1.3f t=%1.3f",tv[1],tv[2])
+ else
+ return ""
+ 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 = p:gsub(","," ") -- 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
+ end
+ return "DeviceGRAY"
+end
+
+function ctx.spotcolorname(ca,default)
+ local cv, v = colors.value(ca), "unknown"
+ if cv and cv[1] == 5 then
+ v = cv[10]
+ end
+ return tostring(v)
+end
+
+function ctx.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
+ texsprint(tex.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
+ texsprint(tex.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
+ texsprint(tex.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
+ texsprint(tex.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(tex.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(tex.ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'cmyk',c,m,y,k))))
+end
+function ctx.pdfgrayliteral(model,s)
+ texsprint(tex.ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'gray',s))))
+end
+function ctx.pdfspotliteral(model,n,f,d,p)
+ texsprint(tex.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(tex.ctxcatcodes,format("\\pdfliteral{/Tr%s gs}",transparencies.register(nil,a,t)))
+end
+function ctx.pdffinishtransparency()
+ if intransparency then
+ intransparency = false
+ texsprint(tex.ctxcatcodes,"\\pdfliteral{/Tr0 gs}") -- we happen to know this -)
+ end
+end
diff --git a/tex/context/base/colo-ini.mkii b/tex/context/base/colo-ini.mkii
new file mode 100644
index 000000000..745bb1679
--- /dev/null
+++ b/tex/context/base/colo-ini.mkii
@@ -0,0 +1,1862 @@
+%D \module
+%D [ file=colo-ini,
+%D version=1997.04.01,
+%D title=\CONTEXT\ Color 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.
+
+\unprotect
+
+\chardef\colorversion=1
+
+%D Color support is not present in \TEX. Colorful output can
+%D however be accomplished by using specials. This also means
+%D that this support depends on the \DVI\ driver used. At the
+%D moment this module was written, still no decent standard on
+%D color specials has been agreed upon. We therefore decided to
+%D implement a mechanism that is as independant as possible of
+%D drivers.
+%D
+%D Color support shares with fonts that is must be implemented
+%D in a way that permits processing of individual \DVI\ pages.
+%D Furthermore it should honour grouping. The first condition
+%D forces us to use a scheme that keeps track of colors at
+%D page boundaries. This can be done by means of \TEX's
+%D marking mechanism (\type{\mark}).
+%D
+%D When building pages, \TEX\ periodically looks at the
+%D accumulated typeset contents and breaks the page when
+%D suitable. At that moment, control is transfered to the
+%D output routine. This routine takes care of building the
+%D pagebody and for instance adds headers and footers. The page
+%D can be broken in the middle of some colored text, but
+%D headers and footers are often in black upon white or
+%D background. If colors are applied there, they definitely
+%D are used local, which means that they don't cross page
+%D borders.
+%D
+%D Boxes are handled as a whole, which means that when we
+%D apply colors inside a box, those colors don't cross page
+%D boundaries, unless of course boxes are split or unboxed.
+%D Especially in interactive texts, colors are often used in
+%D such a local way: in boxes (buttons and navigational tools)
+%D or in the pagebody (backgrounds).
+%D
+%D So we can distinguish local colors, that don't cross
+%D pages from global colors, of which we can end many pages
+%D later. The color macros will treat both types in a different
+%D way, thus gaining some speed.
+%D
+%D This module also deals with gray scales. Because similar
+%D colors can end up in the same gray scale when printed in
+%D black and white, we also implement a palet system that deals
+%D with these matters. Because of fundamental differences
+%D between color and gray scale printing, in \CONTEXT\ we also
+%D differ between these. For historic reasons |<|we first
+%D implemented gray scales using patterns of tiny periods|>|
+%D and therefore called them {\em rasters}. So don't be
+%D surprised if this term shows up.
+
+%D \macros
+%D {definecolor}
+%D
+%D We will enable users to specify colors in \cap{RGB} and
+%D \cap{CMYK} color spaces or gray scales using
+%D
+%D \showsetup{definecolor}
+%D
+%D For example:
+%D
+%D \starttyping
+%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
+%D \stoptyping
+%D
+%D Such color specifications are saved in a macro in the
+%D following way:
+%D
+%D \starttyping
+%D \setvalue{\??cr name}{R:r:g:b}
+%D \setvalue{\??cr name}{C:c:m:y:k}
+%D \setvalue{\??cr name}{S:s}
+%D \stoptyping
+%D
+%D Gray scales are specified with the \type{s} parameter,
+%D where the \type {s} is derived from {\em screen}.
+%D
+%D Starting with \PDF\ 1.4 (2001) \CONTEXT\ supports
+%D transparent colors. The transparency factor is represented
+%D by a \type {t} and the transparency method by an \type {a}
+%D (alternative). Later we will implement more control
+%D (probably by symbolic methods. So, currently the data is
+%D stored as follows:
+%D
+%D \starttyping
+%D \setvalue{\??cr name}{R:r:g:b:a:t}
+%D \setvalue{\??cr name}{C:c:m:y:k:a:t}
+%D \setvalue{\??cr name}{S:s:a:t}
+%D \stoptyping
+
+% r g b : rbg
+% c m y k : cmyk
+% s : gray
+% p n d f : spot
+% h : hexadecimal
+% t a : transparency
+% e : equivalent (spotcolors)
+
+\def\@@cl@@z{0}
+\def\@@cl@@o{1}
+
+\def\@@resetcolorparameters
+ {\let\@@cl@@r\@@cl@@z \let\@@cl@@g\@@cl@@z \let\@@cl@@b\@@cl@@z
+ \let\@@cl@@c\@@cl@@z \let\@@cl@@m\@@cl@@z \let\@@cl@@y\@@cl@@z \let\@@cl@@k\@@cl@@z
+ \let\@@cl@@s\@@cl@@z
+ \let\@@cl@@p\@@cl@@o \let\@@cl@@n\empty \let\@@cl@@d\empty \let\@@cl@@f\@@cl@@o
+ \let\@@cl@@h\empty
+ \let\@@cl@@e\empty
+ \let\@@cl@@t\@@cl@@z \let\@@cl@@a\@@cl@@z}
+
+\@@resetcolorparameters
+
+\def\@@cl@@A{\@@cl@@a} % a hook for symbolic conversion, see below
+
+%D Handling a few nested \type{\cs}'s is no problem (\type
+%D {\@EA\@EAEAEA\@EA}) but we need a full expansion, so I
+%D tried one of the fully expandable primitives using a sort
+%D of delimited thing. I tried \type {\number} first, but this
+%D does not work, but \type {\romannumeral} does. Actually,
+%D \type{\romannumeral0} returns nothing, so it's a perfect
+%D candidate for this kind of hackery. This reminds me that I
+%D have to look into David Kastrup's Euro\TeX\ 2002 article
+%D because he is using \type {\romannumeral} for loops
+%D (repetitive \quote {m} stuff).
+
+% \def\x{\y}\def\y{\z}\def\z{0:1:1:1}
+%
+% \def\bla #1:#2:#3\end{}
+%
+% \@EA\bla\romannumeral\x\end
+
+\def\colorXpattern{0S:\@@cl@@z:\@@cl@@z:\@@cl@@z}
+\def\colorZpattern{0S:\@@cl@@z:\@@cl@@A:\@@cl@@t}
+\def\colorSpattern{0S:\@@cl@@s:\@@cl@@A:\@@cl@@t}
+\def\colorCpattern{0C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k:\@@cl@@A:\@@cl@@t}
+\def\colorRpattern{0R:\@@cl@@r:\@@cl@@g:\@@cl@@b:\@@cl@@A:\@@cl@@t}
+
+%def\colorPpattern{0P:\@@cl@@n:\@@cl@@p:\@@cl@@A:\@@cl@@t}
+
+\def\colorPpattern{0P:\@@cl@@n:\@@cl@@f:\@@cl@@d:\@@cl@@p:\@@cl@@A:\@@cl@@t}
+
+%D The extra 0 catches empty colors specs (needed for the
+%D \type {\MPcolor} and \type {\PDFcolor} conversion (\type
+%D {\@@cr} equals \type {\relax}!).
+
+\def\handlecolorwith#1{\@EA#1\romannumeral0}
+
+%D Next comes the main definition macro.
+
+\def\dodefinecolor {\dododefinecolor\relax \setvalue \setevalue1}
+\def\dodefineglobalcolor{\dododefinecolor\doglobal\setgvalue\setxvalue1}
+\def\dodefinenamedcolor {\dododefinecolor\doglobal\setvalue \setevalue0}
+
+\def\dododefinecolor#1#2#3#4[#5][#6]% #2==set(g)value #3==set[e|x]value
+ {#1\addtocommalist{#5}\colorlist % optional
+ \doifassignmentelse{#6}
+ {\@@resetcolorparameters
+ \getparameters[\??cl @@][#6]%
+ \ifx\@@cl@@h\empty
+ \doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
+ {\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k}{\@@cl@@z\@@cl@@z\@@cl@@z\@@cl@@z}
+ {\doifelse\@@cl@@s\@@cl@@z
+ {\showmessage\m!colors8{{[#6]},#5}%
+ #3{\??cr#5}{\colorZpattern}}
+ {#3{\??cr#5}{\colorSpattern}}}
+ {#3{\??cr#5}{\colorCpattern}}}
+ {#3{\??cr#5}{\colorRpattern}}%
+ \else
+ \setxvalue{\??cr#5}{\colorHpattern}%
+ \fi
+ % new: e=external spot color name
+ \ifx\@@cl@@e\empty \else
+ \doregisterspotcolorname{#5}\@@cl@@e
+ \fi}
+ {\doifelsenothing\currentpalet
+ \donefalse
+ {\doifdefinedelse{\??cr\currentpalet#6}\donetrue\donefalse}%
+ \ifdone
+ \doifnot{#5}{#6}
+ {#2{\??cr#5}{\paletcolorspec{#6}}}%
+ \else
+ \doifdefinedelse{\??cr#6}
+ {\doifelse{#5}{#6}
+ {% this way we can freeze \definecolor[somecolor][somecolor]
+ % and still prevent cyclic definitions
+ \iffreezecolors#3{\??cr#5}{\csname\??cr#6\endcsname}\fi}
+ {\iffreezecolors\@EA#3\else\@EA#2\fi{\??cr#5}{\csname\??cr#6\endcsname}}}
+ {\showmessage\m!colors3{#5 (def)}}%
+ \fi}%
+ \ifcase#4\or
+ \unexpanded#2{#5}{\switchtocolor[#5]}% \unexpanded toegevoegd
+ \fi}
+
+\def\paletcolorspec#1%
+ {\csname\??cr\currentpalet#1\endcsname}
+
+%D Hex color support is not enabled by default. You need to say \type
+%D {\setupcolor [hex]} to get this working.
+
+\ifx\colorHpattern\undefined \let\colorHpattern\colorZpattern \fi
+
+%D New and experimental.
+
+\def\dodefinespotcolor[#1][#2][#3]% todo: always global
+ {\doifnot{#1}{#2}
+ {\@@resetcolorparameters
+ \doglobal\addtocommalist{#1}\colorlist % optional
+ \edef\@@cl@@n{#2}%
+ \getparameters[\??cl @@][#3]%
+ \doifnothing\@@cl@@p{\let\@@cl@@p\!!plusone}%
+ \ifx\@@cl@@e\empty \else
+ \doregisterspotcolorname{#2}\@@cl@@e
+ \fi
+ \doglobal\addtocommalist{#2}\allspotcolors
+ \setxvalue{\??cr#1}{\colorPpattern}% was \setevalue
+ \setgvalue{#1}{\switchtocolor[#1]}}} % was \setvalue
+
+\def\registerusedspotcolors
+ {\ifx\allspotcolors\empty \else
+ \bgroup
+ \let\usedspotcolors\empty
+ \def\docommand##1%
+ {\doifdefined{\??cs##1}{\addtocommalist{##1}\usedspotcolors}}%
+ \processcommacommand[\allspotcolors]\docommand
+ \savecurrentvalue\usedspotcolors\usedspotcolors
+ \egroup
+ \fi}
+
+\def\registerusedcolorchannels
+ {\bgroup
+ \doifdefinedelse{\??cs c}
+ {\def\usedcolorchannels{c,m,y,k}}%
+ {\let\usedcolorchannels\empty}%
+ \doifdefined{\??cs r}
+ {\addtocommalist{r,g,b}\usedcolorchannels}%
+ \doifdefined{\??cs s}
+ {\ExpandBothAfter\doifnotinset{k}\usedcolorchannels
+ {\addtocommalist{s}\usedcolorchannels}}%
+ \savecurrentvalue\usedcolorchannels\usedcolorchannels
+ \egroup}
+
+\prependtoks
+ \registerusedspotcolors
+ \registerusedcolorchannels
+\to \everylastshipout
+
+\def\registerusedspotcolor#1%
+ {\global\@EA\chardef\csname\??cs#1\endcsname\zerocount}
+
+%D On top of spotcolors, we define multitone colors. You'd better know
+%D what you're doing because invalid definitions will lead to invalid
+%D documents (i.e.\ resources).
+
+% \definecolor [darkblue] [c=.5,m=.5]
+% \definecolor [darkyellow] [y=.5]
+%
+% \definemultitonecolor [whatever] [darkblue=.5,darkyellow=.5] [c=.25,m=.25,y=.25] [a=1,t=.5]
+% \definemultitonecolor [another] [darkblue=.5,darkyellow=.5] [c=.25,m=.25,y=.25]
+
+\def\dodefinemultitonecolor[#1][#2][#3][#4]%
+ {\let\@@cl@@cl@@D\empty % n's
+ \let\@@cl@@cl@@P\empty % p's
+ \let\@@cl@@cl@@N\empty % name
+ \scratchcounter\zerocount
+ \processcommacommand[#2]\dododefinemultitonecolor
+ \bgroup
+ \lccode`\.=`\_%
+ \lccode`\,=`\_%
+ \lccode`\:=`\_%
+ \lccode`\;=`\_%
+ \lccode`\+=`\_%
+ \lccode`\-=`\_%
+ \lccode`\*=`\_%
+ \lccode`\/=`\_%
+% \lccode`\_=`\_%
+ % not needed, other attribute in driver:
+ %
+ % \@@resetcolorparameters
+ % \getparameters[#4]%
+ % \ifx\@@cl@@t\@@cl@@z\else
+ % \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\@@cl@@t_\@@cl@@a}%
+ % \fi
+ \lowercase\@EA{\@EA\xdef\@EA\@@cleancolor\@EA{\@@cl@@cl@@N}}%
+ \egroup
+ \setxvalue{\??cl\@@cleancolor\s!check}{\noexpand\docheckmultitonecolor{\@@cl@@cl@@D}}%
+ \expanded{\defineglobalcolor[\@@cleancolor][#3,#4]}%
+ \expanded{\definespotcolor[#1][\@@cleancolor][#4,f=\the\scratchcounter,p={\@@cl@@cl@@P},d={\@@cl@@cl@@D}]}}
+
+\def\docheckmultitonecolor#1%
+ {\flushatshipout
+ {\let\checkmultitonecolor\gobbleoneargument
+ \def\docommand##1{\hbox{\definecolor[\s!dummy-100][##1][p=1]\color[\s!dummy-100]}}%
+ \processcommalist[#1]\docommand}}
+
+\def\checkmultitonecolor#1%
+ {\csname\??cl#1\s!check\endcsname\letgvalue{\??cl#1\s!check}\relax}
+
+\def\dodefinespotcolor[#1][#2][#3]% todo: always global (REDEFINED)
+ {\doifnot{#1}{#2}
+ {\@@resetcolorparameters
+ \doglobal\addtocommalist{#1}\colorlist % optional
+ \edef\@@cl@@n{#2}%
+ \getparameters[\??cl @@][#3]%
+ \doifnothing \@@cl@@p{\let\@@cl@@p\!!plusone}%
+ \doifsomething\@@cl@@e{\doregisterspotcolorname{#2}\@@cl@@e}%
+ \doglobal\addtocommalist{#2}\allspotcolors
+ \setxvalue{\??cr#1}{\colorPpattern}% was \setevalue
+ \setgvalue{#1}{\switchtocolor[#1]}}}% was \setvalue
+
+\def\dododefinemultitonecolor#1%
+ {\advance\scratchcounter\plusone
+ \splitstring#1\at=\to\!!stringa\and\!!stringb
+ \ifx\@@cl@@cl@@D\empty
+ \let\@@cl@@cl@@D\!!stringa
+ \let\@@cl@@cl@@P\!!stringb
+ \normalizecolor\!!stringb
+ \edef\@@cl@@cl@@N{\!!stringa_\!!stringb}%
+ \else
+ \edef\@@cl@@cl@@D{\@@cl@@cl@@D,\!!stringa}%
+ \edef\@@cl@@cl@@P{\@@cl@@cl@@P,\!!stringb}%
+ \normalizecolor\!!stringb
+ \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\!!stringa_\!!stringb}%
+ \fi}
+
+% \def\dododefinemultitonecolor#1% a/b safe
+% {\advance\scratchcounter\plusone
+% \splitstring#1\at=\to\@@cl@@one\and\@@cl@@two
+% \ifx\@@cl@@cl@@D\empty
+% \let\@@cl@@cl@@D\@@cl@@one
+% \let\@@cl@@cl@@P\@@cl@@two
+% \normalizecolor\@@cl@@two
+% \edef\@@cl@@cl@@N{\@@cl@@one_\@@cl@@two}%
+% \else
+% \edef\@@cl@@cl@@D{\@@cl@@cl@@D,\@@cl@@one}%
+% \edef\@@cl@@cl@@P{\@@cl@@cl@@P,\@@cl@@two}%
+% \normalizecolor\@@cl@@two
+% \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\@@cl@@one_\@@cl@@two}%
+% \fi}
+
+%D The names of colors are stored in a comma separated list
+%D only for the purpose of showing them with \type {\showcolor}.
+%D
+%D \startbuffer
+%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+%D
+%D This color shows up as \color [SomeKindOfRed] {some kind
+%D of red}.
+%D
+%D \starttyping
+%D \setupcolors[state=start]
+%D
+%D \definecolor[mygreen][green]
+%D \definecolor[green][g=.5]
+%D
+%D \startcolor[mygreen]test\stopcolor
+%D
+%D \setupcolors[expansion=no]
+%D
+%D \definecolor[mygreen][green]
+%D \definecolor[green][g=.5]
+%D
+%D \startcolor[mygreen]test\stopcolor
+%D \stoptyping
+
+%D \macros
+%D {startcolormode,stopcolormode,permitcolormode}
+%D
+%D We use \type{\stopcolormode} to reset the color in
+%D whatever color space and do so by calling the corresponding
+%D special. Both commands can be used for fast color
+%D switching, like in colored verbatim,
+
+\newif\ifpermitcolormode \permitcolormodetrue
+
+\def\dowithcolor#1#2% #1=\action #2=color
+ {\ifincolor\ifpermitcolormode
+ \ifcsname\??cr\currentpalet#2\endcsname
+ \handlecolorwith#1\csname\??cr\currentpalet#2\endcsname\od
+ \else\ifcsname\??cr#2\endcsname
+ \handlecolorwith#1\csname\??cr#2\endcsname\od
+ \fi\fi
+ \fi\fi}
+
+\def\startcolormode % includes \ifincolor\ifpermitcolormode
+ {%\dostoptransparency % needed for: {test \trans test \notrans test}
+ \conditionalstoptransparency
+ \dowithcolor\execcolorRCSP}
+
+\def\stopcolormode
+ {\ifincolor\ifpermitcolormode
+ \supportedstoptransparency
+ \dostopcolormode
+ \fi\fi}
+
+\def\restorecolormode
+ {\ifincolor\ifpermitcolormode
+ \supportedstoptransparency
+ \dostopcolormode
+ \ifx\maintextcolor\empty \else
+ \startcolormode\maintextcolor
+ \fi
+ \fi\fi}
+
+%D Color modes are entered using the next set of commands.
+%D The \type{\stop} alternatives are implemented in a way
+%D that permits non||grouped use.
+%D
+%D The, for this module redundant, check if we are in color
+%D mode is needed when we use these macros in other modules.
+
+\def\execcolorRCSP#1:%
+ {\csname execcolor#1\endcsname}
+
+\def\execcolorR
+ {\iffilterspotcolor
+ \@EA\noexeccolorR
+ \else
+ \@EA\doexeccolorR
+ \fi}
+
+\def\execcolorC
+ {\iffilterspotcolor
+ \@EA\noexeccolorC
+ \else
+ \@EA\doexeccolorC
+ \fi}
+
+\def\execcolorS
+ {\iffilterspotcolor
+ \@EA\noexeccolorS
+ \else
+ \@EA\doexeccolorS
+ \fi}
+
+\def\execcolorP
+ {\iffilterspotcolor
+ \@EA\doexeccolorPP
+ \else\ifcase\currentcolorchannel
+ \@EAEAEA\doexeccolorP
+ \else
+ \@EAEAEA\noexeccolorP
+ \fi\fi}
+
+\def\doexeccolorR#1:#2:#3:%
+ {\edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
+ \ifpreferGRAY\ifx\@@cl@@r\@@cr@@g\ifx\@@cl@@r\@@cl@@b
+ \GRAYpreferedtrue
+ \fi\fi\fi
+ \ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
+ \ifGRAYprefered
+ \registercolorchannel\c!s
+ \let\@@cl@@s\@@cl@@r
+ \normalizeGRAY
+ \doexeccolorgray
+ \else\ifRGBsupported
+ \registercolorchannel\c!r
+ \normalizeRGB
+ \doexeccolorrgb
+ \else\ifCMYKsupported
+ \registercolorchannel\c!c
+ \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
+ \normalizeCMYK
+ \doexeccolorcmyk
+ \else
+ \registercolorchannel\c!s
+ \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
+ \normalizeGRAY
+ \doexeccolorgray
+ \fi\fi\fi
+ \exectransparency}
+
+\def\doexeccolorC#1:#2:#3:#4:%
+ {\edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
+ \ifpreferGRAY\ifx\@@cl@@k\@@cl@@z\ifx\@@cl@@c\@@cr@@m\ifx\@@cl@@c\@@cl@@y
+ \GRAYpreferedtrue
+ \fi\fi\fi\fi
+ \ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
+ \ifGRAYprefered
+ \registercolorchannel\c!s
+ \let\@@cl@@s\@@cl@@c
+ \normalizeGRAY
+ \doexeccolorgray
+ \else\ifCMYKsupported
+ \registercolorchannel\c!c
+ \ifreduceCMYK
+ \convertCMYKtoCMY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \fi
+ \normalizeCMYK
+ \doexeccolorcmyk
+ \else\ifRGBsupported
+ \registercolorchannel\c!r
+ \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \normalizeRGB
+ \doexeccolorrgb
+ \else
+ \registercolorchannel\c!s
+ \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \normalizeGRAY
+ \doexeccolorgray
+ \fi\fi\fi
+ \exectransparency}
+
+\def\doexeccolorS#1:%
+ {\edef\@@cl@@s{#1}%
+ \registercolorchannel\c!s
+ \normalizeGRAY
+ \doexeccolorgray
+ \exectransparency}
+
+% \def\doexeccolorP#1:#2:%
+% {\edef\@@cl@@n{#1}%
+% \edef\@@cl@@p{#2}%
+% \registerusedspotcolor\@@cl@@n
+% \ifSPOTsupported
+% \dowithcolor\registerspotcolor\@@cl@@n
+% \dostartspotcolormode\@@cl@@n\@@cl@@p
+% \else
+% \doingspotcolortrue
+% \let\spotcolorfactor\@@cl@@p
+% \factorizecolortrue % using counter and array
+% \dowithcolor\execcolorRCSP\@@cl@@n
+% \factorizecolorfalse
+% \let\spotcolorfactor\@@cl@@o
+% \doingspotcolorfalse
+% \fi
+% \exectransparency}
+
+\def\doexeccolorP#1:#2:#3:#4:%
+ {\edef\@@cl@@n{#1}% name
+ \edef\@@cl@@f{#2}% fractions
+ \edef\@@cl@@d{#3}% definitions
+ \edef\@@cl@@p{#4}%
+ \ifx\@@cl@@d\empty
+ \let\@@cl@@d\@@cl@@n
+ \fi
+ \registerusedspotcolor\@@cl@@n
+ \ifSPOTsupported
+ \checkmultitonecolor\@@cl@@n
+ \dowithcolor\registerspotcolor\@@cl@@n
+ \dostartspotcolormode\@@cl@@n\@@cl@@p
+ \else
+ \doingspotcolortrue
+ \normalizespotcolor\@@cl@@p
+ \let\spotcolorfactor\@@cl@@p
+ \factorizecolortrue % using counter and array
+ \dowithcolor\execcolorRCSP\@@cl@@n
+ \factorizecolorfalse
+ \let\spotcolorfactor\@@cl@@o
+ \doingspotcolorfalse
+ \fi
+ \exectransparency}
+
+\def\doexeccolorPindex#1:#2:#3:#4:%
+ {\edef\@@cl@@n{#1}%
+ \edef\@@cl@@f{#2}%
+ \edef\@@cl@@d{#3}%
+ \edef\@@cl@@p{#4}%
+ \ifx\@@cl@@d\empty
+ \let\@@cl@@d\@@cl@@n
+ \fi
+ \ifSPOTsupported
+ \checkmultitonecolor\@@cl@@n
+ \dowithcolor\registerindexcolor\@@cl@@n
+ \fi
+ \noexectransparency}
+
+\def\doexeccolorPP#1:#2:%
+ {\edef\@@cl@@n{#1}%
+ \edef\@@cl@@p{#2}%
+ \registerusedspotcolor\@@cl@@n
+ \ifx\@@cl@@n\currentspotcolor
+ \normalizeSPOT
+ \dostartgraycolormode\@@cl@@p % was spotcolormode
+ \else
+ \dovidecolor\@@cl@@p\@@cl@@o
+ \fi
+ \exectransparency}
+
+\def\doexeccolorrgb
+ {\ifcase\currentcolorchannel
+ \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
+ \or \or \or \or
+ \or \dostartgraycolormode\@@cl@@r
+ \or \dostartgraycolormode\@@cl@@g
+ \or \dostartgraycolormode\@@cl@@b
+ \fi}
+
+\def\doexeccolorcmyk
+ {\ifcase\currentcolorchannel
+ \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \or \negatecolorcomponent\@@cl@@c\dostartgraycolormode\@@cl@@c
+ \or \negatecolorcomponent\@@cl@@m\dostartgraycolormode\@@cl@@m
+ \or \negatecolorcomponent\@@cl@@y\dostartgraycolormode\@@cl@@y
+ \or \negatecolorcomponent\@@cl@@k\dostartgraycolormode\@@cl@@k
+ \fi}
+
+\def\doexeccolorgray
+ {\ifcase\currentcolorchannel
+ \dostartgraycolormode\@@cl@@s
+ \or \or \or
+ \or \dostartgraycolormode\@@cl@@s
+ \or \or \or
+ \or \dostartgraycolormode\@@cl@@s
+ \fi}
+
+%D When filtering colors, we need to either erase
+%D the background, or ignore the foreground.
+
+% \newif\ifhidesplitcolor \hidesplitcolortrue
+%
+% \def\noexeccolor#1\od
+% {\dostartgraycolormode\@@cl@@o}
+%
+% \let\noexeccolorS\noexeccolor
+% \let\noexeccolorP\noexeccolor
+
+%D Well, here comes some real trickery. When we have the 100\%
+%D spot color or black color, we don't want to erase the
+%D background. So, instead we hide the content by giving it
+%D zero transparency.
+
+% todo : #1#2#3 met #2 > of < and #3 een threshold
+
+\def\dohidecolor#1#2%
+ {\ifhidesplitcolor
+ \ifx#1#2%
+ \dostartgraycolormode\@@cl@@o
+ \else
+ \doregisternonecolor
+ \dostartnonecolormode
+ \fi
+ \else
+ \dostartgraycolormode\@@cl@@o
+ \fi}
+
+\def\dovidecolor#1#2%
+ {\ifhidesplitcolor
+ \ifx#1#2%
+ \doregisternonecolor
+ \dostartnonecolormode
+ \else
+ \dostartgraycolormode\@@cl@@o
+ \fi
+ \else
+ \dostartgraycolormode\@@cl@@o
+ \fi}
+
+% \def\fullytransparentcolor % fails on floats
+% {\dostartgraycolormode\@@cl@@o % better than z
+% %\global\@EA\chardef\csname\@@currenttransparent\endcsname\plusone
+% %\global\intransparenttrue
+% \dostarttransparency10}
+
+\def\noexeccolorR#1:#2:#3:#4\od
+ {\edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
+ \dohidecolor\@@cl@@s\@@cl@@o}
+
+\def\noexeccolorC#1:#2:#3:#4:#5\od
+ {\edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
+ \dohidecolor\@@cl@@s\@@cl@@o}
+
+\def\noexeccolorS#1:#2\od
+ {\edef\@@cl@@s{#1}%
+ \dohidecolor\@@cl@@s\@@cl@@o}
+
+\def\noexeccolorP#1:#2:#3:#4:#5\od
+ {\edef\@@cl@@p{#4}%
+ \dohidecolor\@@cl@@p\@@cl@@z}
+
+%D For the sake of postprocessing (i.e.\ color separation)
+%D we can normalize colors, which comes down to giving equal
+%D values an equal accuracy and format. This feature is
+%D turned off by default due to a speed penalty. This macro
+%D also handles spot color percentages.
+
+\newif\iffactorizecolor
+\newif\ifnormalizecolor
+
+\def\spotcolorfactor{1}
+
+% \def\normalizecolor#1%
+% {\colordimen#1\thousandpoint
+% \colordimen\spotcolorfactor\colordimen
+% \colorcount\colordimen
+% \advance\colorcount \medcard
+% \divide\colorcount \maxcard
+% \edef#1{\realcolorvalue\colorcount}}
+
+\def\normalizecolor#1%
+ {\colorcount\numexpr(\dimexpr\spotcolorfactor\dimexpr#1\thousandpoint\relax\relax+\medcard)/\maxcard\relax
+ \edef#1{\realcolorvalue\colorcount}}
+
+% \def\normalizespotcolor#1%
+% {\colordimen-#1\thousandpoint
+% \advance\colordimen\thousandpoint
+% \colorcount\colordimen
+% \advance\colorcount \medcard
+% \divide\colorcount \maxcard
+% \edef#1{\realcolorvalue\colorcount}}
+
+\def\normalizespotcolor#1%
+ {\colorcount\numexpr(\dimexpr\thousandpoint-#1\thousandpoint\relax+\medcard)/\maxcard\relax
+ \edef#1{\realcolorvalue\colorcount}}
+
+\def\donormalizeRGB
+ {\normalizecolor\@@cl@@r
+ \normalizecolor\@@cl@@g
+ \normalizecolor\@@cl@@b}
+
+\def\normalizeRGB
+ {\ifnormalizecolor
+ \donormalizeRGB
+ \else\iffactorizecolor
+ \donormalizeRGB
+ \fi\fi}
+
+\def\donormalizeCMYK
+ {\normalizecolor\@@cl@@c
+ \normalizecolor\@@cl@@m
+ \normalizecolor\@@cl@@y
+ \normalizecolor\@@cl@@k}
+
+\def\normalizeCMYK
+ {\ifnormalizecolor
+ \donormalizeCMYK
+ \else\iffactorizecolor
+ \donormalizeCMYK
+ \fi\fi}
+
+\def\donormalizeGRAY
+ {\normalizecolor\@@cl@@s}
+
+\def\normalizeGRAY
+ {\ifnormalizecolor
+ \donormalizeGRAY
+ \else\iffactorizecolor
+ \donormalizeGRAY
+ \fi\fi}
+
+\def\normalizeSPOT
+ {\normalizespotcolor\@@cl@@p}
+
+%D We need to register spot colors (i.e.\ resources need to
+%D be created.
+
+\def\registerspotcolor#1:%
+ {\ifcsname\??cl:\c!p:\@@cl@@n\endcsname
+ \@EA\dontregisterspotcolor
+ \else
+ \letgvalue{\??cl:\c!p:\@@cl@@n}\empty
+ %\@EA\@EA\csname registerspotcolor#1\endcsname
+ \csname registerspotcolor#1\@EA\endcsname
+ \fi}
+
+% todo: convert to rgb if needed, will will do this in mkiv
+
+\def\dontregisterspotcolor #1\od{}
+\def\registerspotcolorR #1:#2:#3:#4\od{\doregisterrgbspotcolor \@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}}
+\def\registerspotcolorC#1:#2:#3:#4:#5\od{\doregistercmykspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}{#4}}
+\def\registerspotcolorS #1:#2\od{\doregistergrayspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}}
+\def\registerspotcolorP #1:#2:#3\od{\doregistergrayspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#2}}
+
+%D Experimental feature:
+
+% \definecolor [darkblue] [c=1,m=.38,y=0,k=.64] % pantone pms 2965 uncoated m
+% \definecolor [darkyellow] [c=0,m=.28,y=1,k=.06] % pantone pms 124 uncoated m
+%
+% \definecolor [darkblue-50] [darkblue] [p=.5]
+% \definecolor [darkyellow-50] [darkyellow] [p=.5]
+% \definecolor [darkblue-80] [darkblue] [p=.8]
+% \definecolor [darkyellow-80] [darkyellow] [p=.8]
+%
+% \definecolor [darkblue,darkyellow] [r=.8]
+% \definecolor [darkdull-5030] [darkblue,darkyellow] [p={.5,.3}]
+%
+% \setupcolors[state=start]
+%
+% \blackrule[width=4cm,height=3cm,color=darkblue-50]
+% \blackrule[width=4cm,height=3cm,color=darkblue-80]
+% \blackrule[width=4cm,height=3cm,color=darkyellow-50]
+% \blackrule[width=4cm,height=3cm,color=darkyellow-80]
+% \blackrule[width=4cm,height=3cm,color=darkdull-5030]
+
+%D Experimental too (special purpose code).
+
+\def\registerindexcolor#1:%
+ {\ifcsname\??cl:i:\@@cl@@n\endcsname
+ \@EA\dontregisterindexcolor
+ \else
+ \letgvalue{\??cl:i:\@@cl@@n}\empty % signal
+ \showmessage\m!colors{12}\@@cl@@n
+ \@EA\@EA\csname registerindexcolor#1\endcsname
+ \fi}
+
+\let\dontregisterindexcolor\dontregisterspotcolor
+
+\def\registerindexcolorR #1:#2:#3:#4\od{\doregisterrgbindexcolor \@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}}
+\def\registerindexcolorC#1:#2:#3:#4:#5\od{\doregistercmykindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}{#4}}
+\def\registerindexcolorS #1:#2\od{\doregistergrayindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}}
+\def\registerindexcolorP #1:#2:#3\od{\doregistergrayindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#2}}
+
+\def\predefinecolor[#1]%
+ {\bgroup
+ \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
+ \egroup}
+
+\def\predefineindexcolor[#1]%
+ {\bgroup
+ \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
+ \let\doexeccolorP\doexeccolorPindex
+ \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% index one
+ \egroup}
+
+% \def\checkpredefinedcolor[#1]%
+% {\ifcase\internalspotcolorsize{#1}\relax
+% \@EA\predefinecolor\or\@EA\predefinecolor\else\@EA\predefineindexcolor
+% \fi[#1]}
+
+\let\checkpredefinedcolor\predefineindexcolor % we need an index in order to negate bitmaps
+
+%D Transparency is handled similar for all three color modes. We
+%D can turn transparency off with the following switch:
+
+\newif\iftransparencysupported \transparencysupportedtrue % only mkii
+
+\def\exectransparency
+ {\iftransparencysupported
+ \expandafter\doexectransparency
+ \else
+ \expandafter\noexectransparency
+ \fi}
+
+\def\doexectransparency#1:#2\od
+ {\ifcase#1\space
+ \global\intransparentfalse
+ \else
+ \global\intransparentfalse
+ %\dostarttransparency{#1}{#2}%
+ \supportedstarttransparency{#1}{#2}%
+ \global\intransparenttrue
+ \fi}
+
+\def\noexectransparency#1\od
+ {}
+
+%D Experimental: minimize transparency resets.
+
+\newif\ifintransparent
+\newif\ifoptimizetransparency \optimizetransparencytrue % under test
+
+\let\supportedstoptransparency\relax
+
+\def\conditionalstoptransparency
+ {\ifoptimizetransparency
+ \ifintransparent
+ \global\intransparentfalse
+ \supportedstoptransparency
+ \fi
+ \else
+ \supportedstoptransparency
+ \fi}
+
+\def\supportedstarttransparency
+ {\iftransparencysupported
+ \globallet\supportedstoptransparency\dostoptransparency
+ \expandafter\dostarttransparency
+ \else
+ \expandafter\gobbletwoarguments
+ \fi}
+
+%D We now use the \type {\@@cl@@A} hook to implement
+%D symbolic names. These are converted into numbers
+%D at definition time (which saves runtime).
+
+\def\dodefinetransparency[#1][#2]%
+ {\@EA\chardef\csname\??cl-#1\endcsname#2\relax}
+
+\def\transparencynumber#1%
+ {\number\executeifdefined{\??cl-#1}{#1}}
+
+%D Now we hook 'm into the patterns:
+
+\def\@@cl@@A{\transparencynumber\@@cl@@a}
+
+%D The next macro can be used to return to the (normal)
+%D page color. This macro is used in the same way as
+%D \type {\color}.
+
+\def\startregistercolor[#1]%
+ {\permitcolormodefalse\startcolor[#1]\permitcolormodetrue}
+
+\def\stopregistercolor
+ {\permitcolormodefalse\stopcolor\permitcolormodetrue}
+
+\def\starttextcolor[#1]%
+ {\doifsomething{#1}
+ {\bgroup
+ \def\stoptextcolor % also goes ok with \page after
+ {\let\maintextcolor\empty % this one because the top of
+ \stopregistercolor % page sets the color right (side
+ \egroup}% % effect)
+ \def\starttextcolor[##1]%
+ {\bgroup
+ % \@@themaintextcolor==##1 is catched in \definecolor
+ \definecolor[\@@themaintextcolor][##1]%
+ \let\stoptextcolor\egroup}%
+ \startregistercolor[\@@themaintextcolor]%
+ \definecolor[\@@themaintextcolor][#1]%
+ \let\maintextcolor\@@themaintextcolor}}
+
+\let\stoptextcolor\relax
+
+%D The following hook permits proper support at the text
+%D level. This definition actually belongs in another
+%D module. (May need a different \MKIV\ implementation.)
+
+% \ifx\initializemaintextcolor\undefined
+
+ \let\@@clprevcolor\empty
+
+ \def\initializemaintextcolor
+ {% saveguard for setting text color to empty after
+ % it has been set
+ \doifnothing\@@cltextcolor
+ {\ifx\@@clprevcolor\empty\else
+ \let\@@cltextcolor\defaulttextcolor
+ \fi}%
+ \doifelsenothing\@@cltextcolor
+ {\let\maintextcolor\empty}
+ {\edef\@@clprevcolor{\@@cltextcolor}%
+ \let\maintextcolor\@@themaintextcolor
+ \doifelsenothing\@@cltextcolor % another saveguard
+ {\definecolor[\@@themaintextcolor][\defaulttextcolor]}%
+ {\definecolor[\@@themaintextcolor][\@@cltextcolor]}%
+ \doinitializemaintextcolor}}
+
+ \def\doinitializemaintextcolor
+ {\appendtoks\starttextcolor[\@@themaintextcolor]\to\everystarttext
+ \appendtoks\stoptextcolor \to\everystoptext
+ \let\doinitializemaintextcolor\relax}
+
+% \fi
+
+\def\localstarttextcolor
+ {\ifx\maintextcolor\empty
+ \startcolormode\defaulttextcolor
+ \else
+ \startcolormode\maintextcolor
+ \fi}
+
+% \def\localstoptextcolor
+% {\stopcolormode}
+%
+% better:
+
+\def\localstoptextcolor
+ {\restorecolormode}
+
+\def\restoretextcolor
+ {\ifx\maintextcolor\empty
+ \expandafter\dorestoretextcolor
+ \else
+ % obey main text color
+ \fi}
+
+\def\dorestoretextcolor
+ {\color[\defaulttextcolor]}
+
+%D We use some reserved names for local color components.
+%D Consistent use of these scratch variables saves us
+%D unneccessary hash entries.
+%D
+%D \starttyping
+%D \@@cl@@r \@@cl@@g \@@cl@@b
+%D \@@cl@@c \@@cl@@m \@@cl@@y \@@cl@@k
+%D \@@cl@@s
+%D \stoptyping
+%D
+%D We implement several conversion routines.
+%D
+%D \starttyping
+%D \convertRGBtoCMYK {r} {g} {b}
+%D \convertRGBtoGRAY {r} {g} {b}
+%D \convertCMYKtoRGB {c} {m} {y} {k}
+%D \convertCMYKtoGRAY {c} {m} {y} {k}
+%D \convertCMYKtoCMY {c} {m} {y} {k}
+%D \stoptyping
+%D
+%D The relation between \cap{Gray}, \cap{RGB} and \cap{CMYK}
+%D is:
+%D
+%D \placeformula[-]
+%D \startformula
+%D G = .30r + .59g + .11b
+%D = 1.0 - \min(1.0,\ .30c + .59m + .11y + k)
+%D \stopformula
+%D
+%D When converting from \cap{CMYK} to \cap{RGB} we use the
+%D formula:
+%D
+%D \placeformula[-]
+%D \startformula
+%D \eqalign
+%D {r &= 1.0 - \min(1.0,\ c+k) \cr
+%D g &= 1.0 - \min(1.0,\ m+k) \cr
+%D b &= 1.0 - \min(1.0,\ y+k)}
+%D \stopformula
+%D
+%D In the conversion routine the color components are calculated
+%D in three digits precision.
+
+\def\realcolorvalue#1%
+ {\ifnum#1>\zerocount % important, first encountered in --modu supp-mpe
+ \ifnum#1<\plusten 0.00\the#1\else
+ \ifnum#1<\plushundred 0.0\the#1\else
+ \ifnum#1<\plusthousand 0.\the#1\else
+ 1\fi\fi\fi
+ \else 0\fi}
+
+% \def\doconvertCMYKtoRGB#1\k#2\to#3%
+% {\ifdim#2\points>#1\points% >= problem, repaired 2/12/2002
+% \let#3\@@cl@@z % k >= color
+% \else
+% \colordimen\onepoint
+% \advance\colordimen -#1\points
+% \advance\colordimen -#2\points
+% \multiply\colordimen \plusthousand
+% \colorcount\colordimen
+% \advance\colorcount \medcard
+% \divide\colorcount \maxcard
+% \edef#3{\realcolorvalue\colorcount}%
+% \fi}
+
+\def\doconvertCMYKtoRGB#1\k#2\to#3%
+ {\colorcount\numexpr(\dimexpr\plusthousand\dimexpr\onepoint-#1\points-#2\points\relax\relax+\medcard)/\maxcard\relax
+ \ifnum\colorcount>\zeropoint
+ \edef#3{\realcolorvalue\colorcount}%
+ \else
+ \let#3\@@cl@@z
+ \fi}
+
+\def\convertCMYKtoRGB#1#2#3#4%
+ {\doconvertCMYKtoRGB#1\k#4\to\@@cl@@r
+ \doconvertCMYKtoRGB#2\k#4\to\@@cl@@g
+ \doconvertCMYKtoRGB#3\k#4\to\@@cl@@b}
+
+% \def\doconvertRGBtoCMYK#1\to#2%
+% {\colordimen#1\points
+% \multiply\colordimen \plusthousand
+% \colorcount\colordimen
+% \advance\colorcount \medcard
+% \divide\colorcount \maxcard
+% \colorcount-\colorcount
+% \advance\colorcount \plusthousand
+% \edef#2{\realcolorvalue\colorcount}}
+
+\def\doconvertRGBtoCMYK#1\to#2%
+ {\colorcount\numexpr\plusthousand-(\dimexpr\plusthousand\dimexpr#1\points\relax\relax+\medcard)/\maxcard\relax
+ \edef#2{\realcolorvalue\colorcount}}
+
+\def\convertRGBtoCMYK#1#2#3%
+ {\doconvertRGBtoCMYK#1\to\@@cl@@c
+ \doconvertRGBtoCMYK#2\to\@@cl@@m
+ \doconvertRGBtoCMYK#3\to\@@cl@@y
+ \let\@@cl@@k\@@cl@@z}
+
+%D The following switch is mainly meant for (hidden)
+%D documentation purposes.
+
+\def\nGRAYfactor{333.333}
+\def\rGRAYfactor{\ifweightGRAY300\else\nGRAYfactor\fi}
+\def\gGRAYfactor{\ifweightGRAY590\else\nGRAYfactor\fi}
+\def\bGRAYfactor{\ifweightGRAY110\else\nGRAYfactor\fi}
+
+% \def\convertRGBtoGRAY#1#2#3%
+% {\colordimen#1\points
+% \colordimen\rGRAYfactor\colordimen
+% \colorcount\colordimen
+% \colordimen#2\points
+% \colordimen\gGRAYfactor\colordimen
+% \advance\colorcount \colordimen
+% \colordimen#3\points
+% \colordimen\bGRAYfactor\colordimen
+% \advance\colorcount \colordimen
+% \advance\colorcount \medcard
+% \divide\colorcount \maxcard
+% \edef\@@cl@@s{\realcolorvalue\colorcount}}
+
+\def\convertRGBtoGRAY#1#2#3%
+ {\colorcount\numexpr
+ (\dimexpr\rGRAYfactor\dimexpr#1\points\relax\relax+
+ \dimexpr\gGRAYfactor\dimexpr#2\points\relax\relax+
+ \dimexpr\bGRAYfactor\dimexpr#3\points\relax\relax+
+ \medcard)/\maxcard
+ \relax
+ \edef\@@cl@@s{\realcolorvalue\colorcount}}
+
+\def\convertCMYKtoGRAY#1#2#3#4%
+ {\convertCMYKtoRGB{#1}{#2}{#3}{#4}%
+ \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b}
+
+% \def\doconvertCMYKtoCMY#1\k#2\to#3%
+% {\colordimen#1\points
+% \advance\colordimen #2\points\relax
+% \ifdim\colordimen>\onepoint
+% \colordimen\onepoint
+% %\else
+% % \colordimen\colordimen
+% \fi
+% \multiply\colordimen \plusthousand
+% \colorcount\colordimen
+% \advance\colorcount \medcard
+% \divide\colorcount \maxcard
+% \edef#3{\realcolorvalue\colorcount}}
+
+\def\doconvertCMYKtoCMY#1\k#2\to#3%
+ {\colorcount\numexpr(\dimexpr\plusthousand\dimexpr#1\points+#2\points\relax\relax+\medcard)/\maxcard\relax
+ \ifnum\colorcount>\plusthousand
+ \let#3\@@cl@@o
+ \else
+ \edef#3{\realcolorvalue\colorcount}%
+ \fi}
+
+\def\convertCMYKtoCMY#1#2#3#4%
+ {\doconvertCMYKtoCMY#1\k#4\to\@@cl@@c
+ \doconvertCMYKtoCMY#2\k#4\to\@@cl@@m
+ \doconvertCMYKtoCMY#3\k#4\to\@@cl@@y
+ \let\@@cl@@k\@@cl@@z}
+
+%D Before we present the color macros, we first define the
+%D setup command. This command takes care of setting up the
+%D booleans that control local and global behavior (more on
+%D that later) and conversion to other color spaces.
+
+\let\currentspotcolor \empty
+\let\previousspotcolor\empty
+
+%D The tests depend on the use of constants. If we use the \MKIV\
+%D method we can share more.
+
+\def\doifcolorelse#1%
+ {\ifcsname\??cr\ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifcolor#1%
+ {\ifcsname\??cr\ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi#1\endcsname
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+%D There are a couple of different color switching macros,
+%D the local ones can be used to speed up things (only in \MKII).
+
+\def\localstartcolor
+ {\ifincolor
+ \localcolortrue
+ \expandafter\doglobalstartcolor
+ \else
+ \expandafter\noglobalstartcolor
+ \fi}
+
+\def\localstopcolor
+ {\ifincolor
+ \doglobalstopcolor
+ \else
+ \noglobalstopcolor
+ \fi}
+
+\unexpanded\def\startcolor
+ {\ifincolor
+ \expandafter\doglobalstartcolor
+ \else
+ \expandafter\noglobalstartcolor
+ \fi}
+
+\unexpanded\def\stopcolor
+ {\ifincolor
+ \doglobalstopcolor
+ \else
+ \noglobalstopcolor
+ \fi}
+
+%D This macros call the global color switching ones. Starting
+%D a global, i.e. a possible page boundary crossing, color
+%D mode also sets a \type{\mark} in \TEX's internal list.
+
+\newcount\colorlevel
+
+\letvalue{\??cl0C}\empty % saved color
+\letvalue{\??cl0S}\empty % stop command
+
+%D We keep a positive color stack for foreground colors, and
+%D a negative one for backgrounds. Not that brilliant a
+%D solution, but it suits. The signs are swapped when the
+%D page ornaments are typeset.
+
+\let\@@colorplus \plusone
+\let\@@colorminus\minusone
+
+\def\@@currentcolorname {\??cl\the\colorlevel C}
+\def\@@currentcolorstop {\??cl\the\colorlevel S}
+%def\@@currenttransparent{\??cl\the\colorlevel T}
+
+\letvalue{\??cl*\s!black}\s!black
+
+\def\currentcolorname
+ {\csname
+ \ifcsname\@@currentcolorname\endcsname
+ \expandafter\ifx\csname\@@currentcolorname\endcsname\empty
+ \??cl*\s!black
+ \else
+ \@@currentcolorname
+ \fi
+ \else
+ \??cl*\s!black
+ \fi
+ \endcsname}
+
+\def\outercolorname
+ {\ifcsname\@@currentcolorname\endcsname
+ \expandafter\ifx\csname\@@currentcolorname\endcsname\empty
+ \s!black
+ \else
+ currentcolor%
+ \fi
+ \else
+ \s!black
+ \fi}
+
+% not the following, because we need a different tag in order to trick the stack
+%
+% \def\outercolorname{\executeifdefined\@@currentcolorname\s!black}
+%
+% \def\startcurrentcolor{\expanded{\startcolor[\s!black]\noexpand\startcolor[\outercolorname]}}
+% \def\stopcurrentcolor {\stopcolor\stopcolor}
+%
+% test case:
+%
+% \setupcolors[state=start,textcolor=red]
+% \starttext
+% red
+% \color[green]{green
+% \startMPcode
+% label(\sometxt{green\color[blue]{blue}green}, origin) withcolor red;
+% draw fullcircle scaled 1cm xscaled 2;
+% \stopMPcode
+% green}
+% red
+% \stoptext
+
+\def\dodoglobalstartcolor
+ {\global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
+ \global\advance\colorlevel \@@colorplus
+ \global\@EA\let\csname\@@currentcolorname\endcsname\@@askedcolor
+ %\debuggerinfo\m!colors
+ % {start \@@askedcolor\space at level \the\colorlevel}%
+ \ifx\@@askedcolor\empty
+ \global\@EA\let\csname\@@currentcolorname\endcsname\@@currentcolor
+ \global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
+ \else\ifx\@@askedcolor\@@currentcolor
+ \global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
+ \else
+ \doifcolorelse\@@askedcolor
+ {%\docolormark\@@askedcolor
+ \ifpermitcolormode\docolormark\@@askedcolor\fi
+ \global\@EA\let\csname\@@currentcolorstop\endcsname\dodoglobalstopcolor
+ \startcolormode\@@askedcolor}
+ {\global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
+ \showmessage\m!colors3\@@askedcolor\empty}%
+ \fi\fi}
+
+\def\doglobalstartcolor[#1]%
+ {\edef\@@askedcolor{#1}%
+ \ifcase\colorlevel\relax
+ \ifx\@@askedcolor\empty
+ \global\@EA\let\csname\@@currentcolorstop\endcsname\empty
+ \else
+ \dodoglobalstartcolor
+ \fi
+ \else
+ \dodoglobalstartcolor
+ \fi
+ \ignorespaces}
+
+\def\noglobalstartcolor[#1]%
+ {}
+
+\def\dodoglobalstopcolor
+ {\ifcase\colorlevel \else
+ \donoglobalstopcolor
+ \global\@EA\let\@EA\@@previouscolor\csname\@@currentcolorname\endcsname
+ \ifcase\colorlevel\relax
+ \ifpermitcolormode
+ \docolormark\empty
+ \conditionalstoptransparency
+ \dostopcolormode
+ \fi
+ \else % let's do a bit redundant testing here
+ \docolormark\@@previouscolor
+ \ifx\@@previouscolor\empty
+ \ifpermitcolormode
+ \conditionalstoptransparency
+ \dostopcolormode
+ \fi
+ \else
+ \doifcolorelse\@@previouscolor
+ {\ifx\@@currentcolor\@@previouscolor\else
+ % alternatively we could let \startcolormode handle this
+ \ifpermitcolormode
+ \conditionalstoptransparency % really needed
+ % more safe but less efficient: \dostopcolormode
+ \fi
+ \startcolormode\@@previouscolor
+ \fi}
+ {\ifpermitcolormode
+ \conditionalstoptransparency
+ \dostopcolormode
+ \fi}%
+ \fi
+ \fi
+ \fi}
+
+\def\donoglobalstopcolor
+ {\ifcase\colorlevel \else
+ \global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
+ %\debuggerinfo{\m!colors}
+ % {stop \@@currentcolor\normalspace at level \the\colorlevel}%
+ \global\advance\colorlevel \@@colorminus
+ \fi}
+
+\def\doglobalstopcolor
+ {\csname\@@currentcolorstop\endcsname}
+
+\let\noglobalstopcolor\relax
+
+\let\faststartcolor\doglobalstartcolor
+\let\faststopcolor \doglobalstopcolor
+
+%D We don't use grouping and save each stop alternative. This
+%D permits be especially useful in for instance local color
+%D support in verbatim. Using \type{\bgroup}||\type{\egroup}
+%D pairs could interfere with calling commands
+
+%D This color mechanism takes care of nested colors, like in:
+%D
+%D \startbuffer
+%D \color[green]{groen \color[green]{groen \color[red]{rood}} groen}
+%D \color[green]{groen \color[]{groen \color[red]{rood}} groen}
+%D \color[green]{groen \color[red]{rood \color[red]{rood}} groen}
+%D \color[green]{groen \color[green]{groen \color[]{groen}} groen}
+%D \color[green]{groen \color[red]{rood} groen}
+%D \color[green]{groen \color[]{groen} groen}
+%D \color[]{zwart \color[red]{rood} zwart}
+%D \color[]{zwart}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D Crossing page boundaries is of course also handled.
+%D Undefined or empty color specifications are treated as
+%D efficient as possible.
+%D
+%D \startbuffer
+%D \startcolor[green]
+%D [green] \input tufte [green] \par
+%D \startcolor[]
+%D [green] \input knuth [green] \par
+%D \startcolor[red]
+%D [red] \input tufte [red] \par
+%D \startcolor[yellow]
+%D [yellow] \input knuth [yellow] \par
+%D \stopcolor
+%D [red] \input tufte [red] \par
+%D \stopcolor
+%D [green] \input knuth [green] \par
+%D \stopcolor
+%D [green] \input tufte [green] \par
+%D \stopcolor
+%D \stopbuffer
+%D
+%D \startpacked
+%D \getbuffer
+%D \stoppacked
+%D
+%D These quotes are typeset by saying:
+%D
+%D \typebuffer
+
+%D We already mentioned that colors interfere with building
+%D the pagebody. This means that when the page is composed,
+%D the colors temporary have to be reset. After the page is
+%D shipped out, we have to revive the current color.
+%D
+%D We use \type{\mark}s to keep track of colors across page
+%D boundaries. Unfortunately standard \TEX\ supports only one mark,
+%D and using this one for color support only would be a waste.
+%D We therefore use an adapted version of J.~Fox's multiple mark
+%D mechanism as (re|)|implemented in \module{supp-mrk}.
+
+\doifdefinedelse{rawnewmark}
+ {\rawnewmark\colormark}
+ {\let\colormark\gobbleoneargument}
+
+%D Using this mark mechanism with lots of colors has one
+%D major drawback: \TEX's memory tends to overflow when
+%D very colorful text is stored in a global box. Even worse is that
+%D the processing time grows considerably. We therefore support
+%D local as well as global color switching.
+%D
+%D Of the next macros, \type {\popcolor} is to be used after
+%D the actual \type {\shipout} and \type {\startcolorpage} and
+%D \type {\stopcolorpage} are called when entering and leaving
+%D the \type {\pagebody} builder. In case of emergencies
+%D \type {\pushcolor} can be used to undo the current color,
+%D for instance when insertions are appended to the page.
+%D
+%D Out of efficiency we only use marks when needed. The next
+%D macro tries to find out if indeed a mark should be set.
+%D This macro uses the boolean \type {\ifinpagebody}, which can
+%D be defined and set in the module that handles the pagebody.
+
+\def\docolormark#1%
+ {\iflocalcolor \else \ifinpagebody \else \ifinframed \else
+ \dodocolormark{#1}%
+ \fi \fi \fi}
+
+\let\lastcolormark=\empty
+
+\def\dodocolormark#1%
+ {\edef\newcolormark{#1}%
+ \ifx\newcolormark\lastcolormark\else
+ \global\let\lastcolormark\newcolormark
+ \@EA\rawsetmark\@EA\colormark\@EA{\lastcolormark}%
+ \fi}
+
+%D \macros
+%D {pushcolor, popcolor}
+%D
+%D Pushing the current state in the output routine simply comes
+%D to resetting the color to black, while popping restores the
+%D color state to that of before the break.
+
+\def\topofpagecolor{\rawgetbotmark\colormark} % see postponing
+
+\def\pushcolor
+ {\stopcolormode}
+
+\def\popcolor
+ {\doifsomething{\rawgetbotmark\colormark}
+ {%\debuggerinfo\m!colors{popping \getbotmark\colormark}%
+ \startcolormode{\rawgetbotmark\colormark}}}
+
+\def\popsplitcolor
+ {\getsplitmarks\colormark % hier wel
+ \doifsomething{\rawgetsplitbotmark\colormark}
+ {%\debuggerinfo\m!colors{split popping \getsplitbotmark\colormark}%
+ \startcolormode{\rawgetsplitbotmark\colormark}}}
+
+\appendtoks\pushcolor \to\everypushproperties
+\appendtoks\popcolor \to\everypopproperties
+\appendtoks\popsplitcolor\to\everypopsplitproperties
+
+% Private macro: only needed in test cases (like multiple
+% seperations in one file); no user command!
+
+\def\resynccolor
+ {\ifcase\pagetotal % \ifdim\pagetotal=\zeropoint
+ \popcolor
+ \else\ifx\@@currentcolor\empty
+ \ifx\maintextcolor\empty\else
+ \startcolormode\maintextcolor
+ \fi
+ \else
+ \startcolormode\@@currentcolor
+ \fi\fi}
+
+% weird stuff
+
+\def\pushpostponedpagecolor
+ {\edef\savedtopofpagecolor{\topofpagecolor}%
+ \doifsomething\savedtopofpagecolor\restorecolormode} % \stopcolormode
+
+\def\poppostponedpagecolor
+ {\doifsomething\savedtopofpagecolor\startcolormode\savedtopofpagecolor}
+
+%D \macros
+%D {startcolorpage, stopcolorpage}
+%D
+%D Local use can be forced with the next two macros. Nesting
+%D is still supported but colors are no longer marked.
+%D
+%D The next implementation makes (simple) color separation more
+%D easy. It also supports nested colors in page backgrounds
+%D and texts.
+
+\def\startcolorpage
+ {\bgroup
+ \let\@@colorplus \minusone
+ \let\@@colorminus\plusone
+ \let\docolormark\gobbleoneargument
+ \edef\savedcolorlevel{\the\colorlevel}%
+ \global\colorlevel\zerocount % before \localstartcolor of
+ \ifx\maintextcolor\empty % course, ugly bug removed
+ \localstartcolor[\defaulttextcolor]%
+ \else
+ \localstartcolor[\maintextcolor]%
+ \fi}
+
+\def\stopcolorpage
+ {\localstopcolor
+ \global\colorlevel\savedcolorlevel
+ \egroup}
+
+\appendtoks \startcolorpage\to\everystarttextproperties
+\prependtoks\stopcolorpage \to\everystoptextproperties
+
+%D We want color support to be similar to font support and
+%D therefore implement \type{\color} using grouping.
+%D
+%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.
+
+\unexpanded\def\color[#1]%
+ {\groupedcommand{\startcolor[#1]}\stopcolor}
+
+%D This implementation enables use of defined colors like:
+%D
+%D \starttyping
+%D Look at the {\brightgreen bright} side of life and get
+%D yourself no \red{red} head!
+%D \stoptyping
+
+%D Also wrong, test in combinations: \type{...{}{\red test}}
+%D
+%D \def\switchtocolor[#1]%
+%D {\startcolor[#1]\aftergroup\stopcolor}
+
+\def\switchtocolor[#1]% grouping is realy needed, else migration
+ {\bgroup\startcolor[#1]\aftergroup\stopcolor\aftergroup\egroup}
+
+\unexpanded\def\color[#1]%
+ {\groupedcommand{\startcolor[#1]}\stopcolor}
+
+\unexpanded\def\graycolor[#1]% not \gray because this is a color
+ {\groupedcommand{\RGBsupportedfalse\CMYKsupportedfalse\SPOTsupportedfalse\startcolor[#1]}\stopcolor}
+
+\unexpanded\def\colored[#1]%
+ {\groupedcommand{\definecolor[@colored@][#1]\startcolor[@colored@]}\stopcolor}
+
+%D We can speed the following macros a bit up, but this
+%D hardly pays off; they are only used in the manual.
+
+\def\realcolorformat#1%
+ {\ifnum#1<\plusten 0.00\the#1\else
+ \ifnum#1<\plushundred 0.0\the#1\else
+ \ifnum#1<\plusthousand 0.\the#1\else
+ 1.000\fi\fi\fi}
+
+\def\dodoformatcolor#1%
+ {\colordimen#1\points\relax
+ \ifdim\colordimen>\onepoint
+ \colordimen\onepoint
+ \fi
+ \multiply\colordimen \plusthousand
+ \colorcount\colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard \relax
+ \realcolorformat\colorcount}
+
+\def\doformatcolorR#1:#2:#3:#4:#5\od
+ {\dodoformatcolor{#1}\colorformatseparator
+ \dodoformatcolor{#2}\colorformatseparator
+ \dodoformatcolor{#3}}
+
+\def\doformatcolorC#1:#2:#3:#4:#5:#6\od
+ {\dodoformatcolor{#1}\colorformatseparator
+ \dodoformatcolor{#2}\colorformatseparator
+ \dodoformatcolor{#3}\colorformatseparator
+ \dodoformatcolor{#4}}
+
+\def\doformatcolorS#1:#2:#3\od
+ {\dodoformatcolor{#1}}
+
+\def\doformatcolorP#1:#2:#3:#4:#5:#6\od
+ {#1\colorformatseparator
+ \dodoformatcolor{#2}\colorformatseparator
+ \dodoformatcolor{#3}\colorformatseparator
+ \dodoformatcolor{#4}\colorformatseparator}
+
+\def\doformatcolor#1:%
+ {\csname doformatcolor#1\endcsname}
+
+\def\colorvalue
+ {\dowithcolor\doformatcolor}
+
+\def\doformatgrayR#1:#2:#3:#4:#5\od
+ {\convertRGBtoGRAY{#1}{#2}{#3}%
+ \dodoformatcolor\@@cl@@s}
+
+\def\doformatgrayC#1:#2:#3:#4:#5:#6\od
+ {\convertCMYKtoGRAY{#1}{#2}{#3}{#4}%
+ \dodoformatcolor\@@cl@@s}
+
+\def\doformatgrayS#1:#2:#3\od
+ {\dodoformatcolor{#1}}
+
+% \def\doformatgrayP#1:#2:#3:#4:#5:#6\od
+% {\convertSPOTtoGRAY{#1}{#2}{#3}{#4}%
+% \dodoformatcolor\@@cl@@s}
+
+\def\doformatgrayP#1:#2:#3:#4:#5:#6\od
+ {todo}
+
+\def\doformatgray#1:%
+ {\csname doformatgray#1\endcsname}
+
+\def\grayvalue
+ {\dowithcolor\doformatgray}
+
+%D \macros
+%D {localstartraster,localstopraster,
+%D startraster,stopraster}
+%D
+%D The previous conversions are not linear and treat each color
+%D component according to human perception curves. Pure gray
+%D (we call them rasters) has equal color components. In
+%D \CONTEXT\ rasters are only used as backgrounds and these
+%D don't cross page boundaries in the way color does. Therefore
+%D we don't need stacks and marks. Just to be compatible with
+%D color support we offer both 'global' and 'local' commands.
+%D
+%D \starttyping
+%D \def\localstartraster[#1]%
+%D {\doifelsenothing{#1}
+%D {\dostartgraymode\@@rsscreen}
+%D {\dostartgraymode{#1}}}
+%D
+%D \def\localstopraster
+%D {\dostopgraymode}
+%D
+%D \let\startraster\localstartraster
+%D \let\stopraster \localstopraster
+%D \stoptyping
+%D
+%D The next alternative is slower, since it works on top of the
+%D color (stack) mechanism, but it does provide nesting.
+
+\def\dosetrastercolor#1%
+ {\edef\@@cl@@s{#1}%
+ \ifx\@@cl@@s\empty
+ \let\@@cl@@s\@@rsscreen
+ \fi
+ \let\@@cl@@t\@@cl@@z % else we get rogue
+ \let\@@cl@@a\@@cl@@z % transpancies
+ \setevalue{\??cr\??rs}{\colorSpattern}}
+
+% beware, don't add extra grouping, else color in tables
+% fails
+
+\def\localstartraster[#1]%
+ {\ifincolor\dosetrastercolor{#1}\localstartcolor[\??rs]\fi}
+
+\def\startraster[#1]%
+ {\ifincolor\dosetrastercolor{#1}\startcolor[\??rs]\fi}
+
+\def\localstopraster{\ifincolor\localstopcolor\fi}
+\def\stopraster {\ifincolor\stopcolor\fi}
+
+\def\raster[#1]{\groupedcommand{\startraster[#1]}{\stopraster}}
+
+%D Palets use an auxiliary macro:
+
+\def\dodefinepaletcolor#1#2#3%
+ {\doifassignmentelse{#3}
+ {% == \definepalet[test][xx={y=.4}]
+ \definecolor[\??pa#1:#2][#3]%
+ \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{\??cr#1:#2}{\csname\??cr\??pa#1:#2\endcsname}}
+ {% == \definepalet[test][xx=green]
+ \doifdefinedelse{\??cr#3}
+ {\iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{\??cr#1:#2}{\csname\??cr#3\endcsname}}
+ {\letvalue{\??cr#1:#2}\colorXpattern}}}
+
+%D \MP\ related conversions:
+
+\def\scaledMPcolor#1#2%
+ {\ifMPgraphics
+ \handlecolorwith\doMPcolor
+ \csname\??cr
+ \ifcsname\??cr\currentpalet#2\endcsname\currentpalet\fi
+ #2\endcsname
+ :::::::\end#1\end
+ \else
+ #2%
+ \fi}
+
+\def\MPcolor{\scaledMPcolor1}
+
+%D Before we had transparency available, the following
+%D conversion macro was available:
+%D
+%D \starttyping
+%D \def\doMPcolor#1:#2:#3:#4:#5:#6:#7:#8\end
+%D {\if #1R(#2,#3,#4)%
+%D \else\if#1C\ifMPcmykcolors cmyk(#2,#3,#4,#5)\else(1-#2-#5,1-#3-#5,1-#4-#5)\fi
+%D \else\if#1S(#2,#2,#2)%
+%D \else (0,0,0)%
+%D \fi\fi\fi}
+%D \stoptyping
+%D
+%D In order to be useful, this macro is to be fully
+%D expandabele.
+
+\def\doMPcolor#1:% #1 can be \relax ! ! ! i.e. an empty color
+ {\csname MPc\@EA\ifx\csname MPc\string#1\endcsname\relax B\else#1\fi\endcsname}
+
+\def\MPcR{\doMPrgb}
+\def\MPcC{\ifMPcmykcolors\@EA\doMPcmykY\else\@EA\doMPcmykN\fi}
+\def\MPcS{\doMPgray}
+\def\MPcP{\ifMPspotcolors\@EA\doMPspotY\else\@EA\doMPspotN\fi}
+\def\MPcB{\doMPblack}
+
+\def\transparentMP {transparent}
+\def\cmykMP {scaledcmyk}
+\def\cmykASrgbMP {scaledcmykasrgb} % not really needed any more
+\def\rgbMP {scaledrgb}
+\def\grayMP {scaledgray}
+\def\spotMP {spotcolor}
+
+\def\doMPtransparent#1#2:#3:#4\end
+ {\ifcase#2\space(#1)\else\transparentMP(#2,#3,(#1))\fi}
+
+\def\doMPgray#1:#2\end#3\end
+ {\doMPtransparent{\grayMP(#1,#3)}#2\end}
+
+\def\doMPrgb#1:#2:#3:#4\end#5\end
+ {\doMPtransparent{\rgbMP(#1,#2,#3,#5)}#4\end}
+
+\def\doMPcmykY#1:#2:#3:#4:#5\end#6\end
+ {\doMPtransparent{\cmykMP(#1,#2,#3,#4,#6)}#5\end}
+
+\def\doMPcmykN#1:#2:#3:#4:#5\end#6\end
+ {\doMPtransparent{\cmykASrgbMP(#1,#2,#3,#4,#6)}#5\end}
+
+\def\doMPspotY#1:#2:#3:#4:#5\end#6\end % best make #3 same as #1 when empty
+ {\doMPtransparent{multitonecolor("#1",#2,"#3","#4")}#5\end}
+
+\def\doMPspotN#1:#2:#3:#4:#5\end#6\end
+ {\scaledMPcolor{#4}{#1}}
+
+\def\doMPblack#1\end#2\end
+ {\unknownMPcolor}
+
+\def\unknownMPcolor
+ {(0,0,0)}
+
+\let\processMP\spotMP % for some time, will become obsolete, brrr
+
+%D \PDF\ related conversions:
+
+\def\PDFcolor #1{\handlecolorwith\doPDFcolor \csname\??cr#1\endcsname:::::::\end}
+\def\PDFcolorvalue#1{\handlecolorwith\doPDFcolorvalue\csname\??cr#1\endcsname:::::::\end}
+\def\FDFcolor #1{\handlecolorwith\doFDFcolor \csname\??cr#1\endcsname:::::::\end}
+
+\def\doPDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
+ {\if #1R#2 #3 #4 rg%
+ \else\if#1C#2 #3 #4 #5 k%
+ \else\if#1S#2 g%
+ \else\if#1P#5 g%
+ \else 0 g%
+ \fi\fi\fi\fi}
+
+\def\doPDFcolorvalue#1:#2:#3:#4:#5:#6:#7:#8\end
+ {\if #1R#2 #3 #4%
+ \else\if#1C#2 #3 #4 #5%
+ \else\if#1S#2%
+ \else\if#1P#5%
+ \else 0%
+ \fi\fi\fi\fi}
+
+\def\doFDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
+ {[\if #1R#2 #3 #4%
+ \else\if#1C#2 #3 #4 #5%
+ \else\if#1S#2%
+ \else\if#1P#5%
+ \else 0%
+ \fi\fi\fi\fi]}
+
+\def\internalspotcolorname#1{\handlecolorwith\dointernalspotcolorname\csname\??cr#1\endcsname:::::::\end}
+\def\internalspotcolorsize#1{\handlecolorwith\dointernalspotcolorsize\csname\??cr#1\endcsname:::::::\end}
+
+\def\dointernalspotcolorname#1:#2:#3:#4:#5:#6:#7:#8\end{\if#1P\ifcase0#3 #1\else#2\fi\else#1\fi}
+\def\dointernalspotcolorsize#1:#2:#3:#4:#5:#6:#7:#8\end{\if#1P\ifcase0#3 0\else#3\fi\else 0\fi}
+
+%D Slow but ok \unknown
+
+\def\colorcomponents#1% might be broken
+ {\startnointerference
+ \localcolortrue
+ \globallet\thecolorcomponents\empty
+ \def\doexeccolorR ##1:##2:##3:##4:##5\od{\gdef\thecolorcomponents{r=\twodigitrounding{##1} g=\twodigitrounding{##2} b=\twodigitrounding{##3}}}%
+ \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\gdef\thecolorcomponents{c=\twodigitrounding{##1} m=\twodigitrounding{##2} y=\twodigitrounding{##3} k=\twodigitrounding{##4}}}%
+ \def\doexeccolorS ##1:##2:##3\od{\gdef\thecolorcomponents{s=\twodigitrounding{##1}}}%
+ \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\gdef\thecolorcomponents{p=\twodigitrounding{##4} n=##1}}%
+ \let\doexeccolorPindex\doexeccolorP
+ \backgroundline[#1]{}%
+ \stopnointerference
+ \thecolorcomponents}
+
+\def\transparencycomponents#1%
+ {\startnointerference
+ \localcolortrue
+ \globallet\thetransparencycomponents\empty
+ \def\doexeccolorR ##1:##2:##3:##4:##5\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##4} t=\twodigitrounding{##5}}}%
+ \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##5} t=\twodigitrounding{##6}}}%
+ \def\doexeccolorS ##1:##2:##3\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##2} t=\twodigitrounding{##3}}}%
+ \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##5} t=\twodigitrounding{##6}}}%
+ \let\doexeccolorPindex\doexeccolorP
+ \backgroundline[#1]{}%
+ \stopnointerference
+ \thetransparencycomponents}
+
+%D \macros
+%D {everyshapebox}
+%D
+%D A terrible hack, needed because we cannot have marks in
+%D shape boxes.
+
+\appendtoks \localcolortrue \to \everyshapebox
+
+\protect \endinput
diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv
new file mode 100644
index 000000000..7f79cdfad
--- /dev/null
+++ b/tex/context/base/colo-ini.mkiv
@@ -0,0 +1,370 @@
+%D \module
+%D [ file=colo-ini,
+%D version=2007.08.08,
+%D title=\CONTEXT\ Color 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.
+
+\unprotect
+
+\chardef\colorversion=2
+
+% todo: palets in definecolor
+% todo: {\red xx} vs \red{xx}
+
+% check: registerusedspotcolors
+% check: registerusedcolorchannels
+% check: \currentcolorname
+% check: \outercolorname
+% check: \chardef\currentcolorchannel=0
+% check: \startcolormode
+% check: \newif\iffilterspotcolor \filterspotcolorfalse
+% check: \newif\ifdoingspotcolor \doingspotcolorfalse
+% check: \registercolorchannel
+
+% \def\mptexcolor#1{"\dogetattributeid\s!color \somecolorattribute{#1} A"}
+%
+% \startMPpage
+% fill fullcircle scaled 10cm ;
+% fill fullcircle scaled 5cm withprescript \mptexcolor{red} withpostscript \mptexcolor{black} ;
+% fill fullcircle scaled 3cm ;
+% draw btex test etex withprescript \mptexcolor{blue} ;
+% \stopMPpage
+
+\registerctxluafile{colo-ini}{1.000}
+
+\ifx\currentcolormodel\undefined \newcount\currentcolormodel \fi
+
+\def\setcolormodel#1%
+ {\currentcolormodel\ctxlua{tex.print(colors.setmodel('colormodel','#1'))}%
+ \dosetattribute{colormodel}{\the\currentcolormodel}}
+
+\setcolormodel{all}
+
+\def\dosetupcolormodel
+ {\ifincolor
+ \ifRGBsupported
+ \ifCMYKsupported
+ \setcolormodel{all}%
+ \else
+ \setcolormodel{rgb}%
+ \fi
+ \else
+ \ifCMYKsupported
+ \setcolormodel{cmyk}%
+ \else
+ \setcolormodel{gray}%
+ \fi
+ \fi
+ \else
+ \setcolormodel{gray}%
+ \fi}
+
+\appendtoks
+ \dosetupcolormodel
+\to \everyjob
+
+% Currently in mkiv transparency is implemented independent of color. This costs
+% a bit more processing time but gives the possibility to apply transparency
+% independently in the future. Is this useful? If not we may as well combine them
+% again in the future. 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.
+
+% Since we couple definitions, we could stick to one test. Todo. Same for mpcolor.
+
+% \def\doactivatecolor#1% : in currentpalet, maybe not, ugly
+% {\ifcsname(cs:\currentpalet#1)\endcsname
+% \csname(cs:\currentpalet#1)\endcsname
+% \csname(ts:\currentpalet#1)\endcsname
+% \else
+% \csname(cs:#1)\endcsname
+% \csname(ts:#1)\endcsname
+% \fi}
+
+% \def\doactivatecolor#1% : in currentpalet, maybe not, ugly
+% {\csname(cs:\ifcsname(cs:\currentpalet#1)\endcsname\currentpalet\fi#1)\endcsname}
+% \csname(ts:\ifcsname(ts:\currentpalet#1)\endcsname\currentpalet\fi#1)\endcsname}
+%
+% more robust test, else we get \relaxed non-colors which may confuse e.g. mpcolor
+
+\letvalue{(cs:-}\empty
+\letvalue{(ts:-}\empty
+
+% \def\doactivatecolor#1% : in currentpalet, maybe not, ugly
+% {\csname(cs:\ifcsname(cs:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(cs:#1)\endcsname#1\else-\fi\fi)\endcsname
+% \csname(ts:\ifcsname(ts:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ts:#1)\endcsname#1\else-\fi\fi)\endcsname}
+
+\def\doactivatecolor#1% : in currentpalet, maybe not, ugly
+ {\ifcsname(cs:\currentpalet#1)\endcsname
+ \csname(cs:\currentpalet#1)\endcsname
+ \csname(ts:\currentpalet#1)\endcsname
+ \else\ifcsname(cs:#1)\endcsname
+ \csname(cs:#1)\endcsname
+ \csname(ts:#1)\endcsname
+ \fi\fi}
+
+\let\normaldoactivatecolor\doactivatecolor
+
+% if it becomes a bottleneck we can set up a more complex system with one shared
+% attribute for colorspace, color and transparency
+
+\def\doactivatecolor
+ {\ifproductionrun
+ \ctxlua{colors.enabled=true transparencies.enabled=true}% not that efficient but at least robust
+ \let\doactivatecolor\normaldoactivatecolor
+ \expandafter\doactivatecolor
+ \else
+ \expandafter\normaldoactivatecolor
+ \fi}
+
+\def\deactivatecolor
+ {\doresetattribute\s!color
+ \doresetattribute\s!transparency}
+
+\def\dodefinecolorcommand#1#2%
+ {\unexpanded#1{#2}{\doactivatecolor{#2}}}
+
+% todo: \allspotcolors
+
+\def\colorlist % not really used, only for colo-run
+ {\ctxlua{tex.sprint(table.concat(table.sortedkeys(attributes.list[attributes.numbers.color]),","))}}
+
+\def\dodefinecolor[#1][#2]%
+ {%\addtocommalist{#1}\colorlist
+ \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ \dodefinecolorcommand\setvalue{#1}}
+
+\def\dodefineglobalcolor[#1][#2]%
+ {%\doglobal\addtocommalist{#1}\colorlist
+ \ctxlua{ctx.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}%
+ \dodefinecolorcommand\setgvalue{#1}}
+
+\def\dodefinenamedcolor[#1][#2]%
+ {%\doglobal\addtocommalist{#1}\colorlist
+ \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ \dodefinecolorcommand\setvalue{#1}}
+
+\def\dodefinespotcolor[#1][#2][#3]%
+ {%\doglobal\addtocommalist{#1}\colorlist % optional
+ \doglobal\addtocommalist{#2}\allspotcolors
+ \ctxlua{ctx.definespotcolor("#1","#2","#3",true)}%
+ \dodefinecolorcommand\setxvalue{#1}}
+
+\def\dodefinemultitonecolor[#1][#2][#3][#4]%
+ {\ctxlua{ctx.definemultitonecolor("#1","#2","#3","#4",true)}%
+ \dodefinecolorcommand\setxvalue{#1}}
+
+\def\dodefinetransparency[#1][#2]%
+ {\ctxlua{ctx.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))}}}
+
+\def\doifcolorelse#1%
+ {\ifcsname(ca:\currentpalet#1)\endcsname
+ \@EA\firstoftwoarguments
+ \else\ifcsname(ca:#1)\endcsname
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi\fi}
+
+\def\doifcolor#1%
+ {\ifcsname(ca:\currentpalet#1)\endcsname
+ \@EA\firstofoneargument
+ \else\ifcsname(ca:#1)\endcsname
+ \@EAEAEA\firstofoneargument
+ \else
+ \@EAEAEA\gobbleoneargument
+ \fi\fi}
+
+% currentcolor, then we can push pop in register
+
+ \def\switchtocolor [#1]{\getvalue{#1}}
+\unexpanded\def\color [#1]{\groupedcommand{\doactivatecolor{#1}}{}}
+\unexpanded\def\startcolor [#1]{\begingroup\doactivatecolor{#1}}
+\unexpanded\def\stopcolor {\endgroup}
+\unexpanded\def\graycolor [#1]{\groupedcommand{\setcolormodel{gray}\getvalue{#1}}{}}
+\unexpanded\def\colored [#1]{\groupedcommand{\definecolor[@colored@][#1]\doactivatecolor{@colored@}}{}}
+ \def\predefinecolor [#1]{\flushatshipout{\hbox{\color[#1]{}}}}
+ \def\predefineindexcolor[#1]{\flushatshipout{\hbox{\color[#1]{}}}}
+ \def\startcolorpage {\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}
+ \def\stopcolorpage {\stopcolor}
+ \def\localstartraster [#1]{\dosetrastercolor{#1}}
+ \def\localstopraster {}
+ \def\startraster [#1]{\dosetrastercolor{#1}}
+ \def\stopraster {}
+ \def\raster [#1]{\groupedcommand{\dosetrastercolor{#1}}{}}
+ \def\faststartcolor [#1]{\doactivatecolor{#1}}
+ \def\faststopcolor {}
+\unexpanded\def\dosetcolorattribute#1#2{\ifcsname#1#2\endcsname\doactivatecolor{\csname#1#2\endcsname}\fi}
+
+% more efficient:
+
+\unexpanded\def\colored[#1]%
+ {\ctxlua{ctx.defineprocesscolor("@colored@","#1",false,false)}%
+ \groupedcommand{\doactivatecolor{@colored@}}{}}
+
+\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}
+
+% \def\pushpostponedpagecolor
+% {\edef\savedtopofpagecolor{\topofpagecolor}%
+% \doifsomething\savedtopofpagecolor\restorecolormode}
+%
+% \def\poppostponedpagecolor
+% {\doifsomething\savedtopofpagecolor\doactivatecolor\savedtopofpagecolor}
+%
+% no \topofpagecolor
+
+\let\pushpostponedpagecolor\relax
+\let\poppostponedpagecolor \relax
+
+% \def\pushcolor
+% {\edef\popcolor
+% {\dosetattribute\s!color {\dogetattribute\s!color }%
+% \dosetattribute\s!transparency{\dogetattribute\s!transparency}}%
+% \let\popsplitcolor\popcolor
+% \deactivatecolor}
+
+\appendtoks\deactivatecolor\to\everybeforeoutput % maybe we don't need push pop now
+
+\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\grey \graycolor
+\let\localstartcolor \startcolor
+\let\localstopcolor \stopcolor
+\let\globalstartcolor\startcolor
+\let\globalstopcolor \stopcolor
+
+\def\registermaintextcolor{\ctxlua{colors.main = \thecolorattribute\maintextcolor}}
+
+\def\starttextcolor[#1]%
+ {\doifsomething{#1}
+ {\definecolor[\@@themaintextcolor][#1]%
+ \let\maintextcolor\@@themaintextcolor
+ \doactivatecolor\maintextcolor
+ \registermaintextcolor}}
+
+\let\stoptextcolor\relax
+
+\def\initializemaintextcolor
+ {\doifelsenothing\@@cltextcolor
+ {\definecolor[\@@themaintextcolor][\defaulttextcolor]}
+ {\definecolor[\@@themaintextcolor][\@@cltextcolor]}%
+ \let\maintextcolor\@@themaintextcolor
+ \doactivatecolor\maintextcolor
+ \registermaintextcolor}
+
+\appendtoks \initializemaintextcolor \to \everyjob
+
+\def\localstarttextcolor{\expanded{\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]%
+ \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(cs:#1:#2)}{\csname(cs:\??pa#1:#2)\endcsname}%
+ \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(ca:#1:#2)}{\csname(ca:\??pa#1:#2)\endcsname}}
+ {\doifdefinedelse{(cs:#3)}% \definepalet[test][xx=green]
+ {\iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(cs:#1:#2)}{\csname(cs:#3)\endcsname}%
+ \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(ca:#1:#2)}{\csname(ca:#3)\endcsname}}
+ {\letvalue{(cs:#1:#2)}\undefined
+ \letvalue{(ca:#1:#2)}\undefined}}}
+
+\setvalue{(cs:)}{} \setvalue{(ca:)}{0}
+\setvalue{(ts:)}{} \setvalue{(ta:)}{0}
+
+\def\doinheritca#1{\csname(ca:\ifcsname(ca:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ca:#1)\endcsname#1\fi\fi)\endcsname}
+\def\doinheritcs#1{\csname(cs:\ifcsname(cs:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(cs:#1)\endcsname#1\fi\fi)\endcsname}
+\def\doinheritta#1{\csname(ta:\ifcsname(ta:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ta:#1)\endcsname#1\fi\fi)\endcsname}
+\def\doinheritts#1{\csname(ts:\ifcsname(ts:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ts:#1)\endcsname#1\fi\fi)\endcsname}
+
+\def\MPcolor#1{\ctxlua{tex.sprint(ctx.mpcolor(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}}
+
+\def\currentcolorname{\s!black} % todo
+\def\outercolorname {\s!black} % todo
+
+\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"))}}
+
+% \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\doifblackelse #1{\ctxlua{commands.doifelse(ctx.isblack(\thecolorattribute{#1}))}}
+\def\doifdrawingblackelse {\ctxlua{commands.doifelse(ctx.isblack(tex.attribute[attributes.numbers['color']]))}}
+
+% 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}
+
+\protect \endinput
+
+% \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
diff --git a/tex/context/base/colo-ini.tex b/tex/context/base/colo-ini.tex
index 0b43ca3dd..0136596a5 100644
--- a/tex/context/base/colo-ini.tex
+++ b/tex/context/base/colo-ini.tex
@@ -1,6 +1,6 @@
%D \module
%D [ file=colo-ini,
-%D version=1997.04.01,
+%D version=2007.08.08,
%D title=\CONTEXT\ Color Macros,
%D subtitle=Initialization,
%D author=Hans Hagen,
@@ -11,59 +11,13 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\writestatus{loading}{Context Color Macros / initialization}
-
-%D Possible optimization: store level in mark instead of name
+%D We need to clean this up further but first we hav eto make sure that mkiv
+%D code works ok.
-\unprotect
+\writestatus{loading}{Context Color Macros / initialization}
-%D Color support is not present in \TEX. Colorful output can
-%D however be accomplished by using specials. This also means
-%D that this support depends on the \DVI\ driver used. At the
-%D moment this module was written, still no decent standard on
-%D color specials has been agreed upon. We therefore decided to
-%D implement a mechanism that is as independant as possible of
-%D drivers.
-%D
-%D Color support shares with fonts that is must be implemented
-%D in a way that permits processing of individual \DVI\ pages.
-%D Furthermore it should honour grouping. The first condition
-%D forces us to use a scheme that keeps track of colors at
-%D page boundaries. This can be done by means of \TEX's
-%D marking mechanism (\type{\mark}).
-%D
-%D When building pages, \TEX\ periodically looks at the
-%D accumulated typeset contents and breaks the page when
-%D suitable. At that moment, control is transfered to the
-%D output routine. This routine takes care of building the
-%D pagebody and for instance adds headers and footers. The page
-%D can be broken in the middle of some colored text, but
-%D headers and footers are often in black upon white or
-%D background. If colors are applied there, they definitely
-%D are used local, which means that they don't cross page
-%D borders.
-%D
-%D Boxes are handled as a whole, which means that when we
-%D apply colors inside a box, those colors don't cross page
-%D boundaries, unless of course boxes are split or unboxed.
-%D Especially in interactive texts, colors are often used in
-%D such a local way: in boxes (buttons and navigational tools)
-%D or in the pagebody (backgrounds).
-%D
-%D So we can distinguish local colors, that don't cross
-%D pages from global colors, of which we can end many pages
-%D later. The color macros will treat both types in a different
-%D way, thus gaining some speed.
-%D
-%D This module also deals with gray scales. Because similar
-%D colors can end up in the same gray scale when printed in
-%D black and white, we also implement a palet system that deals
-%D with these matters. Because of fundamental differences
-%D between color and gray scale printing, in \CONTEXT\ we also
-%D differ between these. For historic reasons |<|we first
-%D implemented gray scales using patterns of tiny periods|>|
-%D and therefore called them {\em rasters}. So don't be
-%D surprised if this term shows up.
+%D This module implements color. Since \MKII\ and \MKIV\ use a completely
+%D different approach, this module only implements a few generic mechanisms.
\startmessages dutch library: colors
title: kleur
@@ -193,6 +147,10 @@
12: -- est enregistré
\stopmessages
+\unprotect
+
+\chardef\colorversion=1 % temp, needed for tracing purposes, mkiv transition
+
%D We use a couple of local registers. That way we don't have
%D to group when converting colors. By the way, this is not
%D really faster. We can sqeeze half a second runtime for 50K
@@ -203,407 +161,6 @@
\newdimen\colordimen
\newcount\colorcount
-%D \macros
-%D {definecolor}
-%D
-%D We will enable users to specify colors in \cap{RGB} and
-%D \cap{CMYK} color spaces or gray scales using
-%D
-%D \showsetup{definecolor}
-%D
-%D For example:
-%D
-%D \starttyping
-%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
-%D \stoptyping
-%D
-%D Such color specifications are saved in a macro in the
-%D following way:
-%D
-%D \starttyping
-%D \setvalue{\??cr name}{R:r:g:b}
-%D \setvalue{\??cr name}{C:c:m:y:k}
-%D \setvalue{\??cr name}{S:s}
-%D \stoptyping
-%D
-%D Gray scales are specified with the \type{s} parameter,
-%D where the \type {s} is derived from {\em screen}.
-%D
-%D Starting with \PDF\ 1.4 (2001) \CONTEXT\ supports
-%D transparent colors. The transparency factor is represented
-%D by a \type {t} and the transparency method by an \type {a}
-%D (alternative). Later we will implement more control
-%D (probably by symbolic methods. So, currently the data is
-%D stored as follows:
-%D
-%D \starttyping
-%D \setvalue{\??cr name}{R:r:g:b:a:t}
-%D \setvalue{\??cr name}{C:c:m:y:k:a:t}
-%D \setvalue{\??cr name}{S:s:a:t}
-%D \stoptyping
-
-% beware: comparisons asked/current on name, not value
-
-\newif\iffreezecolors \freezecolorsfalse
-
-\let\colorlist \empty
-\let\currentspotcolor\empty
-
-\def\@@cl@@z{0}
-\def\@@cl@@o{1}
-
-% \def\@@resetcolorparameters
-% {\let\@@cl@@r\@@cl@@z\let\@@cl@@g\@@cl@@z\let\@@cl@@b\@@cl@@z
-% \let\@@cl@@c\@@cl@@z\let\@@cl@@m\@@cl@@z\let\@@cl@@y\@@cl@@z\let\@@cl@@k\@@cl@@z
-% \let\@@cl@@s\@@cl@@z\let\@@cl@@p\@@cl@@o
-% \let\@@cl@@t\@@cl@@z\let\@@cl@@a\@@cl@@z
-% \let\@@cl@@h\empty \let\@@cl@@n\empty}
-
-% r g b : rbg
-% c m y k : cmyk
-% s : gray
-% p n d f : spot
-% h : hexadecimal
-% t a : transparency
-% e : equivalent (spotcolors)
-
-\def\@@resetcolorparameters
- {\let\@@cl@@r\@@cl@@z \let\@@cl@@g\@@cl@@z \let\@@cl@@b\@@cl@@z
- \let\@@cl@@c\@@cl@@z \let\@@cl@@m\@@cl@@z \let\@@cl@@y\@@cl@@z \let\@@cl@@k\@@cl@@z
- \let\@@cl@@s\@@cl@@z
- \let\@@cl@@p\@@cl@@o \let\@@cl@@n\empty \let\@@cl@@d\empty \let\@@cl@@f\@@cl@@o
- \let\@@cl@@h\empty
- \let\@@cl@@e\empty
- \let\@@cl@@t\@@cl@@z \let\@@cl@@a\@@cl@@z}
-
-\@@resetcolorparameters
-
-\def\@@cl@@A{\@@cl@@a} % a hook for symbolic conversion, see below
-
-%D Handling a few nested \type{\cs}'s is no problem (\type
-%D {\@EA\@EAEAEA\@EA}) but we need a full expansion, so I
-%D tried one of the fully expandable primitives using a sort
-%D of delimited thing. I tried \type {\number} first, but this
-%D does not work, but \type {\romannumeral} does. Actually,
-%D \type{\romannumeral0} returns nothing, so it's a perfect
-%D candidate for this kind of hackery. This reminds me that I
-%D have to look into David Kastrup's Euro\TeX\ 2002 article
-%D because he is using \type {\romannumeral} for loops
-%D (repetitive \quote {m} stuff).
-
-% \def\x{\y}\def\y{\z}\def\z{0:1:1:1}
-%
-% \def\bla #1:#2:#3\end{}
-%
-% \@EA\bla\romannumeral\x\end
-
-\def\colorXpattern{0S:\@@cl@@z:\@@cl@@z:\@@cl@@z}
-\def\colorZpattern{0S:\@@cl@@z:\@@cl@@A:\@@cl@@t}
-\def\colorSpattern{0S:\@@cl@@s:\@@cl@@A:\@@cl@@t}
-\def\colorCpattern{0C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k:\@@cl@@A:\@@cl@@t}
-\def\colorRpattern{0R:\@@cl@@r:\@@cl@@g:\@@cl@@b:\@@cl@@A:\@@cl@@t}
-
-%def\colorPpattern{0P:\@@cl@@n:\@@cl@@p:\@@cl@@A:\@@cl@@t}
-
-\def\colorPpattern{0P:\@@cl@@n:\@@cl@@f:\@@cl@@d:\@@cl@@p:\@@cl@@A:\@@cl@@t}
-
-%D The extra 0 catches empty colors specs (needed for the
-%D \type {\MPcolor} and \type {\PDFcolor} conversion (\type
-%D {\@@cr} equals \type {\relax}!).
-
-\def\handlecolorwith#1{\@EA#1\romannumeral0}
-
-%D Next comes the main definition macro.
-
-\def\definecolor {\dodoubleargument\dodefinecolor}
-\def\defineglobalcolor{\dodoubleargument\dodefineglobalcolor}
-\def\definenamedcolor {\dodoubleargument\dodefinenamedcolor}
-
-\def\dodefinecolor {\dododefinecolor\relax \setvalue \setevalue1}
-\def\dodefineglobalcolor{\dododefinecolor\doglobal\setgvalue\setxvalue1}
-\def\dodefinenamedcolor {\dododefinecolor\doglobal\setvalue \setevalue0}
-
-\def\dododefinecolor#1#2#3#4[#5][#6]% #2==set(g)value #3==set[e|x]value -- maybe add fake [#7] here
- {#1\addtocommalist{#5}\colorlist % optional
- \doifassignmentelse{#6}
- {\@@resetcolorparameters
- \getparameters[\??cl @@][#6]%
- \ifx\@@cl@@h\empty
- \doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k}{\@@cl@@z\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse\@@cl@@s\@@cl@@z
- {\showmessage\m!colors8{{[#6]},#5}%
- #3{\??cr#5}{\colorZpattern}}
- {#3{\??cr#5}{\colorSpattern}}}
- {#3{\??cr#5}{\colorCpattern}}}
- {#3{\??cr#5}{\colorRpattern}}%
- \else
- \setxvalue{\??cr#5}{\colorHpattern}%
- \fi
- % new: e=external spot color name
- \ifx\@@cl@@e\empty \else
- \doregisterspotcolorname{#5}\@@cl@@e
- \fi}
- {\doifelsenothing\currentpalet
- \donefalse
- {\doifdefinedelse{\??cr\currentpalet#6}\donetrue\donefalse}%
- \ifdone
- \doifnot{#5}{#6}
- {#2{\??cr#5}{\paletcolorspec{#6}}}%
- \else
- \doifdefinedelse{\??cr#6}
- {\doifelse{#5}{#6}
- {% this way we can freeze \definecolor[somecolor][somecolor]
- % and still prevent cyclic definitions
- \iffreezecolors#3{\??cr#5}{\csname\??cr#6\endcsname}\fi}
- {\iffreezecolors\@EA#3\else\@EA#2\fi{\??cr#5}{\csname\??cr#6\endcsname}}}
- {\showmessage\m!colors3{#5 (def)}}%
- \fi}%
- \ifcase#4\or
- \unexpanded#2{#5}{\switchtocolor[#5]}% \unexpanded toegevoegd
- \fi}
-
-\def\paletcolorspec#1%
- {\csname\??cr\currentpalet#1\endcsname}
-
-%D Hex color support is not enabled by default. You need to say \type
-%D {\setupcolor [hex]} to get this working.
-
-\ifx\colorHpattern\undefined \let\colorHpattern\colorZpattern \fi
-
-%D New and experimental.
-
-\let\allspotcolors \empty
-\let\usedspotcolors \empty
-\let\usedcolorchannels\empty
-
-\def\definespotcolor % [name] [color] [p=,t=,a=]
- {\dotripleempty\dodefinespotcolor}
-
-\def\dodefinespotcolor[#1][#2][#3]% todo: always global
- {\doifnot{#1}{#2}
- {\@@resetcolorparameters
-\doglobal\addtocommalist{#1}\colorlist % optional
- \edef\@@cl@@n{#2}%
- \getparameters[\??cl @@][#3]%
- \doifnothing\@@cl@@p{\let\@@cl@@p\!!plusone}%
- \ifx\@@cl@@e\empty \else
- \doregisterspotcolorname{#2}\@@cl@@e
- \fi
- \doglobal\addtocommalist{#2}\allspotcolors
- \setxvalue{\??cr#1}{\colorPpattern}% was \setevalue
- \setgvalue{#1}{\switchtocolor[#1]}}} % was \setvalue
-
-\def\registerusedspotcolors
- {\ifx\allspotcolors\empty \else
- \bgroup
- \let\usedspotcolors\empty
- \def\docommand##1%
- {\doifdefined{\??cs##1}{\addtocommalist{##1}\usedspotcolors}}%
- \processcommacommand[\allspotcolors]\docommand
- \savecurrentvalue\usedspotcolors\usedspotcolors
- \egroup
- \fi}
-
-\def\registerusedcolorchannels
- {\bgroup
- \doifdefinedelse{\??cs c}
- {\def\usedcolorchannels{c,m,y,k}}%
- {\let\usedcolorchannels\empty}%
- \doifdefined{\??cs r}
- {\addtocommalist{r,g,b}\usedcolorchannels}%
- \doifdefined{\??cs s}
- {\ExpandBothAfter\doifnotinset{k}\usedcolorchannels
- {\addtocommalist{s}\usedcolorchannels}}%
- \savecurrentvalue\usedcolorchannels\usedcolorchannels
- \egroup}
-
-\prependtoks
- \registerusedspotcolors
- \registerusedcolorchannels
-\to \everylastshipout
-
-\def\registerusedspotcolor#1%
- {\global\@EA\chardef\csname\??cs#1\endcsname\zerocount}
-
-%D On top of spotcolors, we define multitone colors. You'd better know
-%D what you're doing because invalid definitions will lead to invalid
-%D documents (i.e.\ resources).
-
-% \definecolor [darkblue] [c=.5,m=.5]
-% \definecolor [darkyellow] [y=.5]
-%
-% \definemultitonecolor [whatever] [darkblue=.5,darkyellow=.5] [c=.25,m=.25,y=.25] [a=1,t=.5]
-% \definemultitonecolor [another] [darkblue=.5,darkyellow=.5] [c=.25,m=.25,y=.25]
-
-\def\definemultitonecolor
- {\doquadrupleempty\dodefinemultitonecolor}
-
-\def\dodefinemultitonecolor[#1][#2][#3][#4]%
- {\let\@@cl@@cl@@D\empty % n's
- \let\@@cl@@cl@@P\empty % p's
- \let\@@cl@@cl@@N\empty % name
- \scratchcounter\zerocount
- \processcommacommand[#2]\dododefinemultitonecolor
- \bgroup
- \lccode`\.=`\_%
- \lccode`\,=`\_%
- \lccode`\:=`\_%
- \lccode`\;=`\_%
- \lccode`\+=`\_%
- \lccode`\-=`\_%
- \lccode`\*=`\_%
- \lccode`\/=`\_%
-% \lccode`\_=`\_%
- % not needed, other attribute in driver:
- %
- % \@@resetcolorparameters
- % \getparameters[#4]%
- % \ifx\@@cl@@t\@@cl@@z\else
- % \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\@@cl@@t_\@@cl@@a}%
- % \fi
- \lowercase\@EA{\@EA\xdef\@EA\@@cleancolor\@EA{\@@cl@@cl@@N}}%
- \egroup
- \setxvalue{\??cl\@@cleancolor\s!check}{\noexpand\docheckmultitonecolor{\@@cl@@cl@@D}}%
- \expanded{\defineglobalcolor[\@@cleancolor][#3,#4]}%
- \expanded{\definespotcolor[#1][\@@cleancolor][#4,f=\the\scratchcounter,p={\@@cl@@cl@@P},d={\@@cl@@cl@@D}]}}
-
-\def\docheckmultitonecolor#1%
- {\flushatshipout
- {\let\checkmultitonecolor\gobbleoneargument
- \def\docommand##1{\hbox{\definecolor[\s!dummy-100][##1][p=1]\color[\s!dummy-100]}}%
- \processcommalist[#1]\docommand}}
-
-\def\checkmultitonecolor#1%
- {\csname\??cl#1\s!check\endcsname\letgvalue{\??cl#1\s!check}\relax}
-
-\def\dodefinespotcolor[#1][#2][#3]% todo: always global (REDEFINED)
- {\doifnot{#1}{#2}
- {\@@resetcolorparameters
-\doglobal\addtocommalist{#1}\colorlist % optional
- \edef\@@cl@@n{#2}%
- \getparameters[\??cl @@][#3]%
- \doifnothing \@@cl@@p{\let\@@cl@@p\!!plusone}%
- \doifsomething\@@cl@@e{\doregisterspotcolorname{#2}\@@cl@@e}%
- \doglobal\addtocommalist{#2}\allspotcolors
- \setxvalue{\??cr#1}{\colorPpattern}% was \setevalue
- \setgvalue{#1}{\switchtocolor[#1]}}}% was \setvalue
-
-\def\dododefinemultitonecolor#1%
- {\advance\scratchcounter\plusone
- \splitstring#1\at=\to\!!stringa\and\!!stringb
- \ifx\@@cl@@cl@@D\empty
- \let\@@cl@@cl@@D\!!stringa
- \let\@@cl@@cl@@P\!!stringb
- \normalizecolor\!!stringb
- \edef\@@cl@@cl@@N{\!!stringa_\!!stringb}%
- \else
- \edef\@@cl@@cl@@D{\@@cl@@cl@@D,\!!stringa}%
- \edef\@@cl@@cl@@P{\@@cl@@cl@@P,\!!stringb}%
- \normalizecolor\!!stringb
- \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\!!stringa_\!!stringb}%
- \fi}
-
-% \def\dododefinemultitonecolor#1% a/b safe
-% {\advance\scratchcounter\plusone
-% \splitstring#1\at=\to\@@cl@@one\and\@@cl@@two
-% \ifx\@@cl@@cl@@D\empty
-% \let\@@cl@@cl@@D\@@cl@@one
-% \let\@@cl@@cl@@P\@@cl@@two
-% \normalizecolor\@@cl@@two
-% \edef\@@cl@@cl@@N{\@@cl@@one_\@@cl@@two}%
-% \else
-% \edef\@@cl@@cl@@D{\@@cl@@cl@@D,\@@cl@@one}%
-% \edef\@@cl@@cl@@P{\@@cl@@cl@@P,\@@cl@@two}%
-% \normalizecolor\@@cl@@two
-% \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\@@cl@@one_\@@cl@@two}%
-% \fi}
-
-%D We now redefine the color definition macro so that you
-%D can define both normal and spotcolors.
-
-%D This messy method will become obsolete in mkiv.
-
-\def\definecolor
- {\dotripleempty\dodefinewhatevercolor}
-
-\def\dodefinewhatevercolor[#1][#2][#3]%
- {\ifthirdargument
- \dodefinespotcolor[#1][#2][#3]% this is the prefered method !
- \else
- \dodefinecolor[#1][#2]%
- \fi}
-
-%D The names of colors are stored in a comma separated list
-%D only for the purpose of showing them with \type {\showcolor}.
-%D
-%D \startbuffer
-%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D \getbuffer
-%D
-%D This color shows up as \color [SomeKindOfRed] {some kind
-%D of red}.
-%D
-%D \starttyping
-%D \setupcolors[state=start]
-%D
-%D \definecolor[mygreen][green]
-%D \definecolor[green][g=.5]
-%D
-%D \startcolor[mygreen]test\stopcolor
-%D
-%D \setupcolors[expansion=no]
-%D
-%D \definecolor[mygreen][green]
-%D \definecolor[green][g=.5]
-%D
-%D \startcolor[mygreen]test\stopcolor
-%D \stoptyping
-
-%D \macros
-%D {setupcolor}
-%D
-%D Color definitions can be grouped in files with the name:
-%D
-%D \starttyping
-%D \f!colorprefix-identifier.tex
-%D \stoptyping
-%D
-%D where \type{\f!colorprefix} is \unprotect {\tttf \f!colorprefix}.
-%D Loading such a file is done by \protect
-%D
-%D \showsetup{setupcolor}
-%D
-%D Some default colors are specified in \type{colo-rgb.tex},
-%D which is loaded into the format by:
-%D
-%D \starttyping
-%D \setupcolor[rgb]
-%D \stoptyping
-
-\let\colorstyle\empty
-
-\def\setupcolor
- {\dosingleargument\dosetupcolor}
-
-\def\dosetupcolor[#1]%
- {\doifnot{#1}\colorstyle
- {\def\colorstyle{#1}%
- \processcommalist[#1]\dodosetupcolor}}
-
-\def\dodosetupcolor#1%
- {\makeshortfilename[\truefilename{\f!colorprefix#1}]%
- \startreadingfile
- \readsysfile\shortfilename
- {\showmessage\m!colors4\colorstyle}
- {\showmessage\m!colors5\colorstyle}%
- \stopreadingfile}
-
-\let\usecolors\setupcolor
-
%D When typesetting for paper, we prefer using the \cap{CMYK}
%D color space, but for on||screen viewing we prefer \cap{RGB}
%D (the previous implementation supported only this scheme).
@@ -631,6 +188,12 @@
\newif\ifpreferGRAY
\newif\ifGRAYprefered
\newif\ifreduceCMYK
+\newif\ifconverttoGRAY
+\newif\ifweightGRAY \weightGRAYtrue
+
+\newif\ifconvertMPcolors
+\newif\ifreduceMPcolors
+\newif\ifforcegrayMPcolors
%D The last boolean controls reduction of \cap{CMYK} to
%D \cap{CMY} colors. When set to true, the black component
@@ -641,490 +204,26 @@
%D while prefering is just a reduction and thus a
%D space||saving option.
-%D The next (internal) switch suppresses duplicate messages.
+\newif\iffreezecolors \freezecolorsfalse
+\newif\ifincolor % true if colors enabled
+\newif\iflocalcolor
-\newif\ifconverttoGRAY
+\let\colorlist \empty
+\let\currentspotcolor \empty
+\let\allspotcolors \empty
+\let\usedspotcolors \empty
+\let\usedcolorchannels\empty
+\let\currentpalet \empty
%D \macros
-%D {startcolormode,stopcolormode,permitcolormode}
-%D
-%D We use \type{\stopcolormode} to reset the color in
-%D whatever color space and do so by calling the corresponding
-%D special. Both commands can be used for fast color
-%D switching, like in colored verbatim,
-
-\newif\ifpermitcolormode \permitcolormodetrue
-
-\def\startregistercolor[#1]%
- {\permitcolormodefalse\startcolor[#1]\permitcolormodetrue}
-
-\def\stopregistercolor
- {\permitcolormodefalse\stopcolor\permitcolormodetrue}
-
-\def\dowithcolor#1#2% #1=\action #2=color
- {\ifincolor\ifpermitcolormode
- \ifcsname\??cr\currentpalet#2\endcsname
- \handlecolorwith#1\csname\??cr\currentpalet#2\endcsname\od
- \else\ifcsname\??cr#2\endcsname
- \handlecolorwith#1\csname\??cr#2\endcsname\od
- \fi\fi
- \fi\fi}
-
-\def\startcolormode % includes \ifincolor\ifpermitcolormode
- {%\dostoptransparency % needed for: {test \trans test \notrans test}
- \conditionalstoptransparency
- \dowithcolor\execcolorRCSP}
-
-\def\stopcolormode
- {\ifincolor\ifpermitcolormode
- \supportedstoptransparency
- \dostopcolormode
- \fi\fi}
-
-\def\restorecolormode
- {\ifincolor\ifpermitcolormode
- \supportedstoptransparency
- \dostopcolormode
- \ifx\maintextcolor\empty \else
- \startcolormode\maintextcolor
- \fi
- \fi\fi}
-
-%D Color modes are entered using the next set of commands.
-%D The \type{\stop} alternatives are implemented in a way
-%D that permits non||grouped use.
+%D {definecolor,defineglobalcolor,definenamedcolor,definespotcolor,definemultitonecolor}
%D
-%D The, for this module redundant, check if we are in color
-%D mode is needed when we use these macros in other modules.
-
-\chardef\currentcolorchannel=0
-
-\newif\iffilterspotcolor \filterspotcolorfalse
-\newif\ifdoingspotcolor \doingspotcolorfalse
-
-\def\registercolorchannel#1%
- {\ifdoingspotcolor \else
- \global\expandafter\chardef\csname\??cs#1\endcsname\zerocount
- \fi}
-
-\def\execcolorRCSP#1:%
- {\csname execcolor#1\endcsname}
-
-\def\execcolorR
- {\iffilterspotcolor
- \@EA\noexeccolorR
- \else
- \@EA\doexeccolorR
- \fi}
-
-\def\execcolorC
- {\iffilterspotcolor
- \@EA\noexeccolorC
- \else
- \@EA\doexeccolorC
- \fi}
-
-\def\execcolorS
- {\iffilterspotcolor
- \@EA\noexeccolorS
- \else
- \@EA\doexeccolorS
- \fi}
-
-\def\execcolorP
- {\iffilterspotcolor
- \@EA\doexeccolorPP
- \else\ifcase\currentcolorchannel
- \@EAEAEA\doexeccolorP
- \else
- \@EAEAEA\noexeccolorP
- \fi\fi}
-
-\def\doexeccolorR#1:#2:#3:%
- {\edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
- \ifpreferGRAY\ifx\@@cl@@r\@@cr@@g\ifx\@@cl@@r\@@cl@@b
- \GRAYpreferedtrue
- \fi\fi\fi
- \ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
- \ifGRAYprefered
- \registercolorchannel\c!s
- \let\@@cl@@s\@@cl@@r
- \normalizeGRAY
- \doexeccolorgray
- \else\ifRGBsupported
- \registercolorchannel\c!r
- \normalizeRGB
- \doexeccolorrgb
- \else\ifCMYKsupported
- \registercolorchannel\c!c
- \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
- \normalizeCMYK
- \doexeccolorcmyk
- \else
- \registercolorchannel\c!s
- \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
- \normalizeGRAY
- \doexeccolorgray
- \fi\fi\fi
- \exectransparency}
-
-\def\doexeccolorC#1:#2:#3:#4:%
- {\edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
- \ifpreferGRAY\ifx\@@cl@@k\@@cl@@z\ifx\@@cl@@c\@@cr@@m\ifx\@@cl@@c\@@cl@@y
- \GRAYpreferedtrue
- \fi\fi\fi\fi
- \ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
- \ifGRAYprefered
- \registercolorchannel\c!s
- \let\@@cl@@s\@@cl@@c
- \normalizeGRAY
- \doexeccolorgray
- \else\ifCMYKsupported
- \registercolorchannel\c!c
- \ifreduceCMYK
- \convertCMYKtoCMY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \fi
- \normalizeCMYK
- \doexeccolorcmyk
- \else\ifRGBsupported
- \registercolorchannel\c!r
- \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \normalizeRGB
- \doexeccolorrgb
- \else
- \registercolorchannel\c!s
- \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \normalizeGRAY
- \doexeccolorgray
- \fi\fi\fi
- \exectransparency}
-
-\def\doexeccolorS#1:%
- {\edef\@@cl@@s{#1}%
- \registercolorchannel\c!s
- \normalizeGRAY
- \doexeccolorgray
- \exectransparency}
-
-% \def\doexeccolorP#1:#2:%
-% {\edef\@@cl@@n{#1}%
-% \edef\@@cl@@p{#2}%
-% \registerusedspotcolor\@@cl@@n
-% \ifSPOTsupported
-% \dowithcolor\registerspotcolor\@@cl@@n
-% \dostartspotcolormode\@@cl@@n\@@cl@@p
-% \else
-% \doingspotcolortrue
-% \let\spotcolorfactor\@@cl@@p
-% \factorizecolortrue % using counter and array
-% \dowithcolor\execcolorRCSP\@@cl@@n
-% \factorizecolorfalse
-% \let\spotcolorfactor\@@cl@@o
-% \doingspotcolorfalse
-% \fi
-% \exectransparency}
-
-\def\doexeccolorP#1:#2:#3:#4:%
- {\edef\@@cl@@n{#1}% name
- \edef\@@cl@@f{#2}% fractions
- \edef\@@cl@@d{#3}% definitions
- \edef\@@cl@@p{#4}%
- \ifx\@@cl@@d\empty
- \let\@@cl@@d\@@cl@@n
- \fi
- \registerusedspotcolor\@@cl@@n
- \ifSPOTsupported
- \checkmultitonecolor\@@cl@@n
- \dowithcolor\registerspotcolor\@@cl@@n
- \dostartspotcolormode\@@cl@@n\@@cl@@p
- \else
- \doingspotcolortrue
- \normalizespotcolor\@@cl@@p
- \let\spotcolorfactor\@@cl@@p
- \factorizecolortrue % using counter and array
- \dowithcolor\execcolorRCSP\@@cl@@n
- \factorizecolorfalse
- \let\spotcolorfactor\@@cl@@o
- \doingspotcolorfalse
- \fi
- \exectransparency}
-
-\def\doexeccolorPindex#1:#2:#3:#4:%
- {\edef\@@cl@@n{#1}%
- \edef\@@cl@@f{#2}%
- \edef\@@cl@@d{#3}%
- \edef\@@cl@@p{#4}%
- \ifx\@@cl@@d\empty
- \let\@@cl@@d\@@cl@@n
- \fi
- \ifSPOTsupported
- \checkmultitonecolor\@@cl@@n
- \dowithcolor\registerindexcolor\@@cl@@n
- \fi
- \noexectransparency}
-
-\def\doexeccolorPP#1:#2:%
- {\edef\@@cl@@n{#1}%
- \edef\@@cl@@p{#2}%
- \registerusedspotcolor\@@cl@@n
- \ifx\@@cl@@n\currentspotcolor
- \normalizeSPOT
- \dostartgraycolormode\@@cl@@p % was spotcolormode
- \else
- \dovidecolor\@@cl@@p\@@cl@@o
- \fi
- \exectransparency}
-
-\def\doexeccolorrgb
- {\ifcase\currentcolorchannel
- \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
- \or \or \or \or
- \or \dostartgraycolormode\@@cl@@r
- \or \dostartgraycolormode\@@cl@@g
- \or \dostartgraycolormode\@@cl@@b
- \fi}
-
-\def\doexeccolorcmyk
- {\ifcase\currentcolorchannel
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \or \negatecolorcomponent\@@cl@@c\dostartgraycolormode\@@cl@@c
- \or \negatecolorcomponent\@@cl@@m\dostartgraycolormode\@@cl@@m
- \or \negatecolorcomponent\@@cl@@y\dostartgraycolormode\@@cl@@y
- \or \negatecolorcomponent\@@cl@@k\dostartgraycolormode\@@cl@@k
- \fi}
-
-\def\doexeccolorgray
- {\ifcase\currentcolorchannel
- \dostartgraycolormode\@@cl@@s
- \or \or \or
- \or \dostartgraycolormode\@@cl@@s
- \or \or \or
- \or \dostartgraycolormode\@@cl@@s
- \fi}
-
-%D When filtering colors, we need to either erase
-%D the background, or ignore the foreground.
-
-% \newif\ifhidesplitcolor \hidesplitcolortrue
-%
-% \def\noexeccolor#1\od
-% {\dostartgraycolormode\@@cl@@o}
-%
-% \let\noexeccolorS\noexeccolor
-% \let\noexeccolorP\noexeccolor
-
-%D Well, here comes some real trickery. When we have the 100\%
-%D spot color or black color, we don't want to erase the
-%D background. So, instead we hide the content by giving it
-%D zero transparency.
-
-% todo : #1#2#3 met #2 > of < and #3 een threshold
-
-\newif\ifhidesplitcolor \hidesplitcolortrue
-
-\def\dohidecolor#1#2%
- {\ifhidesplitcolor
- \ifx#1#2%
- \dostartgraycolormode\@@cl@@o
- \else
- \doregisternonecolor
- \dostartnonecolormode
- \fi
- \else
- \dostartgraycolormode\@@cl@@o
- \fi}
-
-\def\dovidecolor#1#2%
- {\ifhidesplitcolor
- \ifx#1#2%
- \doregisternonecolor
- \dostartnonecolormode
- \else
- \dostartgraycolormode\@@cl@@o
- \fi
- \else
- \dostartgraycolormode\@@cl@@o
- \fi}
-
-% \def\fullytransparentcolor % fails on floats
-% {\dostartgraycolormode\@@cl@@o % better than z
-% %\global\@EA\chardef\csname\@@currenttransparent\endcsname\plusone
-% %\global\intransparenttrue
-% \dostarttransparency10}
-
-\def\noexeccolorR#1:#2:#3:#4\od
- {\edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
- \dohidecolor\@@cl@@s\@@cl@@o}
-
-\def\noexeccolorC#1:#2:#3:#4:#5\od
- {\edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
- \dohidecolor\@@cl@@s\@@cl@@o}
-
-\def\noexeccolorS#1:#2\od
- {\edef\@@cl@@s{#1}%
- \dohidecolor\@@cl@@s\@@cl@@o}
-
-\def\noexeccolorP#1:#2:#3:#4:#5\od
- {\edef\@@cl@@p{#4}%
- \dohidecolor\@@cl@@p\@@cl@@z}
-
-%D For the sake of postprocessing (i.e.\ color separation)
-%D we can normalize colors, which comes down to giving equal
-%D values an equal accuracy and format. This feature is
-%D turned off by default due to a speed penalty. This macro
-%D also handles spot color percentages.
-
-\newif\iffactorizecolor
-\newif\ifnormalizecolor
-
-\def\spotcolorfactor{1}
-
-% \def\normalizecolor#1%
-% {\colordimen#1\thousandpoint
-% \colordimen\spotcolorfactor\colordimen
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#1{\realcolorvalue\colorcount}}
-
-\def\normalizecolor#1%
- {\colorcount\numexpr(\dimexpr\spotcolorfactor\dimexpr#1\thousandpoint\relax\relax+\medcard)/\maxcard\relax
- \edef#1{\realcolorvalue\colorcount}}
-
-% \def\normalizespotcolor#1%
-% {\colordimen-#1\thousandpoint
-% \advance\colordimen\thousandpoint
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#1{\realcolorvalue\colorcount}}
-
-\def\normalizespotcolor#1%
- {\colorcount\numexpr(\dimexpr\thousandpoint-#1\thousandpoint\relax+\medcard)/\maxcard\relax
- \edef#1{\realcolorvalue\colorcount}}
-
-\def\donormalizeRGB
- {\normalizecolor\@@cl@@r
- \normalizecolor\@@cl@@g
- \normalizecolor\@@cl@@b}
-
-\def\normalizeRGB
- {\ifnormalizecolor
- \donormalizeRGB
- \else\iffactorizecolor
- \donormalizeRGB
- \fi\fi}
-
-\def\donormalizeCMYK
- {\normalizecolor\@@cl@@c
- \normalizecolor\@@cl@@m
- \normalizecolor\@@cl@@y
- \normalizecolor\@@cl@@k}
-
-\def\normalizeCMYK
- {\ifnormalizecolor
- \donormalizeCMYK
- \else\iffactorizecolor
- \donormalizeCMYK
- \fi\fi}
-
-\def\donormalizeGRAY
- {\normalizecolor\@@cl@@s}
-
-\def\normalizeGRAY
- {\ifnormalizecolor
- \donormalizeGRAY
- \else\iffactorizecolor
- \donormalizeGRAY
- \fi\fi}
-
-\def\normalizeSPOT
- {\normalizespotcolor\@@cl@@p}
-
-%D We need to register spot colors (i.e.\ resources need to
-%D be created.
-
-\def\registerspotcolor#1:%
- {\ifcsname\??cl:\c!p:\@@cl@@n\endcsname
- \@EA\dontregisterspotcolor
- \else
- \letgvalue{\??cl:\c!p:\@@cl@@n}\empty
- %\@EA\@EA\csname registerspotcolor#1\endcsname
- \csname registerspotcolor#1\@EA\endcsname
- \fi}
-
-% todo: convert to rgb if needed, will will do this in mkiv
-
-\def\dontregisterspotcolor #1\od{}
-\def\registerspotcolorR #1:#2:#3:#4\od{\doregisterrgbspotcolor \@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}}
-\def\registerspotcolorC#1:#2:#3:#4:#5\od{\doregistercmykspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}{#4}}
-\def\registerspotcolorS #1:#2\od{\doregistergrayspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}}
-\def\registerspotcolorP #1:#2:#3\od{\doregistergrayspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#2}}
-
-%D Experimental feature:
-
-% \definecolor [darkblue] [c=1,m=.38,y=0,k=.64] % pantone pms 2965 uncoated m
-% \definecolor [darkyellow] [c=0,m=.28,y=1,k=.06] % pantone pms 124 uncoated m
-%
-% \definecolor [darkblue-50] [darkblue] [p=.5]
-% \definecolor [darkyellow-50] [darkyellow] [p=.5]
-% \definecolor [darkblue-80] [darkblue] [p=.8]
-% \definecolor [darkyellow-80] [darkyellow] [p=.8]
-%
-% \definecolor [darkblue,darkyellow] [r=.8]
-% \definecolor [darkdull-5030] [darkblue,darkyellow] [p={.5,.3}]
-%
-% \setupcolors[state=start]
-%
-% \blackrule[width=4cm,height=3cm,color=darkblue-50]
-% \blackrule[width=4cm,height=3cm,color=darkblue-80]
-% \blackrule[width=4cm,height=3cm,color=darkyellow-50]
-% \blackrule[width=4cm,height=3cm,color=darkyellow-80]
-% \blackrule[width=4cm,height=3cm,color=darkdull-5030]
-
-%D Experimental too (special purpose code).
-
-\def\registerindexcolor#1:%
- {\ifcsname\??cl:i:\@@cl@@n\endcsname
- \@EA\dontregisterindexcolor
- \else
- \letgvalue{\??cl:i:\@@cl@@n}\empty % signal
- \showmessage\m!colors{12}\@@cl@@n
- \@EA\@EA\csname registerindexcolor#1\endcsname
- \fi}
-
-\let\dontregisterindexcolor\dontregisterspotcolor
-
-\def\registerindexcolorR #1:#2:#3:#4\od{\doregisterrgbindexcolor \@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}}
-\def\registerindexcolorC#1:#2:#3:#4:#5\od{\doregistercmykindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}{#4}}
-\def\registerindexcolorS #1:#2\od{\doregistergrayindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}}
-\def\registerindexcolorP #1:#2:#3\od{\doregistergrayindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#2}}
-
-\def\predefinecolor[#1]%
- {\bgroup
- \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
- \egroup}
-
-\def\predefineindexcolor[#1]%
- {\bgroup
- \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
- \let\doexeccolorP\doexeccolorPindex
- \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% index one
- \egroup}
-
-% \def\checkpredefinedcolor[#1]%
-% {\ifcase\internalspotcolorsize{#1}\relax
-% \@EA\predefinecolor\or\@EA\predefinecolor\else\@EA\predefineindexcolor
-% \fi[#1]}
-
-\let\checkpredefinedcolor\predefineindexcolor % we need an index in order to negate bitmaps
-
%D \startbuffer
%D \definecolor [blue] [c=1,m=.38,y=0,k=.64] % pantone pms 2965 uncoated m
%D \definecolor [yellow] [c=0,m=.28,y=1,k=.06] % pantone pms 124 uncoated m
%D
-%D \definecolor [blue-100] [blue] [p=1]
-%D \definecolor [yellow-100] [yellow] [p=1]
+%D \definespotcolor [blue-100] [blue] [p=1]
+%D \definespotcolor [yellow-100] [yellow] [p=1]
%D
%D \definemultitonecolor [pdftoolscolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1]
%D
@@ -1140,1106 +239,333 @@
%D
%D \getbuffer \typebuffer
-%D Transparency is handled similar for all three color modes. We
-%D can turn transparency off with the following switch:
-
-\newif\iftransparencysupported \transparencysupportedtrue % todo
+\def\definecolor {\dodoubleargument\dodefinecolor}
+\def\defineglobalcolor {\dodoubleargument\dodefineglobalcolor}
+\def\definenamedcolor {\dodoubleargument\dodefinenamedcolor}
+\def\definespotcolor {\dotripleargument\dodefinespotcolor}
+\def\definemultitonecolor{\doquadrupleempty\dodefinemultitonecolor}
-\def\exectransparency
- {\iftransparencysupported
- \expandafter\doexectransparency
- \else
- \expandafter\noexectransparency
- \fi}
+% check: registerusedspotcolors
+% check: registerusedcolorchannels
-\def\doexectransparency#1:#2\od
- {\ifcase#1\space
- \global\intransparentfalse
- \else
- \global\intransparentfalse
- %\dostarttransparency{#1}{#2}%
- \supportedstarttransparency{#1}{#2}%
- \global\intransparenttrue
- \fi}
+%D \macros
+%D {doifcolorelse, doifcolor}
+%D
+%D Switching to a color is done by means of the following
+%D command. Later on we will explain the use of palets. We
+%D define ourselves a color conditional first.
-\def\noexectransparency#1\od
- {}
+\ifx\doifcolorelse\undefined
+ \let\doifcolorelse\secondoftwoarguments
+ \let\doifcolor \gobbleoneargument
+\fi
-%D Experimental: minimize transparency resets.
+%D \macros
+%D {localstartcolor,localstopcolor}
+%D
+%D Simple color support, that is without nesting, is provided
+%D by:
-\newif\ifintransparent
-\newif\ifoptimizetransparency \optimizetransparencytrue % under test
+\ifx\localstartcolor\undefined
+ \let\localstartcolor\undefined
+ \let\localstopcolor \undefined
+\fi
-% due to bugs in pdf viewers we used transparancies for
-% hiding colors, but now we use none colors
+%D \macros
+%D {faststartcolor,faststopcolor}
+%D
+%D No checking for arguments and such:
-% \def\supportedstoptransparency
-% {\iffilterspotcolor
-% \dostoptransparency
-% \else\iftransparencysupported
-% \dostoptransparency
-% \fi\fi}
-%
-% \def\conditionalstoptransparency
-% {\iffilterspotcolor
-% \dostoptransparency
-% \else\ifcase\currentcolorchannel
-% \ifoptimizetransparency
-% \ifintransparent
-% \supportedstoptransparency
-% \global\intransparentfalse
-% \fi
-% \else
-% \supportedstoptransparency
-% \fi
-% \else
-% \supportedstoptransparency
-% \fi\fi}
-
-\let\supportedstoptransparency\relax
-
-\def\conditionalstoptransparency
- {\ifoptimizetransparency
- \ifintransparent
- \global\intransparentfalse
- \supportedstoptransparency
- \fi
- \else
- \supportedstoptransparency
- \fi}
+\ifx\faststartcolor\undefined
+ \def\faststartcolor[#1]{}
+ \def\faststopcolor {}
+\fi
-\def\supportedstarttransparency
- {\iftransparencysupported
- \globallet\supportedstoptransparency\dostoptransparency
- \expandafter\dostarttransparency
- \else
- \expandafter\gobbletwoarguments
- \fi}
+%D These local ones may go away in future versions.
-%D We now use the \type {\@@cl@@A} hook to implement
-%D symbolic names. These are converted into numbers
-%D at definition time (which saves runtime).
+%D \macros
+%D {startcolor,stopcolor}
+%D
+%D The more save method, the one that saves the current color
+%D state and returns to this state afterward, is activated by:
+%D
+%D \showsetup{startcolor}
-\def\definetransparency
- {\dodoubleargument\dodefinetransparency}
+\ifx\startcolor\undefined
+ \let\startcolor\undefined
+ \let\stopcolor \undefined
+\fi
-\def\dodefinetransparency[#1][#2]%
- {\@EA\chardef\csname\??cl-#1\endcsname#2\relax}
+%D \macros
+%D {startcurrentcolor,stopcurrentcolor}
-\def\transparencynumber#1%
- {\the\executeifdefined{\??cl-#1}\zerocount}
-
-\definetransparency [none] [0] \definetransparency [0] [0]
-\definetransparency [normal] [1] \definetransparency [1] [1]
-\definetransparency [multiply] [2] \definetransparency [2] [2]
-\definetransparency [screen] [3] \definetransparency [3] [3]
-\definetransparency [overlay] [4] \definetransparency [4] [4]
-\definetransparency [softlight] [5] \definetransparency [5] [5]
-\definetransparency [hardlight] [6] \definetransparency [6] [6]
-\definetransparency [colordodge] [7] \definetransparency [7] [7]
-\definetransparency [colorburn] [8] \definetransparency [8] [8]
-\definetransparency [darken] [9] \definetransparency [9] [9]
-\definetransparency [lighten] [10] \definetransparency [10] [10]
-\definetransparency [difference] [11] \definetransparency [11] [11]
-\definetransparency [exclusion] [12] \definetransparency [12] [12]
-
-%D Now we hook 'm into the patterns:
-
-\def\@@cl@@A{\transparencynumber\@@cl@@a}
+\def\startcurrentcolor{\startcolor[\outercolorname]}
+\def\stopcurrentcolor {\stopcolor}
%D \macros
-%D {startregistercolor,stopregistercolor,permitcolormode}
-%D
-%D If you only want to register a color, the switch \type
-%D {\ifpermitcolormode} can be used. That way the nested
-%D colors know where to go back to.
-
-\def\startregistercolor[#1]%
- {\permitcolormodefalse\startcolor[#1]\permitcolormodetrue}
-
-\def\stopregistercolor
- {\permitcolormodefalse\stopcolor\permitcolormodetrue}
-
-%D We use these macros for implementing text colors
-%D (actually, the first application was in foreground
-%D colors).
-%D
-%D \starttyping
-%D \starttextcolor[red]
-%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
-%D \stoptextcolor
-%D \stoptyping
+%D {color,graycolor}
%D
-%D This is more efficient than the alternative:
+%D This leaves the simple color command:
%D
-%D \starttyping
-%D \setupbackgrounds[text][foregroundcolor=red]
-%D \startregistercolor[red]
-%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
-%D \stopregistercolor
-%D \stoptyping
-
-\let\maintextcolor\empty \def\defaulttextcolor{black}
-
-% \def\starttextcolor[#1]%
-% {\doifsomething{#1}
-% {\bgroup
-% \def\stoptextcolor % also goes ok with \page after
-% {\let\maintextcolor\empty % this one because the top of
-% \stopregistercolor % page sets the color right (side
-% \egroup}% % effect)
-% \def\starttextcolor[##1]%
-% {\bgroup
-% \let\stoptextcolor\egroup}%
-% \startregistercolor[#1]%
-% \edef\maintextcolor{#1}}}
-
-\def\@@themaintextcolor{themaintextcolor}
-
-\def\starttextcolor[#1]%
- {\doifsomething{#1}
- {\bgroup
- \def\stoptextcolor % also goes ok with \page after
- {\let\maintextcolor\empty % this one because the top of
- \stopregistercolor % page sets the color right (side
- \egroup}% % effect)
- \def\starttextcolor[##1]%
- {\bgroup
- % \@@themaintextcolor==##1 is catched in \definecolor
- \definecolor[\@@themaintextcolor][##1]%
- \let\stoptextcolor\egroup}%
- \startregistercolor[\@@themaintextcolor]%
- \definecolor[\@@themaintextcolor][#1]%
- \let\maintextcolor\@@themaintextcolor}}
-
-\let\stoptextcolor\relax
-
-%D The following hook permits proper support at the text
-%D level. This definition actually belongs in another
-%D module.
-
-\ifx\initializemaintextcolor\undefined
-
- \let\@@clprevcolor\empty
-
- \def\initializemaintextcolor
- {% saveguard for setting text color to empty after
- % it has been set
- \doifnothing\@@cltextcolor
- {\ifx\@@clprevcolor\empty\else
- \let\@@cltextcolor\defaulttextcolor
- \fi}%
- \doifelsenothing\@@cltextcolor
- {\let\maintextcolor\empty}
- {\edef\@@clprevcolor{\@@cltextcolor}%
- \let\maintextcolor\@@themaintextcolor
- \doifelsenothing\@@cltextcolor % another saveguard
- {\definecolor[\@@themaintextcolor][\defaulttextcolor]}%
- {\definecolor[\@@themaintextcolor][\@@cltextcolor]}%
- \doinitializemaintextcolor}}
-
- \def\doinitializemaintextcolor
- {\appendtoks\starttextcolor[\@@themaintextcolor]\to\everystarttext
- \appendtoks\stoptextcolor \to\everystoptext
- \let\doinitializemaintextcolor\relax}
+%D \showsetup{color}
+%D \showsetup{graycolor}
+\ifx\color\undefined
+ \def\color [#1]{}
+ \def\graycolor[#1]{}
+ \def\gray {\graycolor}
\fi
-%D The next macro can be used to return to the (normal)
-%D page color. This macro is used in the same way as
-%D \type {\color}.
-
-\def\localstarttextcolor
- {\ifx\maintextcolor\empty
- \startcolormode\defaulttextcolor
- \else
- \startcolormode\maintextcolor
- \fi}
-
-% \def\localstoptextcolor
-% {\stopcolormode}
-%
-% better:
-
-\def\localstoptextcolor
- {\restorecolormode}
-
-\def\restoretextcolor
- {\ifx\maintextcolor\empty
- \expandafter\dorestoretextcolor
- \else
- % obey main text color
- \fi}
-
-\def\dorestoretextcolor
- {\color[\defaulttextcolor]}
-
-%D We use some reserved names for local color components.
-%D Consistent use of these scratch variables saves us
-%D unneccessary hash entries.
-%D
-%D \starttyping
-%D \@@cl@@r \@@cl@@g \@@cl@@b
-%D \@@cl@@c \@@cl@@m \@@cl@@y \@@cl@@k
-%D \@@cl@@s
-%D \stoptyping
-%D
-%D We implement several conversion routines.
-%D
-%D \starttyping
-%D \convertRGBtoCMYK {r} {g} {b}
-%D \convertRGBtoGRAY {r} {g} {b}
-%D \convertCMYKtoRGB {c} {m} {y} {k}
-%D \convertCMYKtoGRAY {c} {m} {y} {k}
-%D \convertCMYKtoCMY {c} {m} {y} {k}
-%D \stoptyping
-%D
-%D The relation between \cap{Gray}, \cap{RGB} and \cap{CMYK}
-%D is:
-%D
-%D \placeformula[-]
-%D \startformula
-%D G = .30r + .59g + .11b
-%D = 1.0 - \min(1.0,\ .30c + .59m + .11y + k)
-%D \stopformula
-%D
-%D When converting from \cap{CMYK} to \cap{RGB} we use the
-%D formula:
-%D
-%D \placeformula[-]
-%D \startformula
-%D \eqalign
-%D {r &= 1.0 - \min(1.0,\ c+k) \cr
-%D g &= 1.0 - \min(1.0,\ m+k) \cr
-%D b &= 1.0 - \min(1.0,\ y+k)}
-%D \stopformula
-%D
-%D In the conversion routine the color components are calculated
-%D in three digits precision.
-
-\def\realcolorvalue#1%
- {\ifnum#1>\zerocount % important, first encountered in --modu supp-mpe
- \ifnum#1<\plusten 0.00\the#1\else
- \ifnum#1<\plushundred 0.0\the#1\else
- \ifnum#1<\plusthousand 0.\the#1\else
- 1\fi\fi\fi
- \else 0\fi}
-
-% \def\doconvertCMYKtoRGB#1\k#2\to#3%
-% {\ifdim#2\points>#1\points% >= problem, repaired 2/12/2002
-% \let#3\@@cl@@z % k >= color
-% \else
-% \colordimen\onepoint
-% \advance\colordimen -#1\points
-% \advance\colordimen -#2\points
-% \multiply\colordimen \plusthousand
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#3{\realcolorvalue\colorcount}%
-% \fi}
-
-\def\doconvertCMYKtoRGB#1\k#2\to#3%
- {\colorcount\numexpr(\dimexpr\plusthousand\dimexpr\onepoint-#1\points-#2\points\relax\relax+\medcard)/\maxcard\relax
- \ifnum\colorcount>\zeropoint
- \edef#3{\realcolorvalue\colorcount}%
- \else
- \let#3\@@cl@@z
- \fi}
-
-\def\convertCMYKtoRGB#1#2#3#4%
- {\doconvertCMYKtoRGB#1\k#4\to\@@cl@@r
- \doconvertCMYKtoRGB#2\k#4\to\@@cl@@g
- \doconvertCMYKtoRGB#3\k#4\to\@@cl@@b}
-
-% \def\doconvertRGBtoCMYK#1\to#2%
-% {\colordimen#1\points
-% \multiply\colordimen \plusthousand
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \colorcount-\colorcount
-% \advance\colorcount \plusthousand
-% \edef#2{\realcolorvalue\colorcount}}
-
-\def\doconvertRGBtoCMYK#1\to#2%
- {\colorcount\numexpr\plusthousand-(\dimexpr\plusthousand\dimexpr#1\points\relax\relax+\medcard)/\maxcard\relax
- \edef#2{\realcolorvalue\colorcount}}
-
-\def\convertRGBtoCMYK#1#2#3%
- {\doconvertRGBtoCMYK#1\to\@@cl@@c
- \doconvertRGBtoCMYK#2\to\@@cl@@m
- \doconvertRGBtoCMYK#3\to\@@cl@@y
- \let\@@cl@@k\@@cl@@z}
-
-%D The following switch is mainly meant for (hidden)
-%D documentation purposes.
-
-\newif\ifweightGRAY \weightGRAYtrue
-
-\def\nGRAYfactor{333.333}
-\def\rGRAYfactor{\ifweightGRAY300\else\nGRAYfactor\fi}
-\def\gGRAYfactor{\ifweightGRAY590\else\nGRAYfactor\fi}
-\def\bGRAYfactor{\ifweightGRAY110\else\nGRAYfactor\fi}
-
-% \def\convertRGBtoGRAY#1#2#3%
-% {\colordimen#1\points
-% \colordimen\rGRAYfactor\colordimen
-% \colorcount\colordimen
-% \colordimen#2\points
-% \colordimen\gGRAYfactor\colordimen
-% \advance\colorcount \colordimen
-% \colordimen#3\points
-% \colordimen\bGRAYfactor\colordimen
-% \advance\colorcount \colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef\@@cl@@s{\realcolorvalue\colorcount}}
-
-\def\convertRGBtoGRAY#1#2#3%
- {\colorcount\numexpr
- (\dimexpr\rGRAYfactor\dimexpr#1\points\relax\relax+
- \dimexpr\gGRAYfactor\dimexpr#2\points\relax\relax+
- \dimexpr\bGRAYfactor\dimexpr#3\points\relax\relax+
- \medcard)/\maxcard
- \relax
- \edef\@@cl@@s{\realcolorvalue\colorcount}}
-
-\def\convertCMYKtoGRAY#1#2#3#4%
- {\convertCMYKtoRGB{#1}{#2}{#3}{#4}%
- \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b}
-
-% \def\doconvertCMYKtoCMY#1\k#2\to#3%
-% {\colordimen#1\points
-% \advance\colordimen #2\points\relax
-% \ifdim\colordimen>\onepoint
-% \colordimen\onepoint
-% %\else
-% % \colordimen\colordimen
-% \fi
-% \multiply\colordimen \plusthousand
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#3{\realcolorvalue\colorcount}}
-
-\def\doconvertCMYKtoCMY#1\k#2\to#3%
- {\colorcount\numexpr(\dimexpr\plusthousand\dimexpr#1\points+#2\points\relax\relax+\medcard)/\maxcard\relax
- \ifnum\colorcount>\plusthousand
- \let#3\@@cl@@o
- \else
- \edef#3{\realcolorvalue\colorcount}%
- \fi}
-
-\def\convertCMYKtoCMY#1#2#3#4%
- {\doconvertCMYKtoCMY#1\k#4\to\@@cl@@c
- \doconvertCMYKtoCMY#2\k#4\to\@@cl@@m
- \doconvertCMYKtoCMY#3\k#4\to\@@cl@@y
- \let\@@cl@@k\@@cl@@z}
-
-%D Before we present the color macros, we first define the
-%D setup command. This command takes care of setting up the
-%D booleans that control local and global behavior (more on
-%D that later) and conversion to other color spaces.
-
-\let\currentspotcolor \empty
-\let\previousspotcolor\empty
-
-\newif\ifincolor
-\newif\iflocalcolor
-
-\def\setupcolors
- {\dosingleargument\dosetupcolors}
-
-\def\resetcolorsplitting
- {\chardef\currentcolorchannel\zerocount
- \let\currentspotcolor\empty
- \filterspotcolorfalse}
-
-\def\colorsplitsuffix{\ifcase\currentcolorchannel\else-\@@clsplit\fi}
-\def\colorsplitprefix{\ifcase\currentcolorchannel\else\@@clsplit-\fi}
-
-\def\setcolorsplitting
- {\resetsystemmode{\v!color\colorsplitsuffix}%
- \resetcolorsplitting
- \processaction
- [\@@clsplit]
- [ c=>\chardef\currentcolorchannel1,%
- m=>\chardef\currentcolorchannel2,%
- y=>\chardef\currentcolorchannel3,%
- k=>\chardef\currentcolorchannel4,%
- r=>\chardef\currentcolorchannel5,%
- g=>\chardef\currentcolorchannel6,%
- b=>\chardef\currentcolorchannel7,%
- s=>\chardef\currentcolorchannel8,%
- \v!no=>,% \currentcolorchannel0,% all colors
- \s!default=>,% \currentcolorchannel0,% all colors
- \s!unknown=>\filterspotcolortrue
- \edef\currentspotcolor{\commalistelement}]%
- \setsystemmode{\v!color\colorsplitsuffix}%
- \iffilterspotcolor \let\@@clrgb\v!no \fi}
-
-\def\dosetupcolors[#1]%
- {\getparameters[\??cl][#1]%
- \doifelse\@@clspot\v!yes
- \SPOTsupportedtrue
- \SPOTsupportedfalse
- \doifelsenothing\@@clsplit
- \resetcolorsplitting
- \setcolorsplitting
- \doifelse\@@clreduction\v!yes
- \reduceCMYKtrue
- \reduceCMYKfalse
- \doifelse\@@clexpansion\v!yes
- \freezecolorstrue
- \freezecolorsfalse
- \doifelse\@@clcriterium\v!all
- \hidesplitcolortrue
- \hidesplitcolorfalse
- \doifelse\@@clrgb\v!no
- {\ifRGBsupported \showmessage\m!colors {9}\v!rgb\RGBsupportedfalse\fi}
- {\ifRGBsupported\else\showmessage\m!colors{10}\v!rgb\RGBsupportedtrue \fi}%
- \doifelse\@@clcmyk\v!no
- {\ifCMYKsupported \showmessage\m!colors {9}\v!cmyk\CMYKsupportedfalse\fi}
- {\ifCMYKsupported\else\showmessage\m!colors{10}\v!cmyk\CMYKsupportedtrue \fi}%
- % todo : mpspot
- \doifelse\@@clmpcmyk\v!no
- {\ifMPcmykcolors \showmessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykcolorsfalse\fi}
- {\ifMPcmykcolors\else\showmessage\m!colors{10}{\v!mp\v!cmyk}\MPcmykcolorstrue \fi}%
- \doifelse\@@clmpspot\v!no
- {\ifMPspotcolors \showmessage\m!colors {9}{\v!mp\v!spot}\MPspotcolorsfalse\fi}
- {\ifMPspotcolors\else\showmessage\m!colors{10}{\v!mp\v!spot}\MPspotcolorstrue \fi}%
- \preferGRAYfalse
- \processaction
- [\@@clconversion]
- [ \v!yes=>\preferGRAYtrue,
- \v!always=>\preferGRAYtrue\RGBsupportedfalse\CMYKsupportedfalse]%
- \ifRGBsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \else\ifCMYKsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \convertMPcolorstrue
- \ifreduceCMYK
- \reduceMPcolorstrue
- \fi
- \else
- \ifconverttoGRAY\else\showmessage\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]%
- \initializemaintextcolor}
-
-%D \macros
-%D {doifcolorelse}
-%D
-%D Switching to a color is done by means of the following
-%D command. Later on we will explain the use of palets. We
-%D define ourselves a color conditional first.
-
-\let\currentpalet\empty
-
-\def\doifcolorelse#1%
- {\ifcsname\??cr\ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi#1\endcsname
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
-
-\def\doifcolor#1%
- {\ifcsname\??cr\ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi#1\endcsname
- \expandafter\firstofoneargument
- \else
- \expandafter\gobbleoneargument
- \fi}
-
%D \macros
-%D {localstartcolor,localstopcolor}
+%D {localstartraster,localstopraster,
+%D startraster,stopraster,raster}
%D
-%D Simple color support, that is without nesting, is provided
-%D by:
-
-\def\localstartcolor
- {\ifincolor
- \localcolortrue
- \expandafter\doglobalstartcolor
- \else
- \expandafter\noglobalstartcolor
- \fi}
+%D The previous conversions are not linear and treat each color
+%D component according to human perception curves. Pure gray
+%D (we call them rasters) has equal color components. In
+%D \CONTEXT\ rasters are only used as backgrounds and these
+%D don't cross page boundaries in the way color does. Therefore
+%D we don't need stacks and marks. Just to be compatible with
+%D color support we offer both 'global' and 'local' commands.
-\def\localstopcolor
- {\ifincolor
- \doglobalstopcolor
- \else
- \noglobalstopcolor
- \fi}
+\ifx\startraster\undefined
+ \def\startraster [#1]{}
+ \def\stopraster {}
+ \def\raster [#1]{}
+ \def\localstartraster[#1]{}
+ \def\localstopraster {}
+\fi
%D \macros
-%D {startcolor,stopcolor}
-%D
-%D The more save method, the one that saves the current color
-%D state and returns to this state afterward, is activated by:
+%D {colorvalue, grayvalue}
%D
-%D \showsetup{startcolor}
-
-\unexpanded\def\startcolor
- {\ifincolor
- \expandafter\doglobalstartcolor
- \else
- \expandafter\noglobalstartcolor
- \fi}
-
-\unexpanded\def\stopcolor
- {\ifincolor
- \doglobalstopcolor
- \else
- \noglobalstopcolor
- \fi}
-
-%D This macros call the global color switching ones. Starting
-%D a global, i.e. a possible page boundary crossing, color
-%D mode also sets a \type{\mark} in \TEX's internal list.
-
-\newcount\colorlevel
-
-\letvalue{\??cl0C}\empty % saved color
-\letvalue{\??cl0S}\empty % stop command
-
-%D We keep a positive color stack for foreground colors, and
-%D a negative one for backgrounds. Not that brilliant a
-%D solution, but it suits. The signs are swapped when the
-%D page ornaments are typeset.
-
-\let\@@colorplus \plusone
-\let\@@colorminus\minusone
-
-\def\@@currentcolorname {\??cl\the\colorlevel C}
-\def\@@currentcolorstop {\??cl\the\colorlevel S}
-%def\@@currenttransparent{\??cl\the\colorlevel T}
-
-% \def\currentcolorname
-% {\csname
-% \ifcsname\@@currentcolorname\endcsname\@@currentcolorname\else\s!empty\fi
-% \endcsname}
-
-\letvalue{\??cl*\s!black}\s!black
-
-\def\currentcolorname
- {\csname
- \ifcsname\@@currentcolorname\endcsname
- \expandafter\ifx\csname\@@currentcolorname\endcsname\empty
- \??cl*\s!black
- \else
- \@@currentcolorname
- \fi
- \else
- \??cl*\s!black
- \fi
- \endcsname}
-
-% \def\outercolorname
-% {\ifcsname\@@currentcolorname\endcsname currentcolor\else\s!black\fi}
-
-\def\outercolorname
- {\ifcsname\@@currentcolorname\endcsname
- \expandafter\ifx\csname\@@currentcolorname\endcsname\empty
- \s!black
- \else
- currentcolor%
- \fi
- \else
- \s!black
- \fi}
-
-\def\startcurrentcolor{\startcolor[\outercolorname]}
-\def\stopcurrentcolor {\stopcolor}
-
-% not the following, because we need a different tag in order to trick the stack
-%
-% \def\outercolorname{\executeifdefined\@@currentcolorname\s!black}
-%
-% \def\startcurrentcolor{\expanded{\startcolor[\s!black]\noexpand\startcolor[\outercolorname]}}
-% \def\stopcurrentcolor {\stopcolor\stopcolor}
-%
-% test case:
-%
-% \setupcolors[state=start,textcolor=red]
-% \starttext
-% red
-% \color[green]{green
-% \startMPcode
-% label(\sometxt{green\color[blue]{blue}green}, origin) withcolor red;
-% draw fullcircle scaled 1cm xscaled 2;
-% \stopMPcode
-% green}
-% red
-% \stoptext
-
-\def\dodoglobalstartcolor
- {\global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
- \global\advance\colorlevel \@@colorplus
- \global\@EA\let\csname\@@currentcolorname\endcsname\@@askedcolor
- %\debuggerinfo\m!colors
- % {start \@@askedcolor\space at level \the\colorlevel}%
- \ifx\@@askedcolor\empty
- \global\@EA\let\csname\@@currentcolorname\endcsname\@@currentcolor
- \global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
- \else\ifx\@@askedcolor\@@currentcolor
- \global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
- \else
- \doifcolorelse\@@askedcolor
- {%\docolormark\@@askedcolor
- \ifpermitcolormode\docolormark\@@askedcolor\fi
- \global\@EA\let\csname\@@currentcolorstop\endcsname\dodoglobalstopcolor
- \startcolormode\@@askedcolor}
- {\global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
- \showmessage\m!colors3\@@askedcolor\empty}%
- \fi\fi}
-
-\def\doglobalstartcolor[#1]%
- {\edef\@@askedcolor{#1}%
- \ifcase\colorlevel\relax
- \ifx\@@askedcolor\empty
- \global\@EA\let\csname\@@currentcolorstop\endcsname\empty
- \else
- \dodoglobalstartcolor
- \fi
- \else
- \dodoglobalstartcolor
- \fi
- \ignorespaces}
-
-\def\noglobalstartcolor[#1]%
- {}
-
-\def\dodoglobalstopcolor
- {\ifcase\colorlevel \else
- \donoglobalstopcolor
- \global\@EA\let\@EA\@@previouscolor\csname\@@currentcolorname\endcsname
- \ifcase\colorlevel\relax
- \ifpermitcolormode
- \docolormark\empty
- \conditionalstoptransparency
- \dostopcolormode
- \fi
- \else % let's do a bit redundant testing here
- \docolormark\@@previouscolor
- \ifx\@@previouscolor\empty
- \ifpermitcolormode
- \conditionalstoptransparency
- \dostopcolormode
- \fi
- \else
- \doifcolorelse\@@previouscolor
- {\ifx\@@currentcolor\@@previouscolor\else
- % alternatively we could let \startcolormode handle this
- \ifpermitcolormode
- \conditionalstoptransparency % really needed
- % more safe but less efficient: \dostopcolormode
- \fi
- \startcolormode\@@previouscolor
- \fi}
- {\ifpermitcolormode
- \conditionalstoptransparency
- \dostopcolormode
- \fi}%
- \fi
- \fi
- \fi}
-
-\def\donoglobalstopcolor
- {\ifcase\colorlevel \else
- \global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
- %\debuggerinfo{\m!colors}
- % {stop \@@currentcolor\normalspace at level \the\colorlevel}%
- \global\advance\colorlevel \@@colorminus
- \fi}
-
-\def\doglobalstopcolor
- {\csname\@@currentcolorstop\endcsname}
-
-\let\noglobalstopcolor\relax
-
-\let\faststartcolor\doglobalstartcolor
-\let\faststopcolor \doglobalstopcolor
-
-%D We don't use grouping and save each stop alternative. This
-%D permits be especially useful in for instance local color
-%D support in verbatim. Using \type{\bgroup}||\type{\egroup}
-%D pairs could interfere with calling commands
-
-%D This color mechanism takes care of nested colors, like in:
+%D We can typeset the color components using \type{\colorvalue} and
+%D \type{\grayvalue}. The commands:
%D
%D \startbuffer
-%D \color[green]{groen \color[green]{groen \color[red]{rood}} groen}
-%D \color[green]{groen \color[]{groen \color[red]{rood}} groen}
-%D \color[green]{groen \color[red]{rood \color[red]{rood}} groen}
-%D \color[green]{groen \color[green]{groen \color[]{groen}} groen}
-%D \color[green]{groen \color[red]{rood} groen}
-%D \color[green]{groen \color[]{groen} groen}
-%D \color[]{zwart \color[red]{rood} zwart}
-%D \color[]{zwart}
+%D color value of SomeKindOfRed: \colorvalue{SomeKindOfRed} \crlf
+%D gray value of SomeKindOfRed: \grayvalue{SomeKindOfRed}
%D \stopbuffer
%D
%D \typebuffer
%D
-%D or
+%D show us:
%D
%D \startvoorbeeld
-%D \startlines
%D \getbuffer
-%D \stoplines
%D \stopvoorbeeld
-%D
-%D Crossing page boundaries is of course also handled.
-%D Undefined or empty color specifications are treated as
-%D efficient as possible.
-%D
-%D \startbuffer
-%D \startcolor[green]
-%D [green] \input tufte [green] \par
-%D \startcolor[]
-%D [green] \input knuth [green] \par
-%D \startcolor[red]
-%D [red] \input tufte [red] \par
-%D \startcolor[yellow]
-%D [yellow] \input knuth [yellow] \par
-%D \stopcolor
-%D [red] \input tufte [red] \par
-%D \stopcolor
-%D [green] \input knuth [green] \par
-%D \stopcolor
-%D [green] \input tufte [green] \par
-%D \stopcolor
-%D \stopbuffer
-%D
-%D \startpacked
-%D \getbuffer
-%D \stoppacked
-%D
-%D These quotes are typeset by saying:
-%D
-%D \typebuffer
-
-%D We already mentioned that colors interfere with building
-%D the pagebody. This means that when the page is composed,
-%D the colors temporary have to be reset. After the page is
-%D shipped out, we have to revive the current color.
-%D
-%D We use \type{\mark}s to keep track of colors across page
-%D boundaries. Unfortunately standard \TEX\ supports only one mark,
-%D and using this one for color support only would be a waste.
-%D We therefore use an adapted version of J.~Fox's multiple mark
-%D mechanism as (re|)|implemented in \module{supp-mrk}.
-
-\doifdefinedelse{rawnewmark}
- {\rawnewmark\colormark}
- {\let\colormark\gobbleoneargument}
-
-%D Using this mark mechanism with lots of colors has one
-%D major drawback: \TEX's memory tends to overflow when
-%D very colorful text is stored in a global box. Even worse is that
-%D the processing time grows considerably. We therefore support
-%D local as well as global color switching.
-%D
-%D Of the next macros, \type {\popcolor} is to be used after
-%D the actual \type {\shipout} and \type {\startcolorpage} and
-%D \type {\stopcolorpage} are called when entering and leaving
-%D the \type {\pagebody} builder. In case of emergencies
-%D \type {\pushcolor} can be used to undo the current color,
-%D for instance when insertions are appended to the page.
-%D
-%D Out of efficiency we only use marks when needed. The next
-%D macro tries to find out if indeed a mark should be set.
-%D This macro uses the boolean \type {\ifinpagebody}, which can
-%D be defined and set in the module that handles the pagebody.
-
-\def\docolormark#1%
- {\iflocalcolor \else \ifinpagebody \else \ifinframed \else
- \dodocolormark{#1}%
- \fi \fi \fi}
-
-\let\lastcolormark=\empty
-
-\def\dodocolormark#1%
- {\edef\newcolormark{#1}%
- \ifx\newcolormark\lastcolormark\else
- \global\let\lastcolormark\newcolormark
- \@EA\rawsetmark\@EA\colormark\@EA{\lastcolormark}%
- \fi}
-
-%D \macros
-%D {pushcolor, popcolor}
-%D
-%D Pushing the current state in the output routine simply comes
-%D to resetting the color to black, while popping restores the
-%D color state to that of before the break.
-
-\def\topofpagecolor{\rawgetbotmark\colormark} % see postponing
-
-\def\pushcolor
- {\stopcolormode}
-
-\def\popcolor
- {\doifsomething{\rawgetbotmark\colormark}
- {%\debuggerinfo\m!colors{popping \getbotmark\colormark}%
- \startcolormode{\rawgetbotmark\colormark}}}
-
-\def\popsplitcolor
- {\getsplitmarks\colormark % hier wel
- \doifsomething{\rawgetsplitbotmark\colormark}
- {%\debuggerinfo\m!colors{split popping \getsplitbotmark\colormark}%
- \startcolormode{\rawgetsplitbotmark\colormark}}}
-
-\appendtoks\pushcolor \to\everypushproperties
-\appendtoks\popcolor \to\everypopproperties
-\appendtoks\popsplitcolor\to\everypopsplitproperties
-% Private macro: only needed in test cases (like multiple
-% seperations in one file); no user command!
-
-\def\resynccolor
- {\ifcase\pagetotal % \ifdim\pagetotal=\zeropoint
- \popcolor
- \else\ifx\@@currentcolor\empty
- \ifx\maintextcolor\empty\else
- \startcolormode\maintextcolor
- \fi
- \else
- \startcolormode\@@currentcolor
- \fi\fi}
-
-%D \macros
-%D {startcolorpage, stopcolorpage}
-%D
-%D Local use can be forced with the next two macros. Nesting
-%D is still supported but colors are no longer marked.
-%D
-%D The next implementation makes (simple) color separation more
-%D easy. It also supports nested colors in page backgrounds
-%D and texts.
-
-\def\startcolorpage
- {\bgroup
- \let\@@colorplus \minusone
- \let\@@colorminus\plusone
- \let\docolormark\gobbleoneargument
- \edef\savedcolorlevel{\the\colorlevel}%
- \global\colorlevel\zerocount % before \localstartcolor of
- \ifx\maintextcolor\empty % course, ugly bug removed
- \localstartcolor[\defaulttextcolor]%
- \else
- \localstartcolor[\maintextcolor]%
- \fi}
+\def\colorformatseparator{ }
-\def\stopcolorpage
- {\localstopcolor
- \global\colorlevel\savedcolorlevel
- \egroup}
+\ifx\colorvalue\undefined
+ \let\colorvalue\gobbleoneargument
+ \let\grayvalue \gobbleoneargument
+\fi
-\appendtoks \startcolorpage\to\everystarttextproperties
-\prependtoks\stopcolorpage \to\everystoptextproperties
+% check: \currentcolorname
+% check: \outercolorname
%D \macros
-%D {color,graycolor}
-%D
-%D This leaves the simple color command:
-%D
-%D \showsetup{color}
-%D \showsetup{graycolor}
-%D
-%D Which can be used straightforward: \color[green]{green as gras}.
-%D We want color support to be similar to font support and
-%D therefore implement \type{\color} as:
-
-\unexpanded\def\color[#1]%
- {\groupedcommand{\startcolor[#1]}\stopcolor}
-
-% \let\switchtocolor\color
-
-%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.
-
-%D Also wrong, test in combinations: \type{...{}{\red test}}
+%D {setupcolor}
%D
-%D \def\switchtocolor[#1]%
-%D {\startcolor[#1]\aftergroup\stopcolor}
-
-\def\switchtocolor[#1]% grouping is realy needed, else migration
- {\bgroup\startcolor[#1]\aftergroup\stopcolor\aftergroup\egroup}
-
-\unexpanded\def\color[#1]%
- {\groupedcommand{\startcolor[#1]}\stopcolor}
-
-\unexpanded\def\graycolor[#1]% not \gray because this is a color
- {\groupedcommand{\RGBsupportedfalse\CMYKsupportedfalse\SPOTsupportedfalse\startcolor[#1]}\stopcolor}
-
-\let\grey\graycolor
-
-%D This implementation enables use of defined colors like:
+%D Color definitions can be grouped in files with the name:
%D
%D \starttyping
-%D Look at the {\brightgreen bright} side of life and get
-%D yourself no \red{red} head!
+%D \f!colorprefix-identifier.tex
%D \stoptyping
-
-%D \macros
-%D {colorvalue, grayvalue}
-%D
-%D We can typeset the color components using \type{\colorvalue} and
-%D \type{\grayvalue}. The commands:
-%D
-%D \startbuffer
-%D color value of SomeKindOfRed: \colorvalue{SomeKindOfRed} \crlf
-%D gray value of SomeKindOfRed: \grayvalue{SomeKindOfRed}
-%D \stopbuffer
%D
-%D \typebuffer
+%D where \type{\f!colorprefix} is \unprotect {\tttf \f!colorprefix}.
+%D Loading such a file is done by \protect
%D
-%D show us:
+%D \showsetup{setupcolor}
%D
-%D \startvoorbeeld
-%D \getbuffer
-%D \stopvoorbeeld
+%D Some default colors are specified in \type{colo-rgb.tex},
+%D which is loaded into the format by:
%D
-%D We can speed the following macros a bit up, but this
-%D hardly pays off; they are only used in the manual.
-
-\def\realcolorformat#1%
- {\ifnum#1<\plusten 0.00\the#1\else
- \ifnum#1<\plushundred 0.0\the#1\else
- \ifnum#1<\plusthousand 0.\the#1\else
- 1.000\fi\fi\fi}
-
-\def\colorformatseparator{ }
+%D \starttyping
+%D \setupcolor[rgb]
+%D \stoptyping
-\def\dodoformatcolor#1%
- {\colordimen#1\points\relax
- \ifdim\colordimen>\onepoint
- \colordimen\onepoint
- \fi
- \multiply\colordimen \plusthousand
- \colorcount\colordimen
- \advance\colorcount \medcard
- \divide\colorcount \maxcard \relax
- \realcolorformat\colorcount}
+\let\colorstyle\empty
-\def\doformatcolorR#1:#2:#3:#4:#5\od
- {\dodoformatcolor{#1}\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}}
+\def\setupcolor
+ {\dosingleargument\dosetupcolor}
-\def\doformatcolorC#1:#2:#3:#4:#5:#6\od
- {\dodoformatcolor{#1}\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}\colorformatseparator
- \dodoformatcolor{#4}}
+\def\dosetupcolor[#1]%
+ {\doifnot{#1}\colorstyle
+ {\def\colorstyle{#1}%
+ \processcommalist[#1]\dodosetupcolor}}
-\def\doformatcolorS#1:#2:#3\od
- {\dodoformatcolor{#1}}
+\def\dodosetupcolor#1%
+ {\makeshortfilename[\truefilename{\f!colorprefix#1}]%
+ \startreadingfile
+ \readsysfile\shortfilename
+ {\showmessage\m!colors4\colorstyle}
+ {\showmessage\m!colors5\colorstyle}%
+ \stopreadingfile}
-\def\doformatcolorP#1:#2:#3:#4:#5:#6\od
- {#1\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}\colorformatseparator
- \dodoformatcolor{#4}\colorformatseparator}
+\let\usecolors\setupcolor
-\def\doformatcolor#1:%
- {\csname doformatcolor#1\endcsname}
+% check: \chardef\currentcolorchannel=0
+% check: \startcolormode
+% check: \newif\iffilterspotcolor \filterspotcolorfalse
+% check: \newif\ifdoingspotcolor \doingspotcolorfalse
+% check: \registercolorchannel
-\def\colorvalue
- {\dowithcolor\doformatcolor}
+%D \macros
+%D {definetransparency}
+%D
+%D This command numbers to names:
-\def\doformatgrayR#1:#2:#3:#4:#5\od
- {\convertRGBtoGRAY{#1}{#2}{#3}%
- \dodoformatcolor\@@cl@@s}
+\def\definetransparency
+ {\dodoubleargument\dodefinetransparency}
-\def\doformatgrayC#1:#2:#3:#4:#5:#6\od
- {\convertCMYKtoGRAY{#1}{#2}{#3}{#4}%
- \dodoformatcolor\@@cl@@s}
+\def\setupcolors
+ {\dosingleargument\dosetupcolors}
-\def\doformatgrayS#1:#2:#3\od
- {\dodoformatcolor{#1}}
+\def\resetcolorsplitting
+ {\chardef\currentcolorchannel\zerocount
+ \let\currentspotcolor\empty
+ \filterspotcolorfalse}
-% \def\doformatgrayP#1:#2:#3:#4:#5:#6\od
-% {\convertSPOTtoGRAY{#1}{#2}{#3}{#4}%
-% \dodoformatcolor\@@cl@@s}
+\def\colorsplitsuffix{\ifcase\currentcolorchannel\else-\@@clsplit\fi}
+\def\colorsplitprefix{\ifcase\currentcolorchannel\else\@@clsplit-\fi}
-\def\doformatgrayP#1:#2:#3:#4:#5:#6\od
- {todo}
+\def\setcolorsplitting
+ {\resetsystemmode{\v!color\colorsplitsuffix}%
+ \resetcolorsplitting
+ \processaction
+ [\@@clsplit]
+ [ c=>\chardef\currentcolorchannel1,%
+ m=>\chardef\currentcolorchannel2,%
+ y=>\chardef\currentcolorchannel3,%
+ k=>\chardef\currentcolorchannel4,%
+ r=>\chardef\currentcolorchannel5,%
+ g=>\chardef\currentcolorchannel6,%
+ b=>\chardef\currentcolorchannel7,%
+ s=>\chardef\currentcolorchannel8,%
+ \v!no=>,% \currentcolorchannel0,% all colors
+ \s!default=>,% \currentcolorchannel0,% all colors
+ \s!unknown=>\filterspotcolortrue
+ \edef\currentspotcolor{\commalistelement}]%
+ \setsystemmode{\v!color\colorsplitsuffix}%
+ \iffilterspotcolor \let\@@clrgb\v!no \fi}
-\def\doformatgray#1:%
- {\csname doformatgray#1\endcsname}
+\ifx\dosetupcolormodel\undefined
+ \let\dosetupcolormodel\relax
+\fi
-\def\grayvalue
- {\dowithcolor\doformatgray}
+\def\dosetupcolors[#1]% some no longer make sense in MkIV
+ {\getparameters[\??cl][#1]%
+ \doifelse\@@clspot\v!yes
+ \SPOTsupportedtrue
+ \SPOTsupportedfalse
+ \doifelsenothing\@@clsplit
+ \resetcolorsplitting
+ \setcolorsplitting
+ \doifelse\@@clreduction\v!yes
+ \reduceCMYKtrue
+ \reduceCMYKfalse
+ \doifelse\@@clexpansion\v!yes
+ \freezecolorstrue
+ \freezecolorsfalse
+ \doifelse\@@clcriterium\v!all
+ \hidesplitcolortrue
+ \hidesplitcolorfalse
+ \doifelse\@@clrgb\v!no
+ {\ifRGBsupported \showmessage\m!colors {9}\v!rgb\RGBsupportedfalse\fi}
+ {\ifRGBsupported\else\showmessage\m!colors{10}\v!rgb\RGBsupportedtrue \fi}%
+ \doifelse\@@clcmyk\v!no
+ {\ifCMYKsupported \showmessage\m!colors {9}\v!cmyk\CMYKsupportedfalse\fi}
+ {\ifCMYKsupported\else\showmessage\m!colors{10}\v!cmyk\CMYKsupportedtrue \fi}%
+ \doifelse\@@clmpcmyk\v!no
+ {\ifMPcmykcolors \showmessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykcolorsfalse\fi}
+ {\ifMPcmykcolors\else\showmessage\m!colors{10}{\v!mp\v!cmyk}\MPcmykcolorstrue \fi}%
+ \doifelse\@@clmpspot\v!no
+ {\ifMPspotcolors \showmessage\m!colors {9}{\v!mp\v!spot}\MPspotcolorsfalse\fi}
+ {\ifMPspotcolors\else\showmessage\m!colors{10}{\v!mp\v!spot}\MPspotcolorstrue \fi}%
+ \preferGRAYfalse
+ \processaction
+ [\@@clconversion]
+ [ \v!yes=>\preferGRAYtrue,
+ \v!always=>\preferGRAYtrue\RGBsupportedfalse\CMYKsupportedfalse]%
+ \ifRGBsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \else\ifCMYKsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \convertMPcolorstrue
+ \ifreduceCMYK
+ \reduceMPcolorstrue
+ \fi
+ \else
+ \ifconverttoGRAY\else\showmessage\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]%
+ \dosetupcolormodel
+ \initializemaintextcolor}
%D \macros
-%D {localstartraster,localstopraster,
-%D startraster,stopraster}
+%D {startregistercolor,stopregistercolor,permitcolormode}
%D
-%D The previous conversions are not linear and treat each color
-%D component according to human perception curves. Pure gray
-%D (we call them rasters) has equal color components. In
-%D \CONTEXT\ rasters are only used as backgrounds and these
-%D don't cross page boundaries in the way color does. Therefore
-%D we don't need stacks and marks. Just to be compatible with
-%D color support we offer both 'global' and 'local' commands.
+%D If you only want to register a color, the switch \type
+%D {\ifpermitcolormode} can be used. That way the nested
+%D colors know where to go back to.
+
+\ifx\startregistercolor\undefined
+ \def\startregistercolor[#1]{}
+ \def\stopregistercolor {}
+\fi
+
+%D We use these macros for implementing text colors
+%D (actually, the first application was in foreground
+%D colors).
%D
%D \starttyping
-%D \def\localstartraster[#1]%
-%D {\doifelsenothing{#1}
-%D {\dostartgraymode\@@rsscreen}
-%D {\dostartgraymode{#1}}}
+%D \starttextcolor[red]
+%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
+%D \stoptextcolor
+%D \stoptyping
%D
-%D \def\localstopraster
-%D {\dostopgraymode}
+%D This is more efficient than the alternative:
%D
-%D \let\startraster\localstartraster
-%D \let\stopraster \localstopraster
+%D \starttyping
+%D \setupbackgrounds[text][foregroundcolor=red]
+%D \startregistercolor[red]
+%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
+%D \stopregistercolor
%D \stoptyping
-%D
-%D The next alternative is slower, since it works on top of the
-%D color (stack) mechanism, but it does provide nesting.
-
-\def\dosetrastercolor#1%
- {\edef\@@cl@@s{#1}%
- \ifx\@@cl@@s\empty
- \let\@@cl@@s\@@rsscreen
- \fi
- \let\@@cl@@t\@@cl@@z % else we get rogue
- \let\@@cl@@a\@@cl@@z % transpancies
- \setevalue{\??cr\??rs}{\colorSpattern}}
-
-% beware, don't add extra grouping, else color in tables
-% fails
-
-\def\localstartraster[#1]%
- {\ifincolor\dosetrastercolor{#1}\localstartcolor[\??rs]\fi}
-\def\startraster[#1]%
- {\ifincolor\dosetrastercolor{#1}\startcolor[\??rs]\fi}
+\def\maintextcolor {}
+\def\defaulttextcolor {black}
+\def\@@themaintextcolor{themaintextcolor}
-\def\localstopraster{\ifincolor\localstopcolor\fi}
-\def\stopraster {\ifincolor\stopcolor\fi}
+\ifx\initializemaintextcolor\undefined
+ \def\starttextcolor [#1]{}
+ \def\stoptextcolor {}
+ \def\initializemaintextcolor {}
+\fi
-\def\raster[#1]{\groupedcommand{\startraster[#1]}{\stopraster}}
+\ifx\restoretextcolor\undefined % to be redone
+ \let\restoretextcolor \firstofoneargument
+ \let\localstarttextcolor\relax
+ \let\localstoptextcolor \relax
+\fi
%D In this documentation we will not go into too much details
%D on palets. Curious users can find more information on this
@@ -2325,15 +651,9 @@
{\doifdefined{\??pa#2}
{\expanded{\dodefinepalet[#1][\csname\??pa\??pa#2\endcsname]}}}}
-\def\dodefinepaletcolor#1#2#3%
- {\doifassignmentelse{#3}
- {% == \definepalet[test][xx={y=.4}]
- \definecolor[\??pa#1:#2][#3]%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{\??cr#1:#2}{\csname\??cr\??pa#1:#2\endcsname}}
- {% == \definepalet[test][xx=green]
- \doifdefinedelse{\??cr#3}
- {\iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{\??cr#1:#2}{\csname\??cr#3\endcsname}}
- {\letvalue{\??cr#1:#2}\colorXpattern}}}
+\ifx\dodefinepaletcolor\undefined
+ \let\dodefinepaletcolor\gobblethreearguments
+\fi
\let\paletsize\!!zerocount
@@ -2425,31 +745,6 @@
\def\definecolorgroup
{\dotripleempty\dodefinecolorgroup}
-% \def\dodefinecolorgroup[#1][#2][#3]%
-% {\ifthirdargument
-% \processaction
-% [#2]
-% [ \v!cmyk=>\edef\currentcolorspace{C},
-% \v!rgb=>\edef\currentcolorspace{R},
-% \v!gray=>\edef\currentcolorspace{S},
-% \v!spot=>\edef\currentcolorspace{P},
-% \v!s=>\edef\currentcolorspace{S},
-% \s!unknown=>\edef\currentcolorspace{R}]%
-% \colorcount\zerocount
-% \def\dododefinecolorgroup##1%
-% {\advance\colorcount \plusone
-% \setevalue{\??cr#1:\the\colorcount}{\currentcolorspace:##1:0:0}}%
-% \processcommalist[#3]\dododefinecolorgroup
-% \else
-% \doifinstringelse{:}{#2}
-% {\definecolorgroup[#1][\v!rgb][#2]}
-% {\doloop
-% {\doifdefinedelse{\??cr#2:\recurselevel}
-% {\setevalue{\??cr#1:\recurselevel}%
-% {\csname\??cr#2:\recurselevel\endcsname}}
-% {\exitloop}}}%
-% \fi}
-
\def\dododefinecolorgroupgray [#1][#2:#3]{\definecolor [#1:\the\colorcount][s=#2]}
\def\dododefinecolorgrouprgb [#1][#2:#3:#4:#5]{\definecolor [#1:\the\colorcount][r=#2,g=#3,b=#4]}
\def\dododefinecolorgroupcmyk[#1][#2:#3:#4:#5:#6]{\definecolor [#1:\the\colorcount][c=#2,m=#3=,y=#4,k=#5]}
@@ -2597,6 +892,28 @@
%D It would make sense to put the following code in \type
%D {colo-mps}, but it it rather low level.
+%D \macros
+%D {negatecolorcomponent,negatedcolorcomponent}
+%D
+%D These speak for themselves. See \type {colo-ext} for usage.
+
+\def\negatecolorcomponent#1% #1 = \macro
+ {\scratchdimen\onepoint\advance\scratchdimen-#1\onepoint
+ \ifdim\scratchdimen<\zeropoint\scratchdimen\zeropoint\fi
+ \edef#1{\withoutpt\the\scratchdimen}}
+
+\let\negatedcolorcomponent\firstofoneargument
+
+\def\negatedcolorcomponent#1%
+ {\ifdim\dimexpr\onepoint-#1\onepoint\relax<\zeropoint
+ \!!zerocount
+ \else
+ \expandafter\withoutpt\the\dimexpr\onepoint-#1\onepoint\relax
+ \fi}
+
+\def\negatecolorcomponent#1% #1 = \macro
+ {\edef#1{\negatedcolorcomponent{#1}}}
+
%D \macros
%D {ifMPgraphics, ifMPcmykcolors, MPcolor}
%D
@@ -2615,148 +932,15 @@
\newif\ifMPcmykcolors % \MPcmykcolorsfalse
\newif\ifMPspotcolors % \MPspotcolorsfalse
-\def\scaledMPcolor#1#2%
- {\ifMPgraphics
- \handlecolorwith\doMPcolor
- \csname\??cr
- \ifcsname\??cr\currentpalet#2\endcsname\currentpalet\fi
- #2\endcsname
- :::::::\end#1\end
- \else
- #2%
- \fi}
-
-\def\MPcolor{\scaledMPcolor1}
-
-%D Before we had transparency available, the following
-%D conversion macro was available:
-%D
-%D \starttyping
-%D \def\doMPcolor#1:#2:#3:#4:#5:#6:#7:#8\end
-%D {\if #1R(#2,#3,#4)%
-%D \else\if#1C\ifMPcmykcolors cmyk(#2,#3,#4,#5)\else(1-#2-#5,1-#3-#5,1-#4-#5)\fi
-%D \else\if#1S(#2,#2,#2)%
-%D \else (0,0,0)%
-%D \fi\fi\fi}
-%D \stoptyping
-%D
-%D In order to be useful, this macro is to be fully
-%D expandabele.
-
-\def\doMPcolor#1:% #1 can be \relax ! ! ! i.e. an empty color
- {\csname MPc\@EA\ifx\csname MPc\string#1\endcsname\relax B\else#1\fi\endcsname}
-
-\def\MPcR{\doMPrgb}
-\def\MPcC{\ifMPcmykcolors\@EA\doMPcmykY\else\@EA\doMPcmykN\fi}
-\def\MPcS{\doMPgray}
-\def\MPcP{\ifMPspotcolors\@EA\doMPspotY\else\@EA\doMPspotN\fi}
-\def\MPcB{\doMPblack}
-
-\def\transparentMP {transparent}
-\def\cmykMP {scaledcmyk}
-\def\cmykASrgbMP {scaledcmykasrgb} % not really needed any more
-\def\rgbMP {scaledrgb}
-\def\grayMP {scaledgray}
-\def\spotMP {spotcolor}
-
-\def\doMPtransparent#1#2:#3:#4\end
- {\ifcase#2\space(#1)\else\transparentMP(#2,#3,(#1))\fi}
-
-\def\doMPgray#1:#2\end#3\end
- {\doMPtransparent{\grayMP(#1,#3)}#2\end}
-
-\def\doMPrgb#1:#2:#3:#4\end#5\end
- {\doMPtransparent{\rgbMP(#1,#2,#3,#5)}#4\end}
-
-\def\doMPcmykY#1:#2:#3:#4:#5\end#6\end
- {\doMPtransparent{\cmykMP(#1,#2,#3,#4,#6)}#5\end}
-
-\def\doMPcmykN#1:#2:#3:#4:#5\end#6\end
- {\doMPtransparent{\cmykASrgbMP(#1,#2,#3,#4,#6)}#5\end}
-
-\def\doMPspotY#1:#2:#3:#4:#5\end#6\end % best make #3 same as #1 when empty
- {\doMPtransparent{multitonecolor("#1",#2,"#3","#4")}#5\end}
-
-\def\doMPspotN#1:#2:#3:#4:#5\end#6\end
- {\scaledMPcolor{#4}{#1}}
-
-\def\doMPblack#1\end#2\end
- {\unknownMPcolor}
-
-\def\unknownMPcolor
- {(0,0,0)}
-
-\let\processMP\spotMP % for some time, will become obsolete, brrr
+\ifx\MPcolor\undefined
+ \def\MPcolor#1{(0,0,0)}
+\fi
%D \macros
%D {PDFcolor,FDFcolor}
%D
%D Similar alternatives are avaliable for \PDF:
-\def\PDFcolor #1{\handlecolorwith\doPDFcolor \csname\??cr#1\endcsname:::::::\end}
-\def\PDFcolorvalue#1{\handlecolorwith\doPDFcolorvalue\csname\??cr#1\endcsname:::::::\end}
-\def\FDFcolor #1{\handlecolorwith\doFDFcolor \csname\??cr#1\endcsname:::::::\end}
-
-\def\doPDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
- {\if #1R#2 #3 #4 rg%
- \else\if#1C#2 #3 #4 #5 k%
- \else\if#1S#2 g%
- \else\if#1P#5 g%
- \else 0 g%
- \fi\fi\fi\fi}
-
-\def\doPDFcolorvalue#1:#2:#3:#4:#5:#6:#7:#8\end
- {\if #1R#2 #3 #4%
- \else\if#1C#2 #3 #4 #5%
- \else\if#1S#2%
- \else\if#1P#5%
- \else 0%
- \fi\fi\fi\fi}
-
-\def\doFDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
- {[\if #1R#2 #3 #4%
- \else\if#1C#2 #3 #4 #5%
- \else\if#1S#2%
- \else\if#1P#5%
- \else 0%
- \fi\fi\fi\fi]}
-
-% a few more obscure ones:
-
-\def\internalspotcolorname#1{\handlecolorwith\dointernalspotcolorname\csname\??cr#1\endcsname:::::::\end}
-\def\internalspotcolorsize#1{\handlecolorwith\dointernalspotcolorsize\csname\??cr#1\endcsname:::::::\end}
-
-\def\dointernalspotcolorname#1:#2:#3:#4:#5:#6:#7:#8\end{\if#1P\ifcase0#3 #1\else#2\fi\else#1\fi}
-\def\dointernalspotcolorsize#1:#2:#3:#4:#5:#6:#7:#8\end{\if#1P\ifcase0#3 0\else#3\fi\else 0\fi}
-
-%D \macros
-%D {everyshapebox}
-%D
-%D A terrible hack, needed because we cannot have marks in
-%D shape boxes.
-
-\appendtoks \localcolortrue \to \everyshapebox
-
-%D We default to the colors defined in \module{colo-rgb} and
-%D support both \cap{RGB} and \cap{CMYK} output.
-
-\setupcolors
- [\c!state=\v!stop,
- \c!conversion=\v!yes,
- \c!reduction=\v!no,
- \c!rgb=\v!yes,
- \c!cmyk=\v!yes,
- \c!spot=\v!yes,
- \c!mp\c!cmyk=\@@clcmyk,
- \c!mp\c!spot=\@@clspot,
- \c!expansion=\v!no,
- \c!textcolor=,
- \c!split=\v!no,
- \c!criterium=\v!all]
-
-\setupcolor
- [\v!rgb]
-
%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
@@ -2774,6 +958,18 @@
% \appendtoks\setupcolors[\c!expansie=\v!ja]\to\everyjob
+\chardef\currentcolorchannel=0
+
+\newif\iffilterspotcolor \filterspotcolorfalse
+\newif\ifdoingspotcolor \doingspotcolorfalse
+
+\def\registercolorchannel#1%
+ {\ifdoingspotcolor \else
+ \global\expandafter\chardef\csname\??cs#1\endcsname\zerocount
+ \fi}
+
+\newif\ifhidesplitcolor \hidesplitcolortrue
+
%D The next macro is for instance used in figure splitting:
\def\doifseparatingcolorselse
@@ -2809,29 +1005,47 @@
\def\colorchannelprefix{\doifseparatingcolorselse\@@clsplit\empty-}
\def\colorchannelsuffix{-\doifseparatingcolorselse\@@clsplit\empty}
-%D As we can see, color support is turned off by default.
-%D Reduction of gray colors to gray scales is turned on.
-
-%D \macros
-%D {negatecolorcomponent,negatedcolorcomponent}
-%D
-%D These speak for themselves. See \type {colo-ext} for usage.
+%D We now load the low level macros:
-\def\negatecolorcomponent#1% #1 = \macro
- {\scratchdimen\onepoint\advance\scratchdimen-#1\onepoint
- \ifdim\scratchdimen<\zeropoint\scratchdimen\zeropoint\fi
- \edef#1{\withoutpt\the\scratchdimen}}
+\loadmarkfile{colo-ini}
-\let\negatedcolorcomponent\firstofoneargument
+%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
+%D gray colors to gray scales is turned on.
+
+\definecolor[black][s=0]
+\definecolor[white][s=1]
+
+\definetransparency [none] [0]
+\definetransparency [normal] [1]
+\definetransparency [multiply] [2]
+\definetransparency [screen] [3]
+\definetransparency [overlay] [4]
+\definetransparency [softlight] [5]
+\definetransparency [hardlight] [6]
+\definetransparency [colordodge] [7]
+\definetransparency [colorburn] [8]
+\definetransparency [darken] [9]
+\definetransparency [lighten] [10]
+\definetransparency [difference] [11]
+\definetransparency [exclusion] [12]
-\def\negatedcolorcomponent#1%
- {\ifdim\dimexpr\onepoint-#1\onepoint\relax<\zeropoint
- \!!zerocount
- \else
- \expandafter\withoutpt\the\dimexpr\onepoint-#1\onepoint\relax
- \fi}
+\setupcolors
+ [\c!state=\v!stop,
+ \c!conversion=\v!yes,
+ \c!reduction=\v!no,
+ \c!rgb=\v!yes,
+ \c!cmyk=\v!yes,
+ \c!spot=\v!yes,
+ \c!mp\c!cmyk=\@@clcmyk,
+ \c!mp\c!spot=\@@clspot,
+ \c!expansion=\v!no,
+ \c!textcolor=,
+ \c!split=\v!no,
+ \c!criterium=\v!all]
-\def\negatecolorcomponent#1% #1 = \macro
- {\edef#1{\negatedcolorcomponent{#1}}}
+\setupcolor
+ [\v!rgb]
\protect \endinput
diff --git a/tex/context/base/colo-new.lua b/tex/context/base/colo-new.lua
deleted file mode 100644
index fb1457070..000000000
--- a/tex/context/base/colo-new.lua
+++ /dev/null
@@ -1,547 +0,0 @@
-if not modules then modules = { } end modules ['colo-ini'] = {
- version = 1.000,
- comment = "companion to colo-ini.tex",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- 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
-
-backends = backends or { }
-backends.pdf = backends.pdf or { }
-backend = backends.pdf
-
-local texsprint, format, concat = tex.sprint, string.format, table.concat
-
-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
-
-function backends.pdf.registergrayspotcolor(n,f,d,p,s) states.collect(s_template_g:format(n,f,d,p,s)) end
-function backends.pdf.registerrgbspotcolor (n,f,d,p,r,g,b) states.collect(s_template_r:format(n,f,d,p,r,g,b)) end
-function backends.pdf.registercmykspotcolor(n,f,d,p,c,m,y,k) states.collect(s_template_c:format(n,f,d,p,c,m,y,k)) end
-
-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
-
-function backends.pdf.registergrayindexcolor(n,f,d,p,s) states.collect(m_template_g:format(n,f,d,p,s)) end
-function backends.pdf.registerrgbindexcolor (n,f,d,p,r,g,b) states.collect(m_template_r:format(n,f,d,p,r,g,b)) end
-function backends.pdf.registercmykindexcolor(n,f,d,p,c,m,y,k) states.collect(m_template_c:format(n,f,d,p,c,m,y,k)) end
-
-local s_template_e = "\\doPDFregisterspotcolorname{%s}{%s}" -- name, e
-
-function backends.pdf.registerspotcolorname(name,e)
- if e and e ~= "" then
- texsprint(tex.ctxcatcodes,format(s_template_e,name,e)) -- todo in new backend: e:gsub(" ","#20")
- end
-end
-
-ctx = ctx or { }
-ctx.aux = ctx.aux or { }
-
-local a_l_c_template = "\\setevalue{(ca:%s)}{%s}" ..
- "\\setevalue{(cs:%s)}{\\dosetattribute{color}{%s}}"
-local a_g_c_template = "\\setxvalue{(ca:%s)}{%s}" ..
- "\\setxvalue{(cs:%s)}{\\dosetattribute{color}{%s}}"
-local f_l_c_template = "\\setvalue {(ca:%s)}{\\doinheritca{%s}}" ..
- "\\setvalue {(cs:%s)}{\\doinheritcs{%s}}"
-local f_g_c_template = "\\setgvalue{(ca:%s)}{\\doinheritca{%s}}" ..
- "\\setgvalue{(cs:%s)}{\\doinheritcs{%s}}"
-local r_l_c_template = "\\letbeundefined{(ca:%s)}" ..
- "\\letbeundefined{(cs:%s)}"
-local r_g_c_template = "\\global\\letbeundefined{(ca:%s)}" ..
- "\\global\\letbeundefined{(cs:%s)}"
-
-local a_l_t_template = "\\setevalue{(ta:%s)}{%s}" ..
- "\\setevalue{(ts:%s)}{\\dosetattribute{transparency}{%s}}"
-local a_g_t_template = "\\setxvalue{(ta:%s)}{%s}" ..
- "\\setxvalue{(ts:%s)}{\\dosetattribute{transparency}{%s}}"
-local f_l_t_template = "\\setvalue {(ta:%s)}{\\doinheritta{%s}}" ..
- "\\setvalue {(ts:%s)}{\\doinheritts{%s}}"
-local f_g_t_template = "\\setgvalue{(ta:%s)}{\\doinheritta{%s}}" ..
- "\\setgvalue{(ts:%s)}{\\doinheritts{%s}}"
-local r_l_t_template = "\\letbeundefined{(ta:%s)}" ..
- "\\letbeundefined{(ts:%s)}"
-local r_g_t_template = "\\global\\letbeundefined{(ta:%s)}" ..
- "\\global\\letbeundefined{(ts:%s)}"
-
-function ctx.aux.definecolor(name, ca, global)
- if ca and ca > 0 then
- if global then
- texsprint(tex.ctxcatcodes,a_g_c_template:format(name, ca, name, ca))
- else
- texsprint(tex.ctxcatcodes,a_l_c_template:format(name, ca, name, ca))
- end
- else
- if global then
- texsprint(tex.ctxcatcodes,r_g_c_template:format(name, name))
- else
- texsprint(tex.ctxcatcodes,r_l_c_template:format(name, name))
- end
- end
-end
-function ctx.aux.inheritcolor(name, ca, global)
- if ca and ca ~= "" then
- if global then
- texsprint(tex.ctxcatcodes,f_g_c_template:format(name, ca, name, ca))
- else
- texsprint(tex.ctxcatcodes,f_l_c_template:format(name, ca, name, ca))
- end
- else
- if global then
- texsprint(tex.ctxcatcodes,r_g_c_template:format(name, name))
- else
- texsprint(tex.ctxcatcodes,r_l_c_template:format(name, name))
- end
- end
-end
-function ctx.aux.definetransparent(name, ta, global)
- if ta and ta > 0 then
- if global then
- texsprint(tex.ctxcatcodes,a_g_t_template:format(name, ta, name, ta))
- else
- texsprint(tex.ctxcatcodes,a_l_t_template:format(name, ta, name, ta))
- end
- else
- if global then
- texsprint(tex.ctxcatcodes,r_g_t_template:format(name, name))
- else
- texsprint(tex.ctxcatcodes,r_l_t_template:format(name, name))
- end
- end
-end
-function ctx.aux.inherittransparent(name, ta, global)
- if ta and ta ~= "" then
- if global then
- texsprint(tex.ctxcatcodes,f_g_t_template:format(name, ta, name, ta))
- else
- texsprint(tex.ctxcatcodes,f_l_t_template:format(name, ta, name, ta))
- end
- else
- if global then
- texsprint(tex.ctxcatcodes,r_g_t_template:format(name, name))
- else
- texsprint(tex.ctxcatcodes,r_l_t_template:format(name, name))
- end
- end
-end
-
-local transparent = {
- none = 0,
- normal = 1,
- multiply = 2,
- screen = 3,
- overlay = 4,
- softlight = 5,
- hardlight = 6,
- colordodge = 7,
- colorburn = 8,
- darken = 9,
- lighten = 10,
- difference = 11,
- exclusion = 12,
-}
-
--- 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.
-
-ctx.couplecolors = true
-
-function ctx.definetransparency(name,n)
- transparent[name] = n
-end
-
-local registered = { }
-
-local function registerspotcolor(parent,name,parentnumber,e,f,d,p)
- if not registered[parentnumber] then
- local v = colors.values[parentnumber]
- if v then
- local kind = v[1]
- if kind == 2 then -- name noffractions names p's r g b
- backend.registergrayspotcolor(parent,f,d,p,v[2])
- elseif kind == 3 then
- backend.registerrgbspotcolor (parent,f,d,p,v[3],v[4],v[5])
- elseif kind == 4 then
- backend.registercmykspotcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
- end
- backends.pdf.registerspotcolorname(parent,e)
- end
- registered[parentnumber] = true
- end
-end
-
-local function 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
- local kind = v[1]
- if kind == 2 then
- backend.registergrayindexcolor(parent,f,d,p,v[2])
- elseif kind == 3 then
- backend.registerrgbindexcolor (parent,f,d,p,v[3],v[4],v[5])
- elseif kind == 4 then
- backend.registercmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
- end
- end
- registered[parentnumber] = true
- end
-end
-
-function ctx.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()
- if t then
- if t.h then
- local r, g, b =string.match(t.h .. "000000","(..)(..)(..)")
- 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)
- 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)
- 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)
- else
- ctx.aux.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
- end
- elseif freeze then
- local ca = attributes.list[attributes.numbers['color']] [str]
- local ta = attributes.list[attributes.numbers['transparency']][str]
- if ca then
- ctx.aux.definecolor(name, ca, global)
- end
- if ta then
- ctx.aux.definetransparent(name, ta, global)
- end
- else
- ctx.aux.inheritcolor(name, str, global)
- ctx.aux.inherittransparent(name, str, global)
- end
-end
-
-function ctx.definespotcolor(name,parent,str,global)
- if parent == "" or parent:find("=") then
- ctx.registerspotcolor(name, parent)
- elseif name ~= parent then
- local cp = attributes.list[attributes.numbers['color']][parent]
- if cp then
- local t = str:split_settings()
- 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
- if name and name ~= "" then
- ctx.aux.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
- end
- end
- end
- end
- end
-end
-
-function ctx.registerspotcolor(parent, str)
- local cp = attributes.list[attributes.numbers['color']][parent]
- if cp then
- local e = ""
- if str then
- local t = str:split_settings()
- e = (t and t.e) or ""
- end
- registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics
- end
-end
-
-function ctx.definemultitonecolor(name,multispec,colorspec,selfspec)
- local dd, pp, nn = { }, { }, { }
- for k,v in multispec:gmatch("(%a+)=([^%,]*)") do
- dd[#dd+1] = k
- pp[#pp+1] = v
- nn[#nn+1] = k
- nn[#nn+1] = format("%1.3g",tonumber(v))
- end
---~ v = tonumber(v) * p
- local nof = #dd
- if nof > 0 then
- dd, pp, nn = concat(dd,','), concat(pp,','), concat(nn,'_')
- local parent = (nn:lower()):gsub("[^%d%a%.]+","_")
- ctx.defineprocesscolor(parent,colorspec..","..selfspec,true,true)
- local cp = attributes.list[attributes.numbers['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()
- 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
- end
- end
- end
-end
-
-function ctx.mpcolor(model,ca,ta,default)
- local cv = colors.value(ca) -- faster when direct colors.values[ca]
- if cv then
- local tv = transparencies.value(ta)
- if model == 1 then
- model = cv[1]
- end
- if tv then
- if model == 2 then
- return format("transparent(%s,%s,(%s,%s,%s))",tv[1],tv[2],cv[3],cv[4],cv[5])
- elseif model == 3 then
- return format("transparent(%s,%s,(%s,%s,%s))",tv[1],tv[2],cv[3],cv[4],cv[5])
- elseif model == 4 then
- return format("transparent(%s,%s,cmyk(%s,%s,%s,%s))",tv[1],tv[2],cv[6],cv[7],cv[8],cv[9])
- else
- return format("transparent(%s,%s,multitonecolor(\"%s\",%s,\"%s\",\"%s\"))",tv[1],tv[2],cv[10],cv[11],cv[12],cv[13])
- end
- else
- if model == 2 then
- return format("(%s,%s,%s)",cv[3],cv[4],cv[5])
- elseif model == 3 then
- return format("(%s,%s,%s)",cv[3],cv[4],cv[5])
- elseif model == 4 then
- return format("cmyk(%s,%s,%s,%s)",cv[6],cv[7],cv[8],cv[9])
- else
- return format("multitonecolor(\"%s\",%s,\"%s\",\"%s\")",cv[10],cv[11],cv[12],cv[13])
- end
- end
- else
- default = default or 0 -- rgb !
- return format("(%s,%s,%s)",default,default,default)
- end
-end
-
-function ctx.formatcolor(ca,separator)
- local cv = colors.value(ca)
- if cv then
- local model = cv[1]
- if model == 2 then
- return tostring(cv[2])
- elseif model == 3 then
- return concat(cv,separator,3,5)
- elseif model == 4 then
- return concat(cv,separator,6,9)
- else
- return tostring(cv[13])
- end
- else
- return tostring(0)
- end
-end
-
-function ctx.formatgray(ca,separator)
- local cv = colors.value(ca)
- if cv then
- return tostring(cv[2])
- else
- return tostring(0)
- end
-end
-
-function ctx.colorcomponents(ca)
- local cv = colors.value(ca)
- if cv then
- local model = cv[1]
- if model == 2 then
- return format("s=%1.3f",cv[2])
- elseif model == 3 then
- return format("r=%1.3f g=%1.3f b=%1.3f",cv[3],cv[4],cv[5])
- elseif model == 4 then
- return format("c=%1.3f m=%1.3f y=%1.3f k=%1.3f",cv[6],cv[7],cv[8],cv[9])
- elseif type(cv[13]) == "string" then
- return format("p=%s",cv[13])
- else
- return format("p=%1.3f",cv[13])
- end
- else
- return ""
- end
-end
-
-function ctx.transparencycomponents(ta)
- local tv = transparencies.value(ta)
- if tv then
- return format("a=%1.3f t=%1.3f",tv[1],tv[2])
- else
- return ""
- 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 = p:gsub(","," ") -- 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
- end
- return "DeviceGRAY"
-end
-
-function ctx.spotcolorname(ca,default)
- local cv, v = colors.value(ca), "unknown"
- if cv and cv[1] == 5 then
- v = cv[10]
- end
- return tostring(v)
-end
-
-function ctx.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
- texsprint(tex.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
- texsprint(tex.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
- texsprint(tex.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(tex.ctxcatcodes,format("\\setxvalue{%s}{%s}",csa,ctx.pdfcolorvalue(model,ca)))
- texsprint(tex.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(tex.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(tex.ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'cmyk',c,m,y,k))))
-end
-function ctx.pdfgrayliteral(model,s)
- texsprint(tex.ctxcatcodes,format("\\pdfliteral{%s}",ctx.pdfcolor(model,colors.register('color',nil,'gray',s))))
-end
-function ctx.pdfspotliteral(model,n,f,d,p)
- texsprint(tex.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(tex.ctxcatcodes,format("\\pdfliteral{/Tr%s gs}",transparencies.register(nil,a,t)))
-end
-function ctx.pdffinishtransparency()
- if intransparency then
- intransparency = false
- texsprint(tex.ctxcatcodes,"\\pdfliteral{/Tr0 gs}") -- we happen to know this -)
- end
-end
diff --git a/tex/context/base/colo-new.mkii b/tex/context/base/colo-new.mkii
deleted file mode 100644
index 313dce455..000000000
--- a/tex/context/base/colo-new.mkii
+++ /dev/null
@@ -1,1859 +0,0 @@
-%D \module
-%D [ file=colo-ini,
-%D version=1997.04.01,
-%D title=\CONTEXT\ Color 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.
-
-\unprotect
-
-\chardef\colorversion=1
-
-%D Color support is not present in \TEX. Colorful output can
-%D however be accomplished by using specials. This also means
-%D that this support depends on the \DVI\ driver used. At the
-%D moment this module was written, still no decent standard on
-%D color specials has been agreed upon. We therefore decided to
-%D implement a mechanism that is as independant as possible of
-%D drivers.
-%D
-%D Color support shares with fonts that is must be implemented
-%D in a way that permits processing of individual \DVI\ pages.
-%D Furthermore it should honour grouping. The first condition
-%D forces us to use a scheme that keeps track of colors at
-%D page boundaries. This can be done by means of \TEX's
-%D marking mechanism (\type{\mark}).
-%D
-%D When building pages, \TEX\ periodically looks at the
-%D accumulated typeset contents and breaks the page when
-%D suitable. At that moment, control is transfered to the
-%D output routine. This routine takes care of building the
-%D pagebody and for instance adds headers and footers. The page
-%D can be broken in the middle of some colored text, but
-%D headers and footers are often in black upon white or
-%D background. If colors are applied there, they definitely
-%D are used local, which means that they don't cross page
-%D borders.
-%D
-%D Boxes are handled as a whole, which means that when we
-%D apply colors inside a box, those colors don't cross page
-%D boundaries, unless of course boxes are split or unboxed.
-%D Especially in interactive texts, colors are often used in
-%D such a local way: in boxes (buttons and navigational tools)
-%D or in the pagebody (backgrounds).
-%D
-%D So we can distinguish local colors, that don't cross
-%D pages from global colors, of which we can end many pages
-%D later. The color macros will treat both types in a different
-%D way, thus gaining some speed.
-%D
-%D This module also deals with gray scales. Because similar
-%D colors can end up in the same gray scale when printed in
-%D black and white, we also implement a palet system that deals
-%D with these matters. Because of fundamental differences
-%D between color and gray scale printing, in \CONTEXT\ we also
-%D differ between these. For historic reasons |<|we first
-%D implemented gray scales using patterns of tiny periods|>|
-%D and therefore called them {\em rasters}. So don't be
-%D surprised if this term shows up.
-
-%D \macros
-%D {definecolor}
-%D
-%D We will enable users to specify colors in \cap{RGB} and
-%D \cap{CMYK} color spaces or gray scales using
-%D
-%D \showsetup{definecolor}
-%D
-%D For example:
-%D
-%D \starttyping
-%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
-%D \stoptyping
-%D
-%D Such color specifications are saved in a macro in the
-%D following way:
-%D
-%D \starttyping
-%D \setvalue{\??cr name}{R:r:g:b}
-%D \setvalue{\??cr name}{C:c:m:y:k}
-%D \setvalue{\??cr name}{S:s}
-%D \stoptyping
-%D
-%D Gray scales are specified with the \type{s} parameter,
-%D where the \type {s} is derived from {\em screen}.
-%D
-%D Starting with \PDF\ 1.4 (2001) \CONTEXT\ supports
-%D transparent colors. The transparency factor is represented
-%D by a \type {t} and the transparency method by an \type {a}
-%D (alternative). Later we will implement more control
-%D (probably by symbolic methods. So, currently the data is
-%D stored as follows:
-%D
-%D \starttyping
-%D \setvalue{\??cr name}{R:r:g:b:a:t}
-%D \setvalue{\??cr name}{C:c:m:y:k:a:t}
-%D \setvalue{\??cr name}{S:s:a:t}
-%D \stoptyping
-
-% r g b : rbg
-% c m y k : cmyk
-% s : gray
-% p n d f : spot
-% h : hexadecimal
-% t a : transparency
-% e : equivalent (spotcolors)
-
-\def\@@cl@@z{0}
-\def\@@cl@@o{1}
-
-\def\@@resetcolorparameters
- {\let\@@cl@@r\@@cl@@z \let\@@cl@@g\@@cl@@z \let\@@cl@@b\@@cl@@z
- \let\@@cl@@c\@@cl@@z \let\@@cl@@m\@@cl@@z \let\@@cl@@y\@@cl@@z \let\@@cl@@k\@@cl@@z
- \let\@@cl@@s\@@cl@@z
- \let\@@cl@@p\@@cl@@o \let\@@cl@@n\empty \let\@@cl@@d\empty \let\@@cl@@f\@@cl@@o
- \let\@@cl@@h\empty
- \let\@@cl@@e\empty
- \let\@@cl@@t\@@cl@@z \let\@@cl@@a\@@cl@@z}
-
-\@@resetcolorparameters
-
-\def\@@cl@@A{\@@cl@@a} % a hook for symbolic conversion, see below
-
-%D Handling a few nested \type{\cs}'s is no problem (\type
-%D {\@EA\@EAEAEA\@EA}) but we need a full expansion, so I
-%D tried one of the fully expandable primitives using a sort
-%D of delimited thing. I tried \type {\number} first, but this
-%D does not work, but \type {\romannumeral} does. Actually,
-%D \type{\romannumeral0} returns nothing, so it's a perfect
-%D candidate for this kind of hackery. This reminds me that I
-%D have to look into David Kastrup's Euro\TeX\ 2002 article
-%D because he is using \type {\romannumeral} for loops
-%D (repetitive \quote {m} stuff).
-
-% \def\x{\y}\def\y{\z}\def\z{0:1:1:1}
-%
-% \def\bla #1:#2:#3\end{}
-%
-% \@EA\bla\romannumeral\x\end
-
-\def\colorXpattern{0S:\@@cl@@z:\@@cl@@z:\@@cl@@z}
-\def\colorZpattern{0S:\@@cl@@z:\@@cl@@A:\@@cl@@t}
-\def\colorSpattern{0S:\@@cl@@s:\@@cl@@A:\@@cl@@t}
-\def\colorCpattern{0C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k:\@@cl@@A:\@@cl@@t}
-\def\colorRpattern{0R:\@@cl@@r:\@@cl@@g:\@@cl@@b:\@@cl@@A:\@@cl@@t}
-
-%def\colorPpattern{0P:\@@cl@@n:\@@cl@@p:\@@cl@@A:\@@cl@@t}
-
-\def\colorPpattern{0P:\@@cl@@n:\@@cl@@f:\@@cl@@d:\@@cl@@p:\@@cl@@A:\@@cl@@t}
-
-%D The extra 0 catches empty colors specs (needed for the
-%D \type {\MPcolor} and \type {\PDFcolor} conversion (\type
-%D {\@@cr} equals \type {\relax}!).
-
-\def\handlecolorwith#1{\@EA#1\romannumeral0}
-
-%D Next comes the main definition macro.
-
-\def\dodefinecolor {\dododefinecolor\relax \setvalue \setevalue1}
-\def\dodefineglobalcolor{\dododefinecolor\doglobal\setgvalue\setxvalue1}
-\def\dodefinenamedcolor {\dododefinecolor\doglobal\setvalue \setevalue0}
-
-\def\dododefinecolor#1#2#3#4[#5][#6]% #2==set(g)value #3==set[e|x]value
- {#1\addtocommalist{#5}\colorlist % optional
- \doifassignmentelse{#6}
- {\@@resetcolorparameters
- \getparameters[\??cl @@][#6]%
- \ifx\@@cl@@h\empty
- \doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k}{\@@cl@@z\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse\@@cl@@s\@@cl@@z
- {\showmessage\m!colors8{{[#6]},#5}%
- #3{\??cr#5}{\colorZpattern}}
- {#3{\??cr#5}{\colorSpattern}}}
- {#3{\??cr#5}{\colorCpattern}}}
- {#3{\??cr#5}{\colorRpattern}}%
- \else
- \setxvalue{\??cr#5}{\colorHpattern}%
- \fi
- % new: e=external spot color name
- \ifx\@@cl@@e\empty \else
- \doregisterspotcolorname{#5}\@@cl@@e
- \fi}
- {\doifelsenothing\currentpalet
- \donefalse
- {\doifdefinedelse{\??cr\currentpalet#6}\donetrue\donefalse}%
- \ifdone
- \doifnot{#5}{#6}
- {#2{\??cr#5}{\paletcolorspec{#6}}}%
- \else
- \doifdefinedelse{\??cr#6}
- {\doifelse{#5}{#6}
- {% this way we can freeze \definecolor[somecolor][somecolor]
- % and still prevent cyclic definitions
- \iffreezecolors#3{\??cr#5}{\csname\??cr#6\endcsname}\fi}
- {\iffreezecolors\@EA#3\else\@EA#2\fi{\??cr#5}{\csname\??cr#6\endcsname}}}
- {\showmessage\m!colors3{#5 (def)}}%
- \fi}%
- \ifcase#4\or
- \unexpanded#2{#5}{\switchtocolor[#5]}% \unexpanded toegevoegd
- \fi}
-
-\def\paletcolorspec#1%
- {\csname\??cr\currentpalet#1\endcsname}
-
-%D Hex color support is not enabled by default. You need to say \type
-%D {\setupcolor [hex]} to get this working.
-
-\ifx\colorHpattern\undefined \let\colorHpattern\colorZpattern \fi
-
-%D New and experimental.
-
-\def\dodefinespotcolor[#1][#2][#3]% todo: always global
- {\doifnot{#1}{#2}
- {\@@resetcolorparameters
- \doglobal\addtocommalist{#1}\colorlist % optional
- \edef\@@cl@@n{#2}%
- \getparameters[\??cl @@][#3]%
- \doifnothing\@@cl@@p{\let\@@cl@@p\!!plusone}%
- \ifx\@@cl@@e\empty \else
- \doregisterspotcolorname{#2}\@@cl@@e
- \fi
- \doglobal\addtocommalist{#2}\allspotcolors
- \setxvalue{\??cr#1}{\colorPpattern}% was \setevalue
- \setgvalue{#1}{\switchtocolor[#1]}}} % was \setvalue
-
-\def\registerusedspotcolors
- {\ifx\allspotcolors\empty \else
- \bgroup
- \let\usedspotcolors\empty
- \def\docommand##1%
- {\doifdefined{\??cs##1}{\addtocommalist{##1}\usedspotcolors}}%
- \processcommacommand[\allspotcolors]\docommand
- \savecurrentvalue\usedspotcolors\usedspotcolors
- \egroup
- \fi}
-
-\def\registerusedcolorchannels
- {\bgroup
- \doifdefinedelse{\??cs c}
- {\def\usedcolorchannels{c,m,y,k}}%
- {\let\usedcolorchannels\empty}%
- \doifdefined{\??cs r}
- {\addtocommalist{r,g,b}\usedcolorchannels}%
- \doifdefined{\??cs s}
- {\ExpandBothAfter\doifnotinset{k}\usedcolorchannels
- {\addtocommalist{s}\usedcolorchannels}}%
- \savecurrentvalue\usedcolorchannels\usedcolorchannels
- \egroup}
-
-\prependtoks
- \registerusedspotcolors
- \registerusedcolorchannels
-\to \everylastshipout
-
-\def\registerusedspotcolor#1%
- {\global\@EA\chardef\csname\??cs#1\endcsname\zerocount}
-
-%D On top of spotcolors, we define multitone colors. You'd better know
-%D what you're doing because invalid definitions will lead to invalid
-%D documents (i.e.\ resources).
-
-% \definecolor [darkblue] [c=.5,m=.5]
-% \definecolor [darkyellow] [y=.5]
-%
-% \definemultitonecolor [whatever] [darkblue=.5,darkyellow=.5] [c=.25,m=.25,y=.25] [a=1,t=.5]
-% \definemultitonecolor [another] [darkblue=.5,darkyellow=.5] [c=.25,m=.25,y=.25]
-
-\def\dodefinemultitonecolor[#1][#2][#3][#4]%
- {\let\@@cl@@cl@@D\empty % n's
- \let\@@cl@@cl@@P\empty % p's
- \let\@@cl@@cl@@N\empty % name
- \scratchcounter\zerocount
- \processcommacommand[#2]\dododefinemultitonecolor
- \bgroup
- \lccode`\.=`\_%
- \lccode`\,=`\_%
- \lccode`\:=`\_%
- \lccode`\;=`\_%
- \lccode`\+=`\_%
- \lccode`\-=`\_%
- \lccode`\*=`\_%
- \lccode`\/=`\_%
-% \lccode`\_=`\_%
- % not needed, other attribute in driver:
- %
- % \@@resetcolorparameters
- % \getparameters[#4]%
- % \ifx\@@cl@@t\@@cl@@z\else
- % \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\@@cl@@t_\@@cl@@a}%
- % \fi
- \lowercase\@EA{\@EA\xdef\@EA\@@cleancolor\@EA{\@@cl@@cl@@N}}%
- \egroup
- \setxvalue{\??cl\@@cleancolor\s!check}{\noexpand\docheckmultitonecolor{\@@cl@@cl@@D}}%
- \expanded{\defineglobalcolor[\@@cleancolor][#3,#4]}%
- \expanded{\definespotcolor[#1][\@@cleancolor][#4,f=\the\scratchcounter,p={\@@cl@@cl@@P},d={\@@cl@@cl@@D}]}}
-
-\def\docheckmultitonecolor#1%
- {\flushatshipout
- {\let\checkmultitonecolor\gobbleoneargument
- \def\docommand##1{\hbox{\definecolor[\s!dummy-100][##1][p=1]\color[\s!dummy-100]}}%
- \processcommalist[#1]\docommand}}
-
-\def\checkmultitonecolor#1%
- {\csname\??cl#1\s!check\endcsname\letgvalue{\??cl#1\s!check}\relax}
-
-\def\dodefinespotcolor[#1][#2][#3]% todo: always global (REDEFINED)
- {\doifnot{#1}{#2}
- {\@@resetcolorparameters
- \doglobal\addtocommalist{#1}\colorlist % optional
- \edef\@@cl@@n{#2}%
- \getparameters[\??cl @@][#3]%
- \doifnothing \@@cl@@p{\let\@@cl@@p\!!plusone}%
- \doifsomething\@@cl@@e{\doregisterspotcolorname{#2}\@@cl@@e}%
- \doglobal\addtocommalist{#2}\allspotcolors
- \setxvalue{\??cr#1}{\colorPpattern}% was \setevalue
- \setgvalue{#1}{\switchtocolor[#1]}}}% was \setvalue
-
-\def\dododefinemultitonecolor#1%
- {\advance\scratchcounter\plusone
- \splitstring#1\at=\to\!!stringa\and\!!stringb
- \ifx\@@cl@@cl@@D\empty
- \let\@@cl@@cl@@D\!!stringa
- \let\@@cl@@cl@@P\!!stringb
- \normalizecolor\!!stringb
- \edef\@@cl@@cl@@N{\!!stringa_\!!stringb}%
- \else
- \edef\@@cl@@cl@@D{\@@cl@@cl@@D,\!!stringa}%
- \edef\@@cl@@cl@@P{\@@cl@@cl@@P,\!!stringb}%
- \normalizecolor\!!stringb
- \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\!!stringa_\!!stringb}%
- \fi}
-
-% \def\dododefinemultitonecolor#1% a/b safe
-% {\advance\scratchcounter\plusone
-% \splitstring#1\at=\to\@@cl@@one\and\@@cl@@two
-% \ifx\@@cl@@cl@@D\empty
-% \let\@@cl@@cl@@D\@@cl@@one
-% \let\@@cl@@cl@@P\@@cl@@two
-% \normalizecolor\@@cl@@two
-% \edef\@@cl@@cl@@N{\@@cl@@one_\@@cl@@two}%
-% \else
-% \edef\@@cl@@cl@@D{\@@cl@@cl@@D,\@@cl@@one}%
-% \edef\@@cl@@cl@@P{\@@cl@@cl@@P,\@@cl@@two}%
-% \normalizecolor\@@cl@@two
-% \edef\@@cl@@cl@@N{\@@cl@@cl@@N_\@@cl@@one_\@@cl@@two}%
-% \fi}
-
-%D The names of colors are stored in a comma separated list
-%D only for the purpose of showing them with \type {\showcolor}.
-%D
-%D \startbuffer
-%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D \getbuffer
-%D
-%D This color shows up as \color [SomeKindOfRed] {some kind
-%D of red}.
-%D
-%D \starttyping
-%D \setupcolors[state=start]
-%D
-%D \definecolor[mygreen][green]
-%D \definecolor[green][g=.5]
-%D
-%D \startcolor[mygreen]test\stopcolor
-%D
-%D \setupcolors[expansion=no]
-%D
-%D \definecolor[mygreen][green]
-%D \definecolor[green][g=.5]
-%D
-%D \startcolor[mygreen]test\stopcolor
-%D \stoptyping
-
-%D \macros
-%D {startcolormode,stopcolormode,permitcolormode}
-%D
-%D We use \type{\stopcolormode} to reset the color in
-%D whatever color space and do so by calling the corresponding
-%D special. Both commands can be used for fast color
-%D switching, like in colored verbatim,
-
-\newif\ifpermitcolormode \permitcolormodetrue
-
-\def\dowithcolor#1#2% #1=\action #2=color
- {\ifincolor\ifpermitcolormode
- \ifcsname\??cr\currentpalet#2\endcsname
- \handlecolorwith#1\csname\??cr\currentpalet#2\endcsname\od
- \else\ifcsname\??cr#2\endcsname
- \handlecolorwith#1\csname\??cr#2\endcsname\od
- \fi\fi
- \fi\fi}
-
-\def\startcolormode % includes \ifincolor\ifpermitcolormode
- {%\dostoptransparency % needed for: {test \trans test \notrans test}
- \conditionalstoptransparency
- \dowithcolor\execcolorRCSP}
-
-\def\stopcolormode
- {\ifincolor\ifpermitcolormode
- \supportedstoptransparency
- \dostopcolormode
- \fi\fi}
-
-\def\restorecolormode
- {\ifincolor\ifpermitcolormode
- \supportedstoptransparency
- \dostopcolormode
- \ifx\maintextcolor\empty \else
- \startcolormode\maintextcolor
- \fi
- \fi\fi}
-
-%D Color modes are entered using the next set of commands.
-%D The \type{\stop} alternatives are implemented in a way
-%D that permits non||grouped use.
-%D
-%D The, for this module redundant, check if we are in color
-%D mode is needed when we use these macros in other modules.
-
-\def\execcolorRCSP#1:%
- {\csname execcolor#1\endcsname}
-
-\def\execcolorR
- {\iffilterspotcolor
- \@EA\noexeccolorR
- \else
- \@EA\doexeccolorR
- \fi}
-
-\def\execcolorC
- {\iffilterspotcolor
- \@EA\noexeccolorC
- \else
- \@EA\doexeccolorC
- \fi}
-
-\def\execcolorS
- {\iffilterspotcolor
- \@EA\noexeccolorS
- \else
- \@EA\doexeccolorS
- \fi}
-
-\def\execcolorP
- {\iffilterspotcolor
- \@EA\doexeccolorPP
- \else\ifcase\currentcolorchannel
- \@EAEAEA\doexeccolorP
- \else
- \@EAEAEA\noexeccolorP
- \fi\fi}
-
-\def\doexeccolorR#1:#2:#3:%
- {\edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
- \ifpreferGRAY\ifx\@@cl@@r\@@cr@@g\ifx\@@cl@@r\@@cl@@b
- \GRAYpreferedtrue
- \fi\fi\fi
- \ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
- \ifGRAYprefered
- \registercolorchannel\c!s
- \let\@@cl@@s\@@cl@@r
- \normalizeGRAY
- \doexeccolorgray
- \else\ifRGBsupported
- \registercolorchannel\c!r
- \normalizeRGB
- \doexeccolorrgb
- \else\ifCMYKsupported
- \registercolorchannel\c!c
- \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
- \normalizeCMYK
- \doexeccolorcmyk
- \else
- \registercolorchannel\c!s
- \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
- \normalizeGRAY
- \doexeccolorgray
- \fi\fi\fi
- \exectransparency}
-
-\def\doexeccolorC#1:#2:#3:#4:%
- {\edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
- \ifpreferGRAY\ifx\@@cl@@k\@@cl@@z\ifx\@@cl@@c\@@cr@@m\ifx\@@cl@@c\@@cl@@y
- \GRAYpreferedtrue
- \fi\fi\fi\fi
- \ifincolor\else\RGBsupportedfalse\CMYKsupportedfalse\fi
- \ifGRAYprefered
- \registercolorchannel\c!s
- \let\@@cl@@s\@@cl@@c
- \normalizeGRAY
- \doexeccolorgray
- \else\ifCMYKsupported
- \registercolorchannel\c!c
- \ifreduceCMYK
- \convertCMYKtoCMY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \fi
- \normalizeCMYK
- \doexeccolorcmyk
- \else\ifRGBsupported
- \registercolorchannel\c!r
- \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \normalizeRGB
- \doexeccolorrgb
- \else
- \registercolorchannel\c!s
- \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \normalizeGRAY
- \doexeccolorgray
- \fi\fi\fi
- \exectransparency}
-
-\def\doexeccolorS#1:%
- {\edef\@@cl@@s{#1}%
- \registercolorchannel\c!s
- \normalizeGRAY
- \doexeccolorgray
- \exectransparency}
-
-% \def\doexeccolorP#1:#2:%
-% {\edef\@@cl@@n{#1}%
-% \edef\@@cl@@p{#2}%
-% \registerusedspotcolor\@@cl@@n
-% \ifSPOTsupported
-% \dowithcolor\registerspotcolor\@@cl@@n
-% \dostartspotcolormode\@@cl@@n\@@cl@@p
-% \else
-% \doingspotcolortrue
-% \let\spotcolorfactor\@@cl@@p
-% \factorizecolortrue % using counter and array
-% \dowithcolor\execcolorRCSP\@@cl@@n
-% \factorizecolorfalse
-% \let\spotcolorfactor\@@cl@@o
-% \doingspotcolorfalse
-% \fi
-% \exectransparency}
-
-\def\doexeccolorP#1:#2:#3:#4:%
- {\edef\@@cl@@n{#1}% name
- \edef\@@cl@@f{#2}% fractions
- \edef\@@cl@@d{#3}% definitions
- \edef\@@cl@@p{#4}%
- \ifx\@@cl@@d\empty
- \let\@@cl@@d\@@cl@@n
- \fi
- \registerusedspotcolor\@@cl@@n
- \ifSPOTsupported
- \checkmultitonecolor\@@cl@@n
- \dowithcolor\registerspotcolor\@@cl@@n
- \dostartspotcolormode\@@cl@@n\@@cl@@p
- \else
- \doingspotcolortrue
- \normalizespotcolor\@@cl@@p
- \let\spotcolorfactor\@@cl@@p
- \factorizecolortrue % using counter and array
- \dowithcolor\execcolorRCSP\@@cl@@n
- \factorizecolorfalse
- \let\spotcolorfactor\@@cl@@o
- \doingspotcolorfalse
- \fi
- \exectransparency}
-
-\def\doexeccolorPindex#1:#2:#3:#4:%
- {\edef\@@cl@@n{#1}%
- \edef\@@cl@@f{#2}%
- \edef\@@cl@@d{#3}%
- \edef\@@cl@@p{#4}%
- \ifx\@@cl@@d\empty
- \let\@@cl@@d\@@cl@@n
- \fi
- \ifSPOTsupported
- \checkmultitonecolor\@@cl@@n
- \dowithcolor\registerindexcolor\@@cl@@n
- \fi
- \noexectransparency}
-
-\def\doexeccolorPP#1:#2:%
- {\edef\@@cl@@n{#1}%
- \edef\@@cl@@p{#2}%
- \registerusedspotcolor\@@cl@@n
- \ifx\@@cl@@n\currentspotcolor
- \normalizeSPOT
- \dostartgraycolormode\@@cl@@p % was spotcolormode
- \else
- \dovidecolor\@@cl@@p\@@cl@@o
- \fi
- \exectransparency}
-
-\def\doexeccolorrgb
- {\ifcase\currentcolorchannel
- \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
- \or \or \or \or
- \or \dostartgraycolormode\@@cl@@r
- \or \dostartgraycolormode\@@cl@@g
- \or \dostartgraycolormode\@@cl@@b
- \fi}
-
-\def\doexeccolorcmyk
- {\ifcase\currentcolorchannel
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \or \negatecolorcomponent\@@cl@@c\dostartgraycolormode\@@cl@@c
- \or \negatecolorcomponent\@@cl@@m\dostartgraycolormode\@@cl@@m
- \or \negatecolorcomponent\@@cl@@y\dostartgraycolormode\@@cl@@y
- \or \negatecolorcomponent\@@cl@@k\dostartgraycolormode\@@cl@@k
- \fi}
-
-\def\doexeccolorgray
- {\ifcase\currentcolorchannel
- \dostartgraycolormode\@@cl@@s
- \or \or \or
- \or \dostartgraycolormode\@@cl@@s
- \or \or \or
- \or \dostartgraycolormode\@@cl@@s
- \fi}
-
-%D When filtering colors, we need to either erase
-%D the background, or ignore the foreground.
-
-% \newif\ifhidesplitcolor \hidesplitcolortrue
-%
-% \def\noexeccolor#1\od
-% {\dostartgraycolormode\@@cl@@o}
-%
-% \let\noexeccolorS\noexeccolor
-% \let\noexeccolorP\noexeccolor
-
-%D Well, here comes some real trickery. When we have the 100\%
-%D spot color or black color, we don't want to erase the
-%D background. So, instead we hide the content by giving it
-%D zero transparency.
-
-% todo : #1#2#3 met #2 > of < and #3 een threshold
-
-\def\dohidecolor#1#2%
- {\ifhidesplitcolor
- \ifx#1#2%
- \dostartgraycolormode\@@cl@@o
- \else
- \doregisternonecolor
- \dostartnonecolormode
- \fi
- \else
- \dostartgraycolormode\@@cl@@o
- \fi}
-
-\def\dovidecolor#1#2%
- {\ifhidesplitcolor
- \ifx#1#2%
- \doregisternonecolor
- \dostartnonecolormode
- \else
- \dostartgraycolormode\@@cl@@o
- \fi
- \else
- \dostartgraycolormode\@@cl@@o
- \fi}
-
-% \def\fullytransparentcolor % fails on floats
-% {\dostartgraycolormode\@@cl@@o % better than z
-% %\global\@EA\chardef\csname\@@currenttransparent\endcsname\plusone
-% %\global\intransparenttrue
-% \dostarttransparency10}
-
-\def\noexeccolorR#1:#2:#3:#4\od
- {\edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
- \dohidecolor\@@cl@@s\@@cl@@o}
-
-\def\noexeccolorC#1:#2:#3:#4:#5\od
- {\edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
- \dohidecolor\@@cl@@s\@@cl@@o}
-
-\def\noexeccolorS#1:#2\od
- {\edef\@@cl@@s{#1}%
- \dohidecolor\@@cl@@s\@@cl@@o}
-
-\def\noexeccolorP#1:#2:#3:#4:#5\od
- {\edef\@@cl@@p{#4}%
- \dohidecolor\@@cl@@p\@@cl@@z}
-
-%D For the sake of postprocessing (i.e.\ color separation)
-%D we can normalize colors, which comes down to giving equal
-%D values an equal accuracy and format. This feature is
-%D turned off by default due to a speed penalty. This macro
-%D also handles spot color percentages.
-
-\newif\iffactorizecolor
-\newif\ifnormalizecolor
-
-\def\spotcolorfactor{1}
-
-% \def\normalizecolor#1%
-% {\colordimen#1\thousandpoint
-% \colordimen\spotcolorfactor\colordimen
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#1{\realcolorvalue\colorcount}}
-
-\def\normalizecolor#1%
- {\colorcount\numexpr(\dimexpr\spotcolorfactor\dimexpr#1\thousandpoint\relax\relax+\medcard)/\maxcard\relax
- \edef#1{\realcolorvalue\colorcount}}
-
-% \def\normalizespotcolor#1%
-% {\colordimen-#1\thousandpoint
-% \advance\colordimen\thousandpoint
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#1{\realcolorvalue\colorcount}}
-
-\def\normalizespotcolor#1%
- {\colorcount\numexpr(\dimexpr\thousandpoint-#1\thousandpoint\relax+\medcard)/\maxcard\relax
- \edef#1{\realcolorvalue\colorcount}}
-
-\def\donormalizeRGB
- {\normalizecolor\@@cl@@r
- \normalizecolor\@@cl@@g
- \normalizecolor\@@cl@@b}
-
-\def\normalizeRGB
- {\ifnormalizecolor
- \donormalizeRGB
- \else\iffactorizecolor
- \donormalizeRGB
- \fi\fi}
-
-\def\donormalizeCMYK
- {\normalizecolor\@@cl@@c
- \normalizecolor\@@cl@@m
- \normalizecolor\@@cl@@y
- \normalizecolor\@@cl@@k}
-
-\def\normalizeCMYK
- {\ifnormalizecolor
- \donormalizeCMYK
- \else\iffactorizecolor
- \donormalizeCMYK
- \fi\fi}
-
-\def\donormalizeGRAY
- {\normalizecolor\@@cl@@s}
-
-\def\normalizeGRAY
- {\ifnormalizecolor
- \donormalizeGRAY
- \else\iffactorizecolor
- \donormalizeGRAY
- \fi\fi}
-
-\def\normalizeSPOT
- {\normalizespotcolor\@@cl@@p}
-
-%D We need to register spot colors (i.e.\ resources need to
-%D be created.
-
-\def\registerspotcolor#1:%
- {\ifcsname\??cl:\c!p:\@@cl@@n\endcsname
- \@EA\dontregisterspotcolor
- \else
- \letgvalue{\??cl:\c!p:\@@cl@@n}\empty
- %\@EA\@EA\csname registerspotcolor#1\endcsname
- \csname registerspotcolor#1\@EA\endcsname
- \fi}
-
-% todo: convert to rgb if needed, will will do this in mkiv
-
-\def\dontregisterspotcolor #1\od{}
-\def\registerspotcolorR #1:#2:#3:#4\od{\doregisterrgbspotcolor \@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}}
-\def\registerspotcolorC#1:#2:#3:#4:#5\od{\doregistercmykspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}{#4}}
-\def\registerspotcolorS #1:#2\od{\doregistergrayspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}}
-\def\registerspotcolorP #1:#2:#3\od{\doregistergrayspotcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#2}}
-
-%D Experimental feature:
-
-% \definecolor [darkblue] [c=1,m=.38,y=0,k=.64] % pantone pms 2965 uncoated m
-% \definecolor [darkyellow] [c=0,m=.28,y=1,k=.06] % pantone pms 124 uncoated m
-%
-% \definecolor [darkblue-50] [darkblue] [p=.5]
-% \definecolor [darkyellow-50] [darkyellow] [p=.5]
-% \definecolor [darkblue-80] [darkblue] [p=.8]
-% \definecolor [darkyellow-80] [darkyellow] [p=.8]
-%
-% \definecolor [darkblue,darkyellow] [r=.8]
-% \definecolor [darkdull-5030] [darkblue,darkyellow] [p={.5,.3}]
-%
-% \setupcolors[state=start]
-%
-% \blackrule[width=4cm,height=3cm,color=darkblue-50]
-% \blackrule[width=4cm,height=3cm,color=darkblue-80]
-% \blackrule[width=4cm,height=3cm,color=darkyellow-50]
-% \blackrule[width=4cm,height=3cm,color=darkyellow-80]
-% \blackrule[width=4cm,height=3cm,color=darkdull-5030]
-
-%D Experimental too (special purpose code).
-
-\def\registerindexcolor#1:%
- {\ifcsname\??cl:i:\@@cl@@n\endcsname
- \@EA\dontregisterindexcolor
- \else
- \letgvalue{\??cl:i:\@@cl@@n}\empty % signal
- \showmessage\m!colors{12}\@@cl@@n
- \@EA\@EA\csname registerindexcolor#1\endcsname
- \fi}
-
-\let\dontregisterindexcolor\dontregisterspotcolor
-
-\def\registerindexcolorR #1:#2:#3:#4\od{\doregisterrgbindexcolor \@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}}
-\def\registerindexcolorC#1:#2:#3:#4:#5\od{\doregistercmykindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}{#2}{#3}{#4}}
-\def\registerindexcolorS #1:#2\od{\doregistergrayindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#1}}
-\def\registerindexcolorP #1:#2:#3\od{\doregistergrayindexcolor\@@cl@@n\@@cl@@f\@@cl@@d\@@cl@@p{#2}}
-
-\def\predefinecolor[#1]%
- {\bgroup
- \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
- \egroup}
-
-\def\predefineindexcolor[#1]%
- {\bgroup
- \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
- \let\doexeccolorP\doexeccolorPindex
- \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% index one
- \egroup}
-
-% \def\checkpredefinedcolor[#1]%
-% {\ifcase\internalspotcolorsize{#1}\relax
-% \@EA\predefinecolor\or\@EA\predefinecolor\else\@EA\predefineindexcolor
-% \fi[#1]}
-
-\let\checkpredefinedcolor\predefineindexcolor % we need an index in order to negate bitmaps
-
-%D Transparency is handled similar for all three color modes. We
-%D can turn transparency off with the following switch:
-
-\newif\iftransparencysupported \transparencysupportedtrue % only mkii
-
-\def\exectransparency
- {\iftransparencysupported
- \expandafter\doexectransparency
- \else
- \expandafter\noexectransparency
- \fi}
-
-\def\doexectransparency#1:#2\od
- {\ifcase#1\space
- \global\intransparentfalse
- \else
- \global\intransparentfalse
- %\dostarttransparency{#1}{#2}%
- \supportedstarttransparency{#1}{#2}%
- \global\intransparenttrue
- \fi}
-
-\def\noexectransparency#1\od
- {}
-
-%D Experimental: minimize transparency resets.
-
-\newif\ifintransparent
-\newif\ifoptimizetransparency \optimizetransparencytrue % under test
-
-\let\supportedstoptransparency\relax
-
-\def\conditionalstoptransparency
- {\ifoptimizetransparency
- \ifintransparent
- \global\intransparentfalse
- \supportedstoptransparency
- \fi
- \else
- \supportedstoptransparency
- \fi}
-
-\def\supportedstarttransparency
- {\iftransparencysupported
- \globallet\supportedstoptransparency\dostoptransparency
- \expandafter\dostarttransparency
- \else
- \expandafter\gobbletwoarguments
- \fi}
-
-%D We now use the \type {\@@cl@@A} hook to implement
-%D symbolic names. These are converted into numbers
-%D at definition time (which saves runtime).
-
-\def\dodefinetransparency[#1][#2]%
- {\@EA\chardef\csname\??cl-#1\endcsname#2\relax}
-
-\def\transparencynumber#1%
- {\number\executeifdefined{\??cl-#1}{#1}}
-
-%D Now we hook 'm into the patterns:
-
-\def\@@cl@@A{\transparencynumber\@@cl@@a}
-
-%D The next macro can be used to return to the (normal)
-%D page color. This macro is used in the same way as
-%D \type {\color}.
-
-\def\startregistercolor[#1]%
- {\permitcolormodefalse\startcolor[#1]\permitcolormodetrue}
-
-\def\stopregistercolor
- {\permitcolormodefalse\stopcolor\permitcolormodetrue}
-
-\def\starttextcolor[#1]%
- {\doifsomething{#1}
- {\bgroup
- \def\stoptextcolor % also goes ok with \page after
- {\let\maintextcolor\empty % this one because the top of
- \stopregistercolor % page sets the color right (side
- \egroup}% % effect)
- \def\starttextcolor[##1]%
- {\bgroup
- % \@@themaintextcolor==##1 is catched in \definecolor
- \definecolor[\@@themaintextcolor][##1]%
- \let\stoptextcolor\egroup}%
- \startregistercolor[\@@themaintextcolor]%
- \definecolor[\@@themaintextcolor][#1]%
- \let\maintextcolor\@@themaintextcolor}}
-
-\let\stoptextcolor\relax
-
-%D The following hook permits proper support at the text
-%D level. This definition actually belongs in another
-%D module. (May need a different \MKIV\ implementation.)
-
-% \ifx\initializemaintextcolor\undefined
-
- \let\@@clprevcolor\empty
-
- \def\initializemaintextcolor
- {% saveguard for setting text color to empty after
- % it has been set
- \doifnothing\@@cltextcolor
- {\ifx\@@clprevcolor\empty\else
- \let\@@cltextcolor\defaulttextcolor
- \fi}%
- \doifelsenothing\@@cltextcolor
- {\let\maintextcolor\empty}
- {\edef\@@clprevcolor{\@@cltextcolor}%
- \let\maintextcolor\@@themaintextcolor
- \doifelsenothing\@@cltextcolor % another saveguard
- {\definecolor[\@@themaintextcolor][\defaulttextcolor]}%
- {\definecolor[\@@themaintextcolor][\@@cltextcolor]}%
- \doinitializemaintextcolor}}
-
- \def\doinitializemaintextcolor
- {\appendtoks\starttextcolor[\@@themaintextcolor]\to\everystarttext
- \appendtoks\stoptextcolor \to\everystoptext
- \let\doinitializemaintextcolor\relax}
-
-% \fi
-
-\def\localstarttextcolor
- {\ifx\maintextcolor\empty
- \startcolormode\defaulttextcolor
- \else
- \startcolormode\maintextcolor
- \fi}
-
-% \def\localstoptextcolor
-% {\stopcolormode}
-%
-% better:
-
-\def\localstoptextcolor
- {\restorecolormode}
-
-\def\restoretextcolor
- {\ifx\maintextcolor\empty
- \expandafter\dorestoretextcolor
- \else
- % obey main text color
- \fi}
-
-\def\dorestoretextcolor
- {\color[\defaulttextcolor]}
-
-%D We use some reserved names for local color components.
-%D Consistent use of these scratch variables saves us
-%D unneccessary hash entries.
-%D
-%D \starttyping
-%D \@@cl@@r \@@cl@@g \@@cl@@b
-%D \@@cl@@c \@@cl@@m \@@cl@@y \@@cl@@k
-%D \@@cl@@s
-%D \stoptyping
-%D
-%D We implement several conversion routines.
-%D
-%D \starttyping
-%D \convertRGBtoCMYK {r} {g} {b}
-%D \convertRGBtoGRAY {r} {g} {b}
-%D \convertCMYKtoRGB {c} {m} {y} {k}
-%D \convertCMYKtoGRAY {c} {m} {y} {k}
-%D \convertCMYKtoCMY {c} {m} {y} {k}
-%D \stoptyping
-%D
-%D The relation between \cap{Gray}, \cap{RGB} and \cap{CMYK}
-%D is:
-%D
-%D \placeformula[-]
-%D \startformula
-%D G = .30r + .59g + .11b
-%D = 1.0 - \min(1.0,\ .30c + .59m + .11y + k)
-%D \stopformula
-%D
-%D When converting from \cap{CMYK} to \cap{RGB} we use the
-%D formula:
-%D
-%D \placeformula[-]
-%D \startformula
-%D \eqalign
-%D {r &= 1.0 - \min(1.0,\ c+k) \cr
-%D g &= 1.0 - \min(1.0,\ m+k) \cr
-%D b &= 1.0 - \min(1.0,\ y+k)}
-%D \stopformula
-%D
-%D In the conversion routine the color components are calculated
-%D in three digits precision.
-
-\def\realcolorvalue#1%
- {\ifnum#1>\zerocount % important, first encountered in --modu supp-mpe
- \ifnum#1<\plusten 0.00\the#1\else
- \ifnum#1<\plushundred 0.0\the#1\else
- \ifnum#1<\plusthousand 0.\the#1\else
- 1\fi\fi\fi
- \else 0\fi}
-
-% \def\doconvertCMYKtoRGB#1\k#2\to#3%
-% {\ifdim#2\points>#1\points% >= problem, repaired 2/12/2002
-% \let#3\@@cl@@z % k >= color
-% \else
-% \colordimen\onepoint
-% \advance\colordimen -#1\points
-% \advance\colordimen -#2\points
-% \multiply\colordimen \plusthousand
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#3{\realcolorvalue\colorcount}%
-% \fi}
-
-\def\doconvertCMYKtoRGB#1\k#2\to#3%
- {\colorcount\numexpr(\dimexpr\plusthousand\dimexpr\onepoint-#1\points-#2\points\relax\relax+\medcard)/\maxcard\relax
- \ifnum\colorcount>\zeropoint
- \edef#3{\realcolorvalue\colorcount}%
- \else
- \let#3\@@cl@@z
- \fi}
-
-\def\convertCMYKtoRGB#1#2#3#4%
- {\doconvertCMYKtoRGB#1\k#4\to\@@cl@@r
- \doconvertCMYKtoRGB#2\k#4\to\@@cl@@g
- \doconvertCMYKtoRGB#3\k#4\to\@@cl@@b}
-
-% \def\doconvertRGBtoCMYK#1\to#2%
-% {\colordimen#1\points
-% \multiply\colordimen \plusthousand
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \colorcount-\colorcount
-% \advance\colorcount \plusthousand
-% \edef#2{\realcolorvalue\colorcount}}
-
-\def\doconvertRGBtoCMYK#1\to#2%
- {\colorcount\numexpr\plusthousand-(\dimexpr\plusthousand\dimexpr#1\points\relax\relax+\medcard)/\maxcard\relax
- \edef#2{\realcolorvalue\colorcount}}
-
-\def\convertRGBtoCMYK#1#2#3%
- {\doconvertRGBtoCMYK#1\to\@@cl@@c
- \doconvertRGBtoCMYK#2\to\@@cl@@m
- \doconvertRGBtoCMYK#3\to\@@cl@@y
- \let\@@cl@@k\@@cl@@z}
-
-%D The following switch is mainly meant for (hidden)
-%D documentation purposes.
-
-\def\nGRAYfactor{333.333}
-\def\rGRAYfactor{\ifweightGRAY300\else\nGRAYfactor\fi}
-\def\gGRAYfactor{\ifweightGRAY590\else\nGRAYfactor\fi}
-\def\bGRAYfactor{\ifweightGRAY110\else\nGRAYfactor\fi}
-
-% \def\convertRGBtoGRAY#1#2#3%
-% {\colordimen#1\points
-% \colordimen\rGRAYfactor\colordimen
-% \colorcount\colordimen
-% \colordimen#2\points
-% \colordimen\gGRAYfactor\colordimen
-% \advance\colorcount \colordimen
-% \colordimen#3\points
-% \colordimen\bGRAYfactor\colordimen
-% \advance\colorcount \colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef\@@cl@@s{\realcolorvalue\colorcount}}
-
-\def\convertRGBtoGRAY#1#2#3%
- {\colorcount\numexpr
- (\dimexpr\rGRAYfactor\dimexpr#1\points\relax\relax+
- \dimexpr\gGRAYfactor\dimexpr#2\points\relax\relax+
- \dimexpr\bGRAYfactor\dimexpr#3\points\relax\relax+
- \medcard)/\maxcard
- \relax
- \edef\@@cl@@s{\realcolorvalue\colorcount}}
-
-\def\convertCMYKtoGRAY#1#2#3#4%
- {\convertCMYKtoRGB{#1}{#2}{#3}{#4}%
- \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b}
-
-% \def\doconvertCMYKtoCMY#1\k#2\to#3%
-% {\colordimen#1\points
-% \advance\colordimen #2\points\relax
-% \ifdim\colordimen>\onepoint
-% \colordimen\onepoint
-% %\else
-% % \colordimen\colordimen
-% \fi
-% \multiply\colordimen \plusthousand
-% \colorcount\colordimen
-% \advance\colorcount \medcard
-% \divide\colorcount \maxcard
-% \edef#3{\realcolorvalue\colorcount}}
-
-\def\doconvertCMYKtoCMY#1\k#2\to#3%
- {\colorcount\numexpr(\dimexpr\plusthousand\dimexpr#1\points+#2\points\relax\relax+\medcard)/\maxcard\relax
- \ifnum\colorcount>\plusthousand
- \let#3\@@cl@@o
- \else
- \edef#3{\realcolorvalue\colorcount}%
- \fi}
-
-\def\convertCMYKtoCMY#1#2#3#4%
- {\doconvertCMYKtoCMY#1\k#4\to\@@cl@@c
- \doconvertCMYKtoCMY#2\k#4\to\@@cl@@m
- \doconvertCMYKtoCMY#3\k#4\to\@@cl@@y
- \let\@@cl@@k\@@cl@@z}
-
-%D Before we present the color macros, we first define the
-%D setup command. This command takes care of setting up the
-%D booleans that control local and global behavior (more on
-%D that later) and conversion to other color spaces.
-
-\let\currentspotcolor \empty
-\let\previousspotcolor\empty
-
-%D The tests depend on the use of constants. If we use the \MKIV\
-%D method we can share more.
-
-\def\doifcolorelse#1%
- {\ifcsname\??cr\ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi#1\endcsname
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
-
-\def\doifcolor#1%
- {\ifcsname\??cr\ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi#1\endcsname
- \expandafter\firstofoneargument
- \else
- \expandafter\gobbleoneargument
- \fi}
-
-%D There are a couple of different color switching macros,
-%D the local ones can be used to speed up things (only in \MKII).
-
-\def\localstartcolor
- {\ifincolor
- \localcolortrue
- \expandafter\doglobalstartcolor
- \else
- \expandafter\noglobalstartcolor
- \fi}
-
-\def\localstopcolor
- {\ifincolor
- \doglobalstopcolor
- \else
- \noglobalstopcolor
- \fi}
-
-\unexpanded\def\startcolor
- {\ifincolor
- \expandafter\doglobalstartcolor
- \else
- \expandafter\noglobalstartcolor
- \fi}
-
-\unexpanded\def\stopcolor
- {\ifincolor
- \doglobalstopcolor
- \else
- \noglobalstopcolor
- \fi}
-
-%D This macros call the global color switching ones. Starting
-%D a global, i.e. a possible page boundary crossing, color
-%D mode also sets a \type{\mark} in \TEX's internal list.
-
-\newcount\colorlevel
-
-\letvalue{\??cl0C}\empty % saved color
-\letvalue{\??cl0S}\empty % stop command
-
-%D We keep a positive color stack for foreground colors, and
-%D a negative one for backgrounds. Not that brilliant a
-%D solution, but it suits. The signs are swapped when the
-%D page ornaments are typeset.
-
-\let\@@colorplus \plusone
-\let\@@colorminus\minusone
-
-\def\@@currentcolorname {\??cl\the\colorlevel C}
-\def\@@currentcolorstop {\??cl\the\colorlevel S}
-%def\@@currenttransparent{\??cl\the\colorlevel T}
-
-\letvalue{\??cl*\s!black}\s!black
-
-\def\currentcolorname
- {\csname
- \ifcsname\@@currentcolorname\endcsname
- \expandafter\ifx\csname\@@currentcolorname\endcsname\empty
- \??cl*\s!black
- \else
- \@@currentcolorname
- \fi
- \else
- \??cl*\s!black
- \fi
- \endcsname}
-
-\def\outercolorname
- {\ifcsname\@@currentcolorname\endcsname
- \expandafter\ifx\csname\@@currentcolorname\endcsname\empty
- \s!black
- \else
- currentcolor%
- \fi
- \else
- \s!black
- \fi}
-
-% not the following, because we need a different tag in order to trick the stack
-%
-% \def\outercolorname{\executeifdefined\@@currentcolorname\s!black}
-%
-% \def\startcurrentcolor{\expanded{\startcolor[\s!black]\noexpand\startcolor[\outercolorname]}}
-% \def\stopcurrentcolor {\stopcolor\stopcolor}
-%
-% test case:
-%
-% \setupcolors[state=start,textcolor=red]
-% \starttext
-% red
-% \color[green]{green
-% \startMPcode
-% label(\sometxt{green\color[blue]{blue}green}, origin) withcolor red;
-% draw fullcircle scaled 1cm xscaled 2;
-% \stopMPcode
-% green}
-% red
-% \stoptext
-
-\def\dodoglobalstartcolor
- {\global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
- \global\advance\colorlevel \@@colorplus
- \global\@EA\let\csname\@@currentcolorname\endcsname\@@askedcolor
- %\debuggerinfo\m!colors
- % {start \@@askedcolor\space at level \the\colorlevel}%
- \ifx\@@askedcolor\empty
- \global\@EA\let\csname\@@currentcolorname\endcsname\@@currentcolor
- \global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
- \else\ifx\@@askedcolor\@@currentcolor
- \global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
- \else
- \doifcolorelse\@@askedcolor
- {%\docolormark\@@askedcolor
- \ifpermitcolormode\docolormark\@@askedcolor\fi
- \global\@EA\let\csname\@@currentcolorstop\endcsname\dodoglobalstopcolor
- \startcolormode\@@askedcolor}
- {\global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
- \showmessage\m!colors3\@@askedcolor\empty}%
- \fi\fi}
-
-\def\doglobalstartcolor[#1]%
- {\edef\@@askedcolor{#1}%
- \ifcase\colorlevel\relax
- \ifx\@@askedcolor\empty
- \global\@EA\let\csname\@@currentcolorstop\endcsname\empty
- \else
- \dodoglobalstartcolor
- \fi
- \else
- \dodoglobalstartcolor
- \fi
- \ignorespaces}
-
-\def\noglobalstartcolor[#1]%
- {}
-
-\def\dodoglobalstopcolor
- {\ifcase\colorlevel \else
- \donoglobalstopcolor
- \global\@EA\let\@EA\@@previouscolor\csname\@@currentcolorname\endcsname
- \ifcase\colorlevel\relax
- \ifpermitcolormode
- \docolormark\empty
- \conditionalstoptransparency
- \dostopcolormode
- \fi
- \else % let's do a bit redundant testing here
- \docolormark\@@previouscolor
- \ifx\@@previouscolor\empty
- \ifpermitcolormode
- \conditionalstoptransparency
- \dostopcolormode
- \fi
- \else
- \doifcolorelse\@@previouscolor
- {\ifx\@@currentcolor\@@previouscolor\else
- % alternatively we could let \startcolormode handle this
- \ifpermitcolormode
- \conditionalstoptransparency % really needed
- % more safe but less efficient: \dostopcolormode
- \fi
- \startcolormode\@@previouscolor
- \fi}
- {\ifpermitcolormode
- \conditionalstoptransparency
- \dostopcolormode
- \fi}%
- \fi
- \fi
- \fi}
-
-\def\donoglobalstopcolor
- {\ifcase\colorlevel \else
- \global\@EA\let\@EA\@@currentcolor\csname\@@currentcolorname\endcsname
- %\debuggerinfo{\m!colors}
- % {stop \@@currentcolor\normalspace at level \the\colorlevel}%
- \global\advance\colorlevel \@@colorminus
- \fi}
-
-\def\doglobalstopcolor
- {\csname\@@currentcolorstop\endcsname}
-
-\let\noglobalstopcolor\relax
-
-\let\faststartcolor\doglobalstartcolor
-\let\faststopcolor \doglobalstopcolor
-
-%D We don't use grouping and save each stop alternative. This
-%D permits be especially useful in for instance local color
-%D support in verbatim. Using \type{\bgroup}||\type{\egroup}
-%D pairs could interfere with calling commands
-
-%D This color mechanism takes care of nested colors, like in:
-%D
-%D \startbuffer
-%D \color[green]{groen \color[green]{groen \color[red]{rood}} groen}
-%D \color[green]{groen \color[]{groen \color[red]{rood}} groen}
-%D \color[green]{groen \color[red]{rood \color[red]{rood}} groen}
-%D \color[green]{groen \color[green]{groen \color[]{groen}} groen}
-%D \color[green]{groen \color[red]{rood} groen}
-%D \color[green]{groen \color[]{groen} groen}
-%D \color[]{zwart \color[red]{rood} zwart}
-%D \color[]{zwart}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D or
-%D
-%D \startvoorbeeld
-%D \startlines
-%D \getbuffer
-%D \stoplines
-%D \stopvoorbeeld
-%D
-%D Crossing page boundaries is of course also handled.
-%D Undefined or empty color specifications are treated as
-%D efficient as possible.
-%D
-%D \startbuffer
-%D \startcolor[green]
-%D [green] \input tufte [green] \par
-%D \startcolor[]
-%D [green] \input knuth [green] \par
-%D \startcolor[red]
-%D [red] \input tufte [red] \par
-%D \startcolor[yellow]
-%D [yellow] \input knuth [yellow] \par
-%D \stopcolor
-%D [red] \input tufte [red] \par
-%D \stopcolor
-%D [green] \input knuth [green] \par
-%D \stopcolor
-%D [green] \input tufte [green] \par
-%D \stopcolor
-%D \stopbuffer
-%D
-%D \startpacked
-%D \getbuffer
-%D \stoppacked
-%D
-%D These quotes are typeset by saying:
-%D
-%D \typebuffer
-
-%D We already mentioned that colors interfere with building
-%D the pagebody. This means that when the page is composed,
-%D the colors temporary have to be reset. After the page is
-%D shipped out, we have to revive the current color.
-%D
-%D We use \type{\mark}s to keep track of colors across page
-%D boundaries. Unfortunately standard \TEX\ supports only one mark,
-%D and using this one for color support only would be a waste.
-%D We therefore use an adapted version of J.~Fox's multiple mark
-%D mechanism as (re|)|implemented in \module{supp-mrk}.
-
-\doifdefinedelse{rawnewmark}
- {\rawnewmark\colormark}
- {\let\colormark\gobbleoneargument}
-
-%D Using this mark mechanism with lots of colors has one
-%D major drawback: \TEX's memory tends to overflow when
-%D very colorful text is stored in a global box. Even worse is that
-%D the processing time grows considerably. We therefore support
-%D local as well as global color switching.
-%D
-%D Of the next macros, \type {\popcolor} is to be used after
-%D the actual \type {\shipout} and \type {\startcolorpage} and
-%D \type {\stopcolorpage} are called when entering and leaving
-%D the \type {\pagebody} builder. In case of emergencies
-%D \type {\pushcolor} can be used to undo the current color,
-%D for instance when insertions are appended to the page.
-%D
-%D Out of efficiency we only use marks when needed. The next
-%D macro tries to find out if indeed a mark should be set.
-%D This macro uses the boolean \type {\ifinpagebody}, which can
-%D be defined and set in the module that handles the pagebody.
-
-\def\docolormark#1%
- {\iflocalcolor \else \ifinpagebody \else \ifinframed \else
- \dodocolormark{#1}%
- \fi \fi \fi}
-
-\let\lastcolormark=\empty
-
-\def\dodocolormark#1%
- {\edef\newcolormark{#1}%
- \ifx\newcolormark\lastcolormark\else
- \global\let\lastcolormark\newcolormark
- \@EA\rawsetmark\@EA\colormark\@EA{\lastcolormark}%
- \fi}
-
-%D \macros
-%D {pushcolor, popcolor}
-%D
-%D Pushing the current state in the output routine simply comes
-%D to resetting the color to black, while popping restores the
-%D color state to that of before the break.
-
-\def\topofpagecolor{\rawgetbotmark\colormark} % see postponing
-
-\def\pushcolor
- {\stopcolormode}
-
-\def\popcolor
- {\doifsomething{\rawgetbotmark\colormark}
- {%\debuggerinfo\m!colors{popping \getbotmark\colormark}%
- \startcolormode{\rawgetbotmark\colormark}}}
-
-\def\popsplitcolor
- {\getsplitmarks\colormark % hier wel
- \doifsomething{\rawgetsplitbotmark\colormark}
- {%\debuggerinfo\m!colors{split popping \getsplitbotmark\colormark}%
- \startcolormode{\rawgetsplitbotmark\colormark}}}
-
-\appendtoks\pushcolor \to\everypushproperties
-\appendtoks\popcolor \to\everypopproperties
-\appendtoks\popsplitcolor\to\everypopsplitproperties
-
-% Private macro: only needed in test cases (like multiple
-% seperations in one file); no user command!
-
-\def\resynccolor
- {\ifcase\pagetotal % \ifdim\pagetotal=\zeropoint
- \popcolor
- \else\ifx\@@currentcolor\empty
- \ifx\maintextcolor\empty\else
- \startcolormode\maintextcolor
- \fi
- \else
- \startcolormode\@@currentcolor
- \fi\fi}
-
-% weird stuff
-
-\def\pushpostponedpagecolor
- {\edef\savedtopofpagecolor{\topofpagecolor}%
- \doifsomething\savedtopofpagecolor\restorecolormode} % \stopcolormode
-
-\def\poppostponedpagecolor
- {\doifsomething\savedtopofpagecolor\startcolormode\savedtopofpagecolor}
-
-%D \macros
-%D {startcolorpage, stopcolorpage}
-%D
-%D Local use can be forced with the next two macros. Nesting
-%D is still supported but colors are no longer marked.
-%D
-%D The next implementation makes (simple) color separation more
-%D easy. It also supports nested colors in page backgrounds
-%D and texts.
-
-\def\startcolorpage
- {\bgroup
- \let\@@colorplus \minusone
- \let\@@colorminus\plusone
- \let\docolormark\gobbleoneargument
- \edef\savedcolorlevel{\the\colorlevel}%
- \global\colorlevel\zerocount % before \localstartcolor of
- \ifx\maintextcolor\empty % course, ugly bug removed
- \localstartcolor[\defaulttextcolor]%
- \else
- \localstartcolor[\maintextcolor]%
- \fi}
-
-\def\stopcolorpage
- {\localstopcolor
- \global\colorlevel\savedcolorlevel
- \egroup}
-
-\appendtoks \startcolorpage\to\everystarttextproperties
-\prependtoks\stopcolorpage \to\everystoptextproperties
-
-%D We want color support to be similar to font support and
-%D therefore implement \type{\color} using grouping.
-%D
-%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.
-
-\unexpanded\def\color[#1]%
- {\groupedcommand{\startcolor[#1]}\stopcolor}
-
-%D This implementation enables use of defined colors like:
-%D
-%D \starttyping
-%D Look at the {\brightgreen bright} side of life and get
-%D yourself no \red{red} head!
-%D \stoptyping
-
-%D Also wrong, test in combinations: \type{...{}{\red test}}
-%D
-%D \def\switchtocolor[#1]%
-%D {\startcolor[#1]\aftergroup\stopcolor}
-
-\def\switchtocolor[#1]% grouping is realy needed, else migration
- {\bgroup\startcolor[#1]\aftergroup\stopcolor\aftergroup\egroup}
-
-\unexpanded\def\color[#1]%
- {\groupedcommand{\startcolor[#1]}\stopcolor}
-
-\unexpanded\def\graycolor[#1]% not \gray because this is a color
- {\groupedcommand{\RGBsupportedfalse\CMYKsupportedfalse\SPOTsupportedfalse\startcolor[#1]}\stopcolor}
-
-%D We can speed the following macros a bit up, but this
-%D hardly pays off; they are only used in the manual.
-
-\def\realcolorformat#1%
- {\ifnum#1<\plusten 0.00\the#1\else
- \ifnum#1<\plushundred 0.0\the#1\else
- \ifnum#1<\plusthousand 0.\the#1\else
- 1.000\fi\fi\fi}
-
-\def\dodoformatcolor#1%
- {\colordimen#1\points\relax
- \ifdim\colordimen>\onepoint
- \colordimen\onepoint
- \fi
- \multiply\colordimen \plusthousand
- \colorcount\colordimen
- \advance\colorcount \medcard
- \divide\colorcount \maxcard \relax
- \realcolorformat\colorcount}
-
-\def\doformatcolorR#1:#2:#3:#4:#5\od
- {\dodoformatcolor{#1}\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}}
-
-\def\doformatcolorC#1:#2:#3:#4:#5:#6\od
- {\dodoformatcolor{#1}\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}\colorformatseparator
- \dodoformatcolor{#4}}
-
-\def\doformatcolorS#1:#2:#3\od
- {\dodoformatcolor{#1}}
-
-\def\doformatcolorP#1:#2:#3:#4:#5:#6\od
- {#1\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}\colorformatseparator
- \dodoformatcolor{#4}\colorformatseparator}
-
-\def\doformatcolor#1:%
- {\csname doformatcolor#1\endcsname}
-
-\def\colorvalue
- {\dowithcolor\doformatcolor}
-
-\def\doformatgrayR#1:#2:#3:#4:#5\od
- {\convertRGBtoGRAY{#1}{#2}{#3}%
- \dodoformatcolor\@@cl@@s}
-
-\def\doformatgrayC#1:#2:#3:#4:#5:#6\od
- {\convertCMYKtoGRAY{#1}{#2}{#3}{#4}%
- \dodoformatcolor\@@cl@@s}
-
-\def\doformatgrayS#1:#2:#3\od
- {\dodoformatcolor{#1}}
-
-% \def\doformatgrayP#1:#2:#3:#4:#5:#6\od
-% {\convertSPOTtoGRAY{#1}{#2}{#3}{#4}%
-% \dodoformatcolor\@@cl@@s}
-
-\def\doformatgrayP#1:#2:#3:#4:#5:#6\od
- {todo}
-
-\def\doformatgray#1:%
- {\csname doformatgray#1\endcsname}
-
-\def\grayvalue
- {\dowithcolor\doformatgray}
-
-%D \macros
-%D {localstartraster,localstopraster,
-%D startraster,stopraster}
-%D
-%D The previous conversions are not linear and treat each color
-%D component according to human perception curves. Pure gray
-%D (we call them rasters) has equal color components. In
-%D \CONTEXT\ rasters are only used as backgrounds and these
-%D don't cross page boundaries in the way color does. Therefore
-%D we don't need stacks and marks. Just to be compatible with
-%D color support we offer both 'global' and 'local' commands.
-%D
-%D \starttyping
-%D \def\localstartraster[#1]%
-%D {\doifelsenothing{#1}
-%D {\dostartgraymode\@@rsscreen}
-%D {\dostartgraymode{#1}}}
-%D
-%D \def\localstopraster
-%D {\dostopgraymode}
-%D
-%D \let\startraster\localstartraster
-%D \let\stopraster \localstopraster
-%D \stoptyping
-%D
-%D The next alternative is slower, since it works on top of the
-%D color (stack) mechanism, but it does provide nesting.
-
-\def\dosetrastercolor#1%
- {\edef\@@cl@@s{#1}%
- \ifx\@@cl@@s\empty
- \let\@@cl@@s\@@rsscreen
- \fi
- \let\@@cl@@t\@@cl@@z % else we get rogue
- \let\@@cl@@a\@@cl@@z % transpancies
- \setevalue{\??cr\??rs}{\colorSpattern}}
-
-% beware, don't add extra grouping, else color in tables
-% fails
-
-\def\localstartraster[#1]%
- {\ifincolor\dosetrastercolor{#1}\localstartcolor[\??rs]\fi}
-
-\def\startraster[#1]%
- {\ifincolor\dosetrastercolor{#1}\startcolor[\??rs]\fi}
-
-\def\localstopraster{\ifincolor\localstopcolor\fi}
-\def\stopraster {\ifincolor\stopcolor\fi}
-
-\def\raster[#1]{\groupedcommand{\startraster[#1]}{\stopraster}}
-
-%D Palets use an auxiliary macro:
-
-\def\dodefinepaletcolor#1#2#3%
- {\doifassignmentelse{#3}
- {% == \definepalet[test][xx={y=.4}]
- \definecolor[\??pa#1:#2][#3]%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{\??cr#1:#2}{\csname\??cr\??pa#1:#2\endcsname}}
- {% == \definepalet[test][xx=green]
- \doifdefinedelse{\??cr#3}
- {\iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{\??cr#1:#2}{\csname\??cr#3\endcsname}}
- {\letvalue{\??cr#1:#2}\colorXpattern}}}
-
-%D \MP\ related conversions:
-
-\def\scaledMPcolor#1#2%
- {\ifMPgraphics
- \handlecolorwith\doMPcolor
- \csname\??cr
- \ifcsname\??cr\currentpalet#2\endcsname\currentpalet\fi
- #2\endcsname
- :::::::\end#1\end
- \else
- #2%
- \fi}
-
-\def\MPcolor{\scaledMPcolor1}
-
-%D Before we had transparency available, the following
-%D conversion macro was available:
-%D
-%D \starttyping
-%D \def\doMPcolor#1:#2:#3:#4:#5:#6:#7:#8\end
-%D {\if #1R(#2,#3,#4)%
-%D \else\if#1C\ifMPcmykcolors cmyk(#2,#3,#4,#5)\else(1-#2-#5,1-#3-#5,1-#4-#5)\fi
-%D \else\if#1S(#2,#2,#2)%
-%D \else (0,0,0)%
-%D \fi\fi\fi}
-%D \stoptyping
-%D
-%D In order to be useful, this macro is to be fully
-%D expandabele.
-
-\def\doMPcolor#1:% #1 can be \relax ! ! ! i.e. an empty color
- {\csname MPc\@EA\ifx\csname MPc\string#1\endcsname\relax B\else#1\fi\endcsname}
-
-\def\MPcR{\doMPrgb}
-\def\MPcC{\ifMPcmykcolors\@EA\doMPcmykY\else\@EA\doMPcmykN\fi}
-\def\MPcS{\doMPgray}
-\def\MPcP{\ifMPspotcolors\@EA\doMPspotY\else\@EA\doMPspotN\fi}
-\def\MPcB{\doMPblack}
-
-\def\transparentMP {transparent}
-\def\cmykMP {scaledcmyk}
-\def\cmykASrgbMP {scaledcmykasrgb} % not really needed any more
-\def\rgbMP {scaledrgb}
-\def\grayMP {scaledgray}
-\def\spotMP {spotcolor}
-
-\def\doMPtransparent#1#2:#3:#4\end
- {\ifcase#2\space(#1)\else\transparentMP(#2,#3,(#1))\fi}
-
-\def\doMPgray#1:#2\end#3\end
- {\doMPtransparent{\grayMP(#1,#3)}#2\end}
-
-\def\doMPrgb#1:#2:#3:#4\end#5\end
- {\doMPtransparent{\rgbMP(#1,#2,#3,#5)}#4\end}
-
-\def\doMPcmykY#1:#2:#3:#4:#5\end#6\end
- {\doMPtransparent{\cmykMP(#1,#2,#3,#4,#6)}#5\end}
-
-\def\doMPcmykN#1:#2:#3:#4:#5\end#6\end
- {\doMPtransparent{\cmykASrgbMP(#1,#2,#3,#4,#6)}#5\end}
-
-\def\doMPspotY#1:#2:#3:#4:#5\end#6\end % best make #3 same as #1 when empty
- {\doMPtransparent{multitonecolor("#1",#2,"#3","#4")}#5\end}
-
-\def\doMPspotN#1:#2:#3:#4:#5\end#6\end
- {\scaledMPcolor{#4}{#1}}
-
-\def\doMPblack#1\end#2\end
- {\unknownMPcolor}
-
-\def\unknownMPcolor
- {(0,0,0)}
-
-\let\processMP\spotMP % for some time, will become obsolete, brrr
-
-%D \PDF\ related conversions:
-
-\def\PDFcolor #1{\handlecolorwith\doPDFcolor \csname\??cr#1\endcsname:::::::\end}
-\def\PDFcolorvalue#1{\handlecolorwith\doPDFcolorvalue\csname\??cr#1\endcsname:::::::\end}
-\def\FDFcolor #1{\handlecolorwith\doFDFcolor \csname\??cr#1\endcsname:::::::\end}
-
-\def\doPDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
- {\if #1R#2 #3 #4 rg%
- \else\if#1C#2 #3 #4 #5 k%
- \else\if#1S#2 g%
- \else\if#1P#5 g%
- \else 0 g%
- \fi\fi\fi\fi}
-
-\def\doPDFcolorvalue#1:#2:#3:#4:#5:#6:#7:#8\end
- {\if #1R#2 #3 #4%
- \else\if#1C#2 #3 #4 #5%
- \else\if#1S#2%
- \else\if#1P#5%
- \else 0%
- \fi\fi\fi\fi}
-
-\def\doFDFcolor#1:#2:#3:#4:#5:#6:#7:#8\end
- {[\if #1R#2 #3 #4%
- \else\if#1C#2 #3 #4 #5%
- \else\if#1S#2%
- \else\if#1P#5%
- \else 0%
- \fi\fi\fi\fi]}
-
-\def\internalspotcolorname#1{\handlecolorwith\dointernalspotcolorname\csname\??cr#1\endcsname:::::::\end}
-\def\internalspotcolorsize#1{\handlecolorwith\dointernalspotcolorsize\csname\??cr#1\endcsname:::::::\end}
-
-\def\dointernalspotcolorname#1:#2:#3:#4:#5:#6:#7:#8\end{\if#1P\ifcase0#3 #1\else#2\fi\else#1\fi}
-\def\dointernalspotcolorsize#1:#2:#3:#4:#5:#6:#7:#8\end{\if#1P\ifcase0#3 0\else#3\fi\else 0\fi}
-
-%D Slow but ok \unknown
-
-\def\colorcomponents#1% might be broken
- {\startnointerference
- \localcolortrue
- \globallet\thecolorcomponents\empty
- \def\doexeccolorR ##1:##2:##3:##4:##5\od{\gdef\thecolorcomponents{r=\twodigitrounding{##1} g=\twodigitrounding{##2} b=\twodigitrounding{##3}}}%
- \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\gdef\thecolorcomponents{c=\twodigitrounding{##1} m=\twodigitrounding{##2} y=\twodigitrounding{##3} k=\twodigitrounding{##4}}}%
- \def\doexeccolorS ##1:##2:##3\od{\gdef\thecolorcomponents{s=\twodigitrounding{##1}}}%
- \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\gdef\thecolorcomponents{p=\twodigitrounding{##4} n=##1}}%
- \let\doexeccolorPindex\doexeccolorP
- \backgroundline[#1]{}%
- \stopnointerference
- \thecolorcomponents}
-
-\def\transparencycomponents#1%
- {\startnointerference
- \localcolortrue
- \globallet\thetransparencycomponents\empty
- \def\doexeccolorR ##1:##2:##3:##4:##5\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##4} t=\twodigitrounding{##5}}}%
- \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##5} t=\twodigitrounding{##6}}}%
- \def\doexeccolorS ##1:##2:##3\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##2} t=\twodigitrounding{##3}}}%
- \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\gdef\thetransparencycomponents{a=\twodigitrounding{##5} t=\twodigitrounding{##6}}}%
- \let\doexeccolorPindex\doexeccolorP
- \backgroundline[#1]{}%
- \stopnointerference
- \thetransparencycomponents}
-
-%D \macros
-%D {everyshapebox}
-%D
-%D A terrible hack, needed because we cannot have marks in
-%D shape boxes.
-
-\appendtoks \localcolortrue \to \everyshapebox
-
-\protect \endinput
diff --git a/tex/context/base/colo-new.mkiv b/tex/context/base/colo-new.mkiv
deleted file mode 100644
index edc1a6a15..000000000
--- a/tex/context/base/colo-new.mkiv
+++ /dev/null
@@ -1,336 +0,0 @@
-%D \module
-%D [ file=colo-ini,
-%D version=2007.08.08,
-%D title=\CONTEXT\ Color 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.
-
-\unprotect
-
-\chardef\colorversion=2
-
-% todo: palets in definecolor
-% todo: {\red xx} vs \red{xx}
-
-% check: registerusedspotcolors
-% check: registerusedcolorchannels
-% check: \currentcolorname
-% check: \outercolorname
-% check: \chardef\currentcolorchannel=0
-% check: \startcolormode
-% check: \newif\iffilterspotcolor \filterspotcolorfalse
-% check: \newif\ifdoingspotcolor \doingspotcolorfalse
-% check: \registercolorchannel
-
-% \def\mptexcolor#1{"\dogetattributeid\s!color \somecolorattribute{#1} A"}
-%
-% \startMPpage
-% fill fullcircle scaled 10cm ;
-% fill fullcircle scaled 5cm withprescript \mptexcolor{red} withpostscript \mptexcolor{black} ;
-% fill fullcircle scaled 3cm ;
-% draw btex test etex withprescript \mptexcolor{blue} ;
-% \stopMPpage
-
-\registerctxluafile{colo-new}{1.000}
-
-\ifx\currentcolormodel\undefined \newcount\currentcolormodel \fi
-
-\def\setcolormodel#1%
- {\currentcolormodel\ctxlua{tex.print(colors.setmodel('colormodel','#1'))}%
- \dosetattribute{colormodel}{\the\currentcolormodel}}
-
-\setcolormodel{all}
-
-\def\dosetupcolormodel
- {\ifincolor
- \ifRGBsupported
- \ifCMYKsupported
- \setcolormodel{all}%
- \else
- \setcolormodel{rgb}%
- \fi
- \else
- \ifCMYKsupported
- \setcolormodel{cmyk}%
- \else
- \setcolormodel{gray}%
- \fi
- \fi
- \else
- \setcolormodel{gray}%
- \fi}
-
-\appendtoks
- \dosetupcolormodel
-\to \everyjob
-
-% Currently in mkiv transparency is implemented independent of color. This costs
-% a bit more processing time but gives the possibility to apply transparency
-% independently in the future. Is this useful? If not we may as well combine them
-% again in the future. 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.
-
-% Since we couple definitions, we could stick to one test. Todo. Same for mpcolor.
-
-% \def\doactivatecolor#1% : in currentpalet, maybe not, ugly
-% {\ifcsname(cs:\currentpalet#1)\endcsname
-% \csname(cs:\currentpalet#1)\endcsname
-% \csname(ts:\currentpalet#1)\endcsname
-% \else
-% \csname(cs:#1)\endcsname
-% \csname(ts:#1)\endcsname
-% \fi}
-
-% \def\doactivatecolor#1% : in currentpalet, maybe not, ugly
-% {\csname(cs:\ifcsname(cs:\currentpalet#1)\endcsname\currentpalet\fi#1)\endcsname}
-% \csname(ts:\ifcsname(ts:\currentpalet#1)\endcsname\currentpalet\fi#1)\endcsname}
-%
-% more robust test, else we get \relaxed non-colors which may confuse e.g. mpcolor
-
-\letvalue{(cs:-}\empty
-\letvalue{(ts:-}\empty
-
-% \def\doactivatecolor#1% : in currentpalet, maybe not, ugly
-% {\csname(cs:\ifcsname(cs:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(cs:#1)\endcsname#1\else-\fi\fi)\endcsname
-% \csname(ts:\ifcsname(ts:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ts:#1)\endcsname#1\else-\fi\fi)\endcsname}
-
-\def\doactivatecolor#1% : in currentpalet, maybe not, ugly
- {\ifcsname(cs:\currentpalet#1)\endcsname
- \csname(cs:\currentpalet#1)\endcsname
- \csname(ts:\currentpalet#1)\endcsname
- \else\ifcsname(cs:#1)\endcsname
- \csname(cs:#1)\endcsname
- \csname(ts:#1)\endcsname
- \fi\fi}
-
-\let\normaldoactivatecolor\doactivatecolor
-
-% if it becomes a bottleneck we can set up a more complex system with one shared
-% attribute for colorspace, color and transparency
-
-\def\doactivatecolor
- {\ifproductionrun
- \ctxlua{colors.enabled=true transparencies.enabled=true}% not that efficient but at least robust
- \let\doactivatecolor\normaldoactivatecolor
- \expandafter\doactivatecolor
- \else
- \expandafter\normaldoactivatecolor
- \fi}
-
-\def\deactivatecolor
- {\doresetattribute\s!color
- \doresetattribute\s!transparency}
-
-\def\dodefinecolorcommand#1#2%
- {\unexpanded#1{#2}{\doactivatecolor{#2}}}
-
-\def\dodefinecolor[#1][#2]%
- {\addtocommalist{#1}\colorlist
- \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
- \dodefinecolorcommand\setvalue{#1}}
-
-\def\dodefineglobalcolor[#1][#2]%
- {\doglobal\addtocommalist{#1}\colorlist
- \ctxlua{ctx.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}%
- \dodefinecolorcommand\setgvalue{#1}}
-
-\def\dodefinenamedcolor[#1][#2]%
- {\doglobal\addtocommalist{#1}\colorlist
- \ctxlua{ctx.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
- \dodefinecolorcommand\setvalue{#1}}
-
-\def\dodefinespotcolor[#1][#2][#3]%
- {\doglobal\addtocommalist{#1}\colorlist % optional
- \doglobal\addtocommalist{#2}\allspotcolors
- \ctxlua{ctx.definespotcolor("#1","#2","#3",true)}%
- \dodefinecolorcommand\setxvalue{#1}}
-
-\def\dodefinemultitonecolor[#1][#2][#3][#4]%
- {\ctxlua{ctx.definemultitonecolor("#1","#2","#3","#4",true)}%
- \dodefinecolorcommand\setxvalue{#1}}
-
-\def\dodefinetransparency[#1][#2]%
- {\ctxlua{ctx.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))}}}
-
-\def\doifcolorelse#1%
- {\ifcsname(ca:\currentpalet#1)\endcsname
- \@EA\firstoftwoarguments
- \else\ifcsname(ca:#1)\endcsname
- \@EAEAEA\firstoftwoarguments
- \else
- \@EAEAEA\secondoftwoarguments
- \fi\fi}
-
-\def\doifcolor#1%
- {\ifcsname(ca:\currentpalet#1)\endcsname
- \@EA\firstofoneargument
- \else\ifcsname(ca:#1)\endcsname
- \@EAEAEA\firstofoneargument
- \else
- \@EAEAEA\gobbleoneargument
- \fi\fi}
-
-% currentcolor, then we can push pop in register
-
- \def\switchtocolor [#1]{\getvalue{#1}}
-\unexpanded\def\color [#1]{\groupedcommand{\doactivatecolor{#1}}{}}
-\unexpanded\def\startcolor [#1]{\begingroup\doactivatecolor{#1}}
-\unexpanded\def\stopcolor {\endgroup}
-\unexpanded\def\graycolor [#1]{\groupedcommand{\setcolormodel{gray}\getvalue{#1}}{}}
- \def\predefinecolor [#1]{\flushatshipout{\hbox{\color[#1]{}}}}
- \def\predefineindexcolor[#1]{\flushatshipout{\hbox{\color[#1]{}}}}
- \def\startcolorpage {\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}
- \def\stopcolorpage {\stopcolor}
- \def\localstartraster [#1]{\dosetrastercolor{#1}}
- \def\localstopraster {}
- \def\startraster [#1]{\dosetrastercolor{#1}}
- \def\stopraster {}
- \def\raster [#1]{\groupedcommand{\dosetrastercolor{#1}}{}}
- \def\faststartcolor [#1]{\doactivatecolor{#1}}
- \def\faststopcolor {}
-
-\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}
-
-% \def\pushpostponedpagecolor
-% {\edef\savedtopofpagecolor{\topofpagecolor}%
-% \doifsomething\savedtopofpagecolor\restorecolormode}
-%
-% \def\poppostponedpagecolor
-% {\doifsomething\savedtopofpagecolor\doactivatecolor\savedtopofpagecolor}
-%
-% no \topofpagecolor
-
-\let\pushpostponedpagecolor\relax
-\let\poppostponedpagecolor \relax
-
-% \def\pushcolor
-% {\edef\popcolor
-% {\dosetattribute\s!color {\dogetattribute\s!color }%
-% \dosetattribute\s!transparency{\dogetattribute\s!transparency}}%
-% \let\popsplitcolor\popcolor
-% \deactivatecolor}
-
-\appendtoks\deactivatecolor\to\everybeforeoutput % maybe we don't need push pop now
-
-\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\grey \graycolor
-\let\localstartcolor \startcolor
-\let\localstopcolor \stopcolor
-\let\globalstartcolor\startcolor
-\let\globalstopcolor \stopcolor
-
-\def\registermaintextcolor{\ctxlua{colors.main = \thecolorattribute\maintextcolor}}
-
-\def\starttextcolor[#1]%
- {\doifsomething{#1}
- {\definecolor[\@@themaintextcolor][#1]%
- \let\maintextcolor\@@themaintextcolor
- \doactivatecolor\maintextcolor
- \registermaintextcolor}}
-
-\let\stoptextcolor\relax
-
-\def\initializemaintextcolor
- {\doifelsenothing\@@cltextcolor
- {\definecolor[\@@themaintextcolor][\defaulttextcolor]}
- {\definecolor[\@@themaintextcolor][\@@cltextcolor]}%
- \let\maintextcolor\@@themaintextcolor
- \doactivatecolor\maintextcolor
- \registermaintextcolor}
-
-\appendtoks \initializemaintextcolor \to \everyjob
-
-\def\localstarttextcolor{\expanded{\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]%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(cs:#1:#2)}{\csname(cs:\??pa#1:#2)\endcsname}%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(ca:#1:#2)}{\csname(ca:\??pa#1:#2)\endcsname}}
- {\doifdefinedelse{(cs:#3)}% \definepalet[test][xx=green]
- {\iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(cs:#1:#2)}{\csname(cs:#3)\endcsname}%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(ca:#1:#2)}{\csname(ca:#3)\endcsname}}
- {\letvalue{(cs:#1:#2)}\undefined
- \letvalue{(ca:#1:#2)}\undefined}}}
-
-\setvalue{(cs:)}{} \setvalue{(ca:)}{0}
-\setvalue{(ts:)}{} \setvalue{(ta:)}{0}
-
-\def\doinheritca#1{\csname(ca:\ifcsname(ca:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ca:#1)\endcsname#1\fi\fi)\endcsname}
-\def\doinheritcs#1{\csname(cs:\ifcsname(cs:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(cs:#1)\endcsname#1\fi\fi)\endcsname}
-\def\doinheritta#1{\csname(ta:\ifcsname(ta:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ta:#1)\endcsname#1\fi\fi)\endcsname}
-\def\doinheritts#1{\csname(ts:\ifcsname(ts:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ts:#1)\endcsname#1\fi\fi)\endcsname}
-
-\def\MPcolor#1{\ctxlua{tex.sprint(ctx.mpcolor(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}}
-
-\def\currentcolorname{\s!black} % todo
-\def\outercolorname {\s!black} % todo
-
-\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"))}}
-
-% 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}
-
-\protect \endinput
diff --git a/tex/context/base/colo-new.tex b/tex/context/base/colo-new.tex
deleted file mode 100644
index 04b2ef716..000000000
--- a/tex/context/base/colo-new.tex
+++ /dev/null
@@ -1,1051 +0,0 @@
-%D \module
-%D [ file=colo-ini,
-%D version=2007.08.08,
-%D title=\CONTEXT\ Color 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 We need to clean this up further but first we hav eto make sure that mkiv
-%D code works ok.
-
-\writestatus{loading}{Context Color Macros / initialization}
-
-%D This module implements color. Since \MKII\ and \MKIV\ use a completely
-%D different approach, this module only implements a few generic mechanisms.
-
-\startmessages dutch library: colors
- title: kleur
- 1: systeem -- is globaal actief
- 2: systeem -- is lokaal actief
- 3: -- is niet gedefinieerd --
- 4: systeem -- wordt geladen
- 5: onbekend systeem --
- 6: palet -- is beschikbaar
- 7: palet -- is niet beschikbaar
- 8: specificatie -- bij -- wordt zwart
- 9: -- kleurruimte wordt niet ondersteund
- 10: -- kleurruimte wordt ondersteund
- 11: kleur wordt vertaald in grijs
- 12: -- is geregistreerd
-\stopmessages
-
-\startmessages english library: colors
- title: color
- 1: system -- is global activated
- 2: system -- is local activated
- 3: -- is not defined --
- 4: system -- is loaded
- 5: unknown system --
- 6: palette -- is available
- 7: palette -- is not available
- 8: specification -- at color -- becomes black
- 9: -- color space is not supported
- 10: -- color space is supported
- 11: color is converted to gray
- 12: -- is registered
-\stopmessages
-
-\startmessages german library: colors
- title: farbe
- 1: system -- ist global aktiviert
- 2: system -- ist lokal aktiviert
- 3: -- ist undefiniert --
- 4: system -- ist geladen
- 5: unbekanntes System --
- 6: palette -- ist verfuegbar
- 7: palette -- ist nicht verfuegbar
- 8: Spezifikation -- bei Farbe -- wird schwarz
- 9: -- Farbraum wird nicht unterstuetzt
- 10: -- Farbraum wird unterstuetzt
- 11: Farbe wird in Grau umgewandelt
- 12: -- is registered
-\stopmessages
-
-\startmessages czech library: colors
- title: barva
- 1: system -- je globalne aktivovana
- 2: system -- je lokalne activovana
- 3: -- neni definovana --
- 4: system -- je nacten
- 5: neznamy system --
- 6: palette -- je k dispozici
- 7: palette -- neni k dispozici
- 8: specifikace -- v barve -- bude cerna
- 9: -- prostor barev neni podporovan
- 10: -- prostor barev je podporovan
- 11: barva je prevedena na sed
- 12: -- is registered
-\stopmessages
-
-\startmessages italian library: colors
- title: colore
- 1: sistema -- attivato globalmente
- 2: sistema -- attivato localmente
- 3: -- non definito --
- 4: sistema -- caricato
- 5: sistema -- sconosciuto
- 6: tavolozza -- resa disponibile
- 7: tavolozza -- non disponibile
- 8: specifica -- del colore -- convertita in nero
- 9: spazio dei colori -- non supportato
- 10: spazio dei colori -- supportato
- 11: il colore ø convertito in grigio
- 12: -- is registered
-\stopmessages
-
-\startmessages norwegian library: colors
- title: farge
- 1: system -- er aktivert globalt
- 2: system -- er aktivert lokalt
- 3: -- er udefinert --
- 4: system -- er lest inn
- 5: ukjent system --
- 6: palett -- er tilgjengelig
- 7: palett -- er ikke tilgjengelig
- 8: spesifikasjon -- for farge -- gir kun svart
- 9: -- fargerom er ikke støttet
- 10: -- fargerom er støttet
- 11: fargen vil bli vist som grø
- 12: -- is registered
-\stopmessages
-
-\startmessages romanian library: colors
- title: culori
- 1: sistem -- este activata global
- 2: sistem -- este activata local
- 3: -- nu este definita --
- 4: sistem -- este incarcata
- 5: sistem -- necunoscuta
- 6: paleta -- este disponibila
- 7: palette -- nu este disponibila
- 8: specificatia -- la culoarea -- devine neagra
- 9: spatiul de culoare -- nu este suportat
- 10: spatiul de culoare -- este suportat
- 11: culoarea este convertita la gri
- 12: -- is registered
-\stopmessages
-
-\startmessages french library: colors
- title: couleurs
- 1: le système -- est globalement activé
- 2: le système -- est localement activé
- 3: -- n'est pas défini --
- 4: le système -- est chargé
- 5: système -- inconnu
- 6: la palette -- est disponible
- 7: le palette -- n'est pas disponible
- 8: la spécification -- de la couleur -- devient noire
- 9: l'espace de couleur -- n'est pas supporté
- 10: -- l'espace de couleur est supporté
- 11: la couleur est convertie en niveau de gris
- 12: -- est enregistré
-\stopmessages
-
-\unprotect
-
-\chardef\colorversion=1 % temp, needed for tracing purposes, mkiv transition
-
-%D We use a couple of local registers. That way we don't have
-%D to group when converting colors. By the way, this is not
-%D really faster. We can sqeeze half a second runtime for 50K
-%D switches on a 1G machine, but the macros will become rather
-%D ugly then. To mention one such improvement: no colon
-%D after the key character (.25 sec).
-
-\newdimen\colordimen
-\newcount\colorcount
-
-%D When typesetting for paper, we prefer using the \cap{CMYK}
-%D color space, but for on||screen viewing we prefer \cap{RGB}
-%D (the previous implementation supported only this scheme).
-%D Independant of such specifications, we support some automatic
-%D conversions:
-%D
-%D \startitemize[packed]
-%D \item convert all colors to \cap{RGB}
-%D \item convert all colors to \cap{CMYK}
-%D \item convert all colors to gray scales
-%D \stopitemize
-%D
-%D We also support optimization of colors to gray scales.
-%D
-%D \startitemize[continue]
-%D \item reduce gray colors to gray scales
-%D \item reduce \cap{CMY} components to \cap{K}
-%D \stopitemize
-%D
-%D These options are communicated by means of:
-
-\newif\ifRGBsupported
-\newif\ifCMYKsupported
-\newif\ifSPOTsupported
-\newif\ifpreferGRAY
-\newif\ifGRAYprefered
-\newif\ifreduceCMYK
-\newif\ifconverttoGRAY
-\newif\ifweightGRAY \weightGRAYtrue
-
-\newif\ifconvertMPcolors
-\newif\ifreduceMPcolors
-\newif\ifforcegrayMPcolors
-
-%D The last boolean controls reduction of \cap{CMYK} to
-%D \cap{CMY} colors. When set to true, the black component
-%D is added to the other ones.
-%D
-%D Prefering gray is not the same as converting to gray.
-%D Conversion treats each color components in a different way,
-%D while prefering is just a reduction and thus a
-%D space||saving option.
-
-\newif\iffreezecolors \freezecolorsfalse
-\newif\ifincolor % true if colors enabled
-\newif\iflocalcolor
-
-\let\colorlist \empty
-\let\currentspotcolor \empty
-\let\allspotcolors \empty
-\let\usedspotcolors \empty
-\let\usedcolorchannels\empty
-\let\currentpalet \empty
-
-%D \macros
-%D {definecolor,defineglobalcolor,definenamedcolor,definespotcolor,definemultitonecolor}
-%D
-%D \startbuffer
-%D \definecolor [blue] [c=1,m=.38,y=0,k=.64] % pantone pms 2965 uncoated m
-%D \definecolor [yellow] [c=0,m=.28,y=1,k=.06] % pantone pms 124 uncoated m
-%D
-%D \definespotcolor [blue-100] [blue] [p=1]
-%D \definespotcolor [yellow-100] [yellow] [p=1]
-%D
-%D \definemultitonecolor [pdftoolscolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1]
-%D
-%D \useexternalfigure[demofig][mill.png][object=no]
-%D
-%D \startcombination[4*1]
-%D {\externalfigure[demofig]} {no color}
-%D {\externalfigure[demofig][color=pdftoolscolor]} {indexed duotone}
-%D {\externalfigure[demofig][color=blue-100]} {spot color}
-%D {\externalfigure[demofig][color=yellow-100]} {spot color}
-%D \stopcombination
-%D \stopbuffer
-%D
-%D \getbuffer \typebuffer
-
-\def\definecolor {\dodoubleargument\dodefinecolor}
-\def\defineglobalcolor {\dodoubleargument\dodefineglobalcolor}
-\def\definenamedcolor {\dodoubleargument\dodefinenamedcolor}
-\def\definespotcolor {\dotripleargument\dodefinespotcolor}
-\def\definemultitonecolor{\doquadrupleempty\dodefinemultitonecolor}
-
-% check: registerusedspotcolors
-% check: registerusedcolorchannels
-
-%D \macros
-%D {doifcolorelse, doifcolor}
-%D
-%D Switching to a color is done by means of the following
-%D command. Later on we will explain the use of palets. We
-%D define ourselves a color conditional first.
-
-\ifx\doifcolorelse\undefined
- \let\doifcolorelse\secondoftwoarguments
- \let\doifcolor \gobbleoneargument
-\fi
-
-%D \macros
-%D {localstartcolor,localstopcolor}
-%D
-%D Simple color support, that is without nesting, is provided
-%D by:
-
-\ifx\localstartcolor\undefined
- \let\localstartcolor\undefined
- \let\localstopcolor \undefined
-\fi
-
-%D \macros
-%D {faststartcolor,faststopcolor}
-%D
-%D No checking for arguments and such:
-
-\ifx\faststartcolor\undefined
- \def\faststartcolor[#1]{}
- \def\faststopcolor {}
-\fi
-
-%D These local ones may go away in future versions.
-
-%D \macros
-%D {startcolor,stopcolor}
-%D
-%D The more save method, the one that saves the current color
-%D state and returns to this state afterward, is activated by:
-%D
-%D \showsetup{startcolor}
-
-\ifx\startcolor\undefined
- \let\startcolor\undefined
- \let\stopcolor \undefined
-\fi
-
-%D \macros
-%D {startcurrentcolor,stopcurrentcolor}
-
-\def\startcurrentcolor{\startcolor[\outercolorname]}
-\def\stopcurrentcolor {\stopcolor}
-
-%D \macros
-%D {color,graycolor}
-%D
-%D This leaves the simple color command:
-%D
-%D \showsetup{color}
-%D \showsetup{graycolor}
-
-\ifx\color\undefined
- \def\color [#1]{}
- \def\graycolor[#1]{}
- \def\gray {\graycolor}
-\fi
-
-%D \macros
-%D {localstartraster,localstopraster,
-%D startraster,stopraster,raster}
-%D
-%D The previous conversions are not linear and treat each color
-%D component according to human perception curves. Pure gray
-%D (we call them rasters) has equal color components. In
-%D \CONTEXT\ rasters are only used as backgrounds and these
-%D don't cross page boundaries in the way color does. Therefore
-%D we don't need stacks and marks. Just to be compatible with
-%D color support we offer both 'global' and 'local' commands.
-
-\ifx\startraster\undefined
- \def\startraster [#1]{}
- \def\stopraster {}
- \def\raster [#1]{}
- \def\localstartraster[#1]{}
- \def\localstopraster {}
-\fi
-
-%D \macros
-%D {colorvalue, grayvalue}
-%D
-%D We can typeset the color components using \type{\colorvalue} and
-%D \type{\grayvalue}. The commands:
-%D
-%D \startbuffer
-%D color value of SomeKindOfRed: \colorvalue{SomeKindOfRed} \crlf
-%D gray value of SomeKindOfRed: \grayvalue{SomeKindOfRed}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D show us:
-%D
-%D \startvoorbeeld
-%D \getbuffer
-%D \stopvoorbeeld
-
-\def\colorformatseparator{ }
-
-\ifx\colorvalue\undefined
- \let\colorvalue\gobbleoneargument
- \let\grayvalue \gobbleoneargument
-\fi
-
-% check: \currentcolorname
-% check: \outercolorname
-
-%D \macros
-%D {setupcolor}
-%D
-%D Color definitions can be grouped in files with the name:
-%D
-%D \starttyping
-%D \f!colorprefix-identifier.tex
-%D \stoptyping
-%D
-%D where \type{\f!colorprefix} is \unprotect {\tttf \f!colorprefix}.
-%D Loading such a file is done by \protect
-%D
-%D \showsetup{setupcolor}
-%D
-%D Some default colors are specified in \type{colo-rgb.tex},
-%D which is loaded into the format by:
-%D
-%D \starttyping
-%D \setupcolor[rgb]
-%D \stoptyping
-
-\let\colorstyle\empty
-
-\def\setupcolor
- {\dosingleargument\dosetupcolor}
-
-\def\dosetupcolor[#1]%
- {\doifnot{#1}\colorstyle
- {\def\colorstyle{#1}%
- \processcommalist[#1]\dodosetupcolor}}
-
-\def\dodosetupcolor#1%
- {\makeshortfilename[\truefilename{\f!colorprefix#1}]%
- \startreadingfile
- \readsysfile\shortfilename
- {\showmessage\m!colors4\colorstyle}
- {\showmessage\m!colors5\colorstyle}%
- \stopreadingfile}
-
-\let\usecolors\setupcolor
-
-% check: \chardef\currentcolorchannel=0
-% check: \startcolormode
-% check: \newif\iffilterspotcolor \filterspotcolorfalse
-% check: \newif\ifdoingspotcolor \doingspotcolorfalse
-% check: \registercolorchannel
-
-%D \macros
-%D {definetransparency}
-%D
-%D This command numbers to names:
-
-\def\definetransparency
- {\dodoubleargument\dodefinetransparency}
-
-\def\setupcolors
- {\dosingleargument\dosetupcolors}
-
-\def\resetcolorsplitting
- {\chardef\currentcolorchannel\zerocount
- \let\currentspotcolor\empty
- \filterspotcolorfalse}
-
-\def\colorsplitsuffix{\ifcase\currentcolorchannel\else-\@@clsplit\fi}
-\def\colorsplitprefix{\ifcase\currentcolorchannel\else\@@clsplit-\fi}
-
-\def\setcolorsplitting
- {\resetsystemmode{\v!color\colorsplitsuffix}%
- \resetcolorsplitting
- \processaction
- [\@@clsplit]
- [ c=>\chardef\currentcolorchannel1,%
- m=>\chardef\currentcolorchannel2,%
- y=>\chardef\currentcolorchannel3,%
- k=>\chardef\currentcolorchannel4,%
- r=>\chardef\currentcolorchannel5,%
- g=>\chardef\currentcolorchannel6,%
- b=>\chardef\currentcolorchannel7,%
- s=>\chardef\currentcolorchannel8,%
- \v!no=>,% \currentcolorchannel0,% all colors
- \s!default=>,% \currentcolorchannel0,% all colors
- \s!unknown=>\filterspotcolortrue
- \edef\currentspotcolor{\commalistelement}]%
- \setsystemmode{\v!color\colorsplitsuffix}%
- \iffilterspotcolor \let\@@clrgb\v!no \fi}
-
-\ifx\dosetupcolormodel\undefined
- \let\dosetupcolormodel\relax
-\fi
-
-\def\dosetupcolors[#1]% some no longer make sense in MkIV
- {\getparameters[\??cl][#1]%
- \doifelse\@@clspot\v!yes
- \SPOTsupportedtrue
- \SPOTsupportedfalse
- \doifelsenothing\@@clsplit
- \resetcolorsplitting
- \setcolorsplitting
- \doifelse\@@clreduction\v!yes
- \reduceCMYKtrue
- \reduceCMYKfalse
- \doifelse\@@clexpansion\v!yes
- \freezecolorstrue
- \freezecolorsfalse
- \doifelse\@@clcriterium\v!all
- \hidesplitcolortrue
- \hidesplitcolorfalse
- \doifelse\@@clrgb\v!no
- {\ifRGBsupported \showmessage\m!colors {9}\v!rgb\RGBsupportedfalse\fi}
- {\ifRGBsupported\else\showmessage\m!colors{10}\v!rgb\RGBsupportedtrue \fi}%
- \doifelse\@@clcmyk\v!no
- {\ifCMYKsupported \showmessage\m!colors {9}\v!cmyk\CMYKsupportedfalse\fi}
- {\ifCMYKsupported\else\showmessage\m!colors{10}\v!cmyk\CMYKsupportedtrue \fi}%
- \doifelse\@@clmpcmyk\v!no
- {\ifMPcmykcolors \showmessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykcolorsfalse\fi}
- {\ifMPcmykcolors\else\showmessage\m!colors{10}{\v!mp\v!cmyk}\MPcmykcolorstrue \fi}%
- \doifelse\@@clmpspot\v!no
- {\ifMPspotcolors \showmessage\m!colors {9}{\v!mp\v!spot}\MPspotcolorsfalse\fi}
- {\ifMPspotcolors\else\showmessage\m!colors{10}{\v!mp\v!spot}\MPspotcolorstrue \fi}%
- \preferGRAYfalse
- \processaction
- [\@@clconversion]
- [ \v!yes=>\preferGRAYtrue,
- \v!always=>\preferGRAYtrue\RGBsupportedfalse\CMYKsupportedfalse]%
- \ifRGBsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \else\ifCMYKsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \convertMPcolorstrue
- \ifreduceCMYK
- \reduceMPcolorstrue
- \fi
- \else
- \ifconverttoGRAY\else\showmessage\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]%
- \dosetupcolormodel
- \initializemaintextcolor}
-
-%D \macros
-%D {startregistercolor,stopregistercolor,permitcolormode}
-%D
-%D If you only want to register a color, the switch \type
-%D {\ifpermitcolormode} can be used. That way the nested
-%D colors know where to go back to.
-
-\ifx\startregistercolor\undefined
- \def\startregistercolor[#1]{}
- \def\stopregistercolor {}
-\fi
-
-%D We use these macros for implementing text colors
-%D (actually, the first application was in foreground
-%D colors).
-%D
-%D \starttyping
-%D \starttextcolor[red]
-%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
-%D \stoptextcolor
-%D \stoptyping
-%D
-%D This is more efficient than the alternative:
-%D
-%D \starttyping
-%D \setupbackgrounds[text][foregroundcolor=red]
-%D \startregistercolor[red]
-%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
-%D \stopregistercolor
-%D \stoptyping
-
-\def\maintextcolor {}
-\def\defaulttextcolor {black}
-\def\@@themaintextcolor{themaintextcolor}
-
-\ifx\initializemaintextcolor\undefined
- \def\starttextcolor [#1]{}
- \def\stoptextcolor {}
- \def\initializemaintextcolor {}
-\fi
-
-\ifx\restoretextcolor\undefined % to be redone
- \let\restoretextcolor \firstofoneargument
- \let\localstarttextcolor\relax
- \let\localstoptextcolor \relax
-\fi
-
-%D In this documentation we will not go into too much details
-%D on palets. Curious users can find more information on this
-%D topic in \from[use of color].
-%D
-%D At the moment we implemented color in \CONTEXT\ color
-%D printing was not yet on the desktop. In spite of this lack our
-%D graphics designer made colorfull illustrations. When printed
-%D on a black and white printer, distinctive colors can come
-%D out equally gray. We therefore decided to use only colors
-%D that were distinctive in colors as well as in black and
-%D white print.
-%D
-%D Although none of the graphic packages we used supported
-%D logical colors and global color redefition, we build this
-%D support into \CONTEXT. This enabled us to experiment and
-%D also prepared us for the future.
-
-%D \macros
-%D {definepalet}
-%D
-%D Colors are grouped in palets. The colors in such a palet can
-%D have colorful names, but best is to use names that specify
-%D their use, like {\em important} or {\em danger}. As a sort
-%D of example \CONTEXT\ has some palets predefined,
-%D like:\footnote{At the time I wrote the palet support, I was
-%D reading 'A hort history of time' of S.~Hawkins, so that's
-%D why we stuck to quarks.}
-%D
-%D \starttyping
-%D \definepalet
-%D [alfa]
-%D [ top=rood:7,
-%D bottom=groen:6,
-%D up=blauw:5,
-%D down=cyaan:4,
-%D strange=magenta:3,
-%D charm=geel:2]
-%D \stoptyping
-%D
-%D It's formal definition is:
-%D
-%D \showsetup{definepalet}
-%D
-%D Visualized, such a palet looks like:
-%D
-%D \startbuffer[palet]
-%D \showpalet [alfa] [horizontal,name,number,value]
-%D \stopbuffer
-%D
-%D \startlinecorrection
-%D \getbuffer[palet]
-%D \stoplinecorrection
-%D
-%D This bar shows both the color and gray alternatives of the
-%D palet components (not visible in black and white print).
-%D
-%D When needed, one can copy a palet by saying:
-%D
-%D \starttyping
-%D \definepalet [TEXcolorpretty] [colorpretty]
-%D \stoptyping
-%D
-%D This saves us some typing in for instance the modules that
-%D deal with pretty verbatim typesetting.
-
-\def\definepalet
- {\dodoubleargument\dodefinepalet}
-
-\def\dodefinepalet[#1][#2]%
- {\doifassignmentelse{#2}
- {%\showmessage\m!colors6{#1}%
- \letvalue{\??pa#1}\empty
- \setevalue{\??pa\??pa#1}{#2}%
- \def\dodododefinepalet[##1=##2]%
- {\doifvaluesomething{\??pa#1}
- {\setevalue{\??pa#1}{\csname\??pa#1\endcsname,}}%
- \setevalue{\??pa#1}{\csname\??pa#1\endcsname##1}%
- \dodefinepaletcolor{#1}{##1}{##2}}%
- \def\dododefinepalet##1%
- {\dodododefinepalet[##1]}%
- \processcommalist[#2]\dododefinepalet}
- {\doifdefined{\??pa#2}
- {\expanded{\dodefinepalet[#1][\csname\??pa\??pa#2\endcsname]}}}}
-
-\ifx\dodefinepaletcolor\undefined
- \let\dodefinepaletcolor\gobblethreearguments
-\fi
-
-\let\paletsize\!!zerocount
-
-\def\getpaletsize[#1]%
- {\getcommacommandsize[\csname\??pa\??pa#1\endcsname]%
- \edef\paletsize{\number\commalistsize}}
-
-%D Instead of refering to colors, one can also directly specify
-%D a color:
-%D
-%D \starttyping
-%D \definepalet[test][xx=green]
-%D \definepalet[test][xx={y=.4}]
-%D \stoptyping
-
-%D \macros
-%D {setuppalet}
-%D
-%D Colors are taken from the current palet, if defined.
-%D Setting the current palet is done by:
-%D
-%D \showsetup{setuppalet}
-
-\let\currentpalet\empty
-
-\def\setuppalet
- {\dosingleempty\dosetuppalet}
-
-\def\dosetuppalet[#1]%
- {\edef\currentpalet{#1}%
- \ifx\currentpalet\empty
- % seems to be a reset
- \else\ifcsname\??pa\currentpalet\endcsname
- \edef\currentpalet{#1:}%
- \else
- \showmessage\m!colors7\currentpalet
- \let\currentpalet\empty
- \fi\fi}
-
-%D \macros
-%D {showpalet}
-%D
-%D The previous visualization was typeset with:
-%D
-%D \typebuffer[palet]
-%D
-%D This commands is defined as:
-%D
-%D \showsetup{showpalet}
-
-\fetchruntimecommand \showpalet {\f!colorprefix\s!run}
-
-%D \macros
-%D {showcolorcomponents}
-%D
-%D \starttyping
-%D \showcolorcomponents[color-1,color-2]
-%D \stoptyping
-
-\fetchruntimecommand \showcolorcomponents {\f!colorprefix\s!run}
-
-%D \macros
-%D {definecolorgroup}
-%D
-%D The naming of the colors in this palet suggests some
-%D ordening, which in turn is suported by color grouping.
-%D
-%D \starttyping
-%D \definecolorgroup
-%D [red]
-%D [1.00:0.90:0.90,
-%D 1.00:0.80:0.80,
-%D 1.00:0.70:0.70,
-%D 1.00:0.55:0.55,
-%D 1.00:0.40:0.40,
-%D 1.00:0.25:0.25,
-%D 1.00:0.15:0.15,
-%D 0.90:0.00:0.00]
-%D \stoptyping
-%D
-%D In such a color group colors are numbered from~$1$ to~$n$.
-%D
-%D \showsetup{definecolorgroup}
-%D
-%D This kind of specification is not only more compact than
-%D defining each color separate, it also loads faster and takes
-%D less bytes.
-
-\def\definecolorgroup
- {\dotripleempty\dodefinecolorgroup}
-
-\def\dododefinecolorgroupgray [#1][#2:#3]{\definecolor [#1:\the\colorcount][s=#2]}
-\def\dododefinecolorgrouprgb [#1][#2:#3:#4:#5]{\definecolor [#1:\the\colorcount][r=#2,g=#3,b=#4]}
-\def\dododefinecolorgroupcmyk[#1][#2:#3:#4:#5:#6]{\definecolor [#1:\the\colorcount][c=#2,m=#3=,y=#4,k=#5]}
-\def\dododefinecolorgroupspot [#1][#2:#3:#4]{\definespotolor[#1:\the\colorcount][#2][p=#3]}
-
-\def\dododefinecolorgroup#1#2%
- {\advance\colorcount\plusone
- \getvalue{dododefinecolorgroup\currentcolorspace}[#1][#2:0:0:0:0]}
-
-\def\dodefinecolorgroup[#1][#2][#3]% obsolete, just use palets
- {\ifthirdargument
- \doifelsenothing{#2}{\let\currentcolorspace\v!rgb}{\def\currentcolorspace{#2}}%
- \colorcount\zerocount
- \processcommalist[#3]{\dododefinecolorgroup{#1}}%
- \else
- \doifinstringelse{:}{#2}
- {\definecolorgroup[#1][\v!rgb][#2]}
- {\doloop
- {\doifdefinedelse{\??cr#2:\recurselevel}
- {\setevalue{\??cr#1:\recurselevel}{\csname\??cr#2:\recurselevel\endcsname}}
- {\exitloop}}}%
- \fi}
-
-%D \macros
-%D {showcolorgroup}
-%D
-%D We can show the group by:
-%D
-%D \startbuffer
-%D \showcolorgroup [blue] [horizontal,name,number,value]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D or in color:
-%D
-%D \startlinecorrection
-%D \getbuffer
-%D \stoplinecorrection
-%D
-%D which uses:
-%D
-%D \showsetup{showcolorgroup}
-
-\fetchruntimecommand \showcolorgroup {\f!colorprefix\s!run}
-
-%D There are ten predefined color groups, like
-%D \color[green]{\em groen}, \color[red]{\em rood},
-%D \color[blue]{\em blauw}, \color[cyan]{\em cyaan},
-%D \color[magenta]{\em magenta} and \color[yellow]{\em geel}.
-%D
-%D \startlinecorrection
-%D \hbox to \hsize
-%D {\hss
-%D \showcolorgroup [red] [vertical,name,number]\hss
-%D \showcolorgroup [green] [vertical,name]\hss
-%D \showcolorgroup [blue] [vertical,name]\hss
-%D \showcolorgroup [cyan] [vertical,name]\hss
-%D \showcolorgroup [magenta][vertical,name]\hss
-%D \showcolorgroup [yellow] [vertical,name]\hss}
-%D \stoplinecorrection
-%D
-%D These groups are used to define palets {\em alfa} upto {\em
-%D zeta}. As long as we don't use colors from the same row, we
-%D get ourselves distinctive palets. By activating such a palet
-%D one gains access to its members {\em top} to {\em charm} (of
-%D course one should use more suitable names than these).
-%D
-%D \startlinecorrection
-%D \hbox to \hsize
-%D {\showpalet [alfa] [vertical,name,number]\hss
-%D \showpalet [beta] [vertical,name]\hss
-%D \showpalet [gamma] [vertical,name]\hss
-%D \showpalet [delta] [vertical,name]\hss
-%D \showpalet [epsilon] [vertical,name]\hss
-%D \showpalet [zeta] [vertical,name]}
-%D \stoplinecorrection
-%D
-%D By using the keyword \type {value} the individual color
-%D components are shown too. When printed in color, these
-%D showcases show both the colors and the gray value.
-
-%D \macros
-%D {comparepalet}
-%D
-%D There are some more testing macros available:
-%D
-%D \startbuffer
-%D \comparepalet [alfa]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D shows the palet colors against a background:
-%D
-%D \startlinecorrection
-%D \getbuffer
-%D \stoplinecorrection
-%D
-%D The formal definition is:
-%D
-%D \showsetup{comparepalet}
-
-\fetchruntimecommand \comparepalet {\f!colorprefix\s!run}
-
-%D \macros
-%D {comparecolorgroup}
-%D
-%D The similar command:
-%D
-%D \startbuffer
-%D \comparecolorgroup [blue]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D shows color groups:
-%D
-%D \startlinecorrection
-%D \getbuffer
-%D \stoplinecorrection
-%D
-%D this commands are defined as:
-%D
-%D \showsetup{comparecolorgroup}
-
-\fetchruntimecommand \comparecolorgroup {\f!colorprefix\s!run}
-
-%D \macros
-%D {showcolor}
-%D
-%D But let's not forget that we also have the more traditional
-%D non||related colors. These show up after:
-%D
-%D \starttyping
-%D \showcolor [name]
-%D \stoptyping
-%D
-%D Where \type{name} for instance can be \type{rgb}.
-%D
-%D \showsetup{showcolor}
-
-\fetchruntimecommand \showcolor {\f!colorprefix\s!run}
-
-%D It would make sense to put the following code in \type
-%D {colo-mps}, but it it rather low level.
-
-%D \macros
-%D {negatecolorcomponent,negatedcolorcomponent}
-%D
-%D These speak for themselves. See \type {colo-ext} for usage.
-
-\def\negatecolorcomponent#1% #1 = \macro
- {\scratchdimen\onepoint\advance\scratchdimen-#1\onepoint
- \ifdim\scratchdimen<\zeropoint\scratchdimen\zeropoint\fi
- \edef#1{\withoutpt\the\scratchdimen}}
-
-\let\negatedcolorcomponent\firstofoneargument
-
-\def\negatedcolorcomponent#1%
- {\ifdim\dimexpr\onepoint-#1\onepoint\relax<\zeropoint
- \!!zerocount
- \else
- \expandafter\withoutpt\the\dimexpr\onepoint-#1\onepoint\relax
- \fi}
-
-\def\negatecolorcomponent#1% #1 = \macro
- {\edef#1{\negatedcolorcomponent{#1}}}
-
-%D \macros
-%D {ifMPgraphics, ifMPcmykcolors, MPcolor}
-%D
-%D A very special macro is \type{\MPcolor}. This one can be
-%D used to pass a \CONTEXT\ color to \METAPOST.
-%D
-%D \starttyping
-%D \MPcolor{my own red}
-%D \stoptyping
-%D
-%D This macro returns a \METAPOST\ triplet \type{(R,G,B)}.
-%D Unless \CMYK\ color support is turned on with \type
-%D {MPcmyk}, only \cap{RGB} colors and gray scales are
-%D supported.
-
-\newif\ifMPcmykcolors % \MPcmykcolorsfalse
-\newif\ifMPspotcolors % \MPspotcolorsfalse
-
-\ifx\MPcolor\undefined
- \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
-%D in the first place).
-%D
-%D Well, in case we want to do color separation and use CMYK
-%D colors only, this is dangerous since unwanted remapping may
-%D take place. Especially when we redefine already defined
-%D colors in another color space (e.g. darkgreen is
-%D predefined in RGB color space, so a redefinition in CMYK
-%D coordinates before RGB mode is disabled, would give
-%D unexpected results due to the already frozen color spec.)
-%D
-%D So, from now on, colors are not frozen any more!
-
-% \appendtoks\setupcolors[\c!expansie=\v!ja]\to\everyjob
-
-\chardef\currentcolorchannel=0
-
-\newif\iffilterspotcolor \filterspotcolorfalse
-\newif\ifdoingspotcolor \doingspotcolorfalse
-
-\def\registercolorchannel#1%
- {\ifdoingspotcolor \else
- \global\expandafter\chardef\csname\??cs#1\endcsname\zerocount
- \fi}
-
-\newif\ifhidesplitcolor \hidesplitcolortrue
-
-%D The next macro is for instance used in figure splitting:
-
-\def\doifseparatingcolorselse
- {\iffilterspotcolor
- \@EA\firstoftwoarguments
- \else\ifcase\currentcolorchannel
- \@EAEAEA\secondoftwoarguments
- \else
- \@EAEAEA\firstoftwoarguments
- \fi\fi}
-
-\def\doifcolorchannelelse#1%
- {\doifseparatingcolorselse
- {\doifelsenothing{#1}
- \secondoftwoarguments
- {\doifelse{#1}\@@clsplit
- \firstoftwoarguments
- \secondoftwoarguments}}
- \secondoftwoarguments}
-
-\def\resetcolorseparation
- {\filterspotcolorfalse
- \chardef\currentcolorchannel\zerocount}
-
-%D These can be used in selecting specific files (like
-%D figuredatabases).
-
-% we already have:
-%
-% \def\colorsplitsuffix{\ifcase\currentcolorchannel\else-\@@clsplitsen\fi}
-% \def\colorsplitprefix{\ifcase\currentcolorchannel\else\@@clsplitsen-\fi}
-
-\def\colorchannelprefix{\doifseparatingcolorselse\@@clsplit\empty-}
-\def\colorchannelsuffix{-\doifseparatingcolorselse\@@clsplit\empty}
-
-%D We now load the low level macros:
-
-\loadmarkfile{colo-new}
-
-%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
-%D gray colors to gray scales is turned on.
-
-\definecolor[black][s=0]
-\definecolor[white][s=1]
-
-\definetransparency [none] [0]
-\definetransparency [normal] [1]
-\definetransparency [multiply] [2]
-\definetransparency [screen] [3]
-\definetransparency [overlay] [4]
-\definetransparency [softlight] [5]
-\definetransparency [hardlight] [6]
-\definetransparency [colordodge] [7]
-\definetransparency [colorburn] [8]
-\definetransparency [darken] [9]
-\definetransparency [lighten] [10]
-\definetransparency [difference] [11]
-\definetransparency [exclusion] [12]
-
-\setupcolors
- [\c!state=\v!stop,
- \c!conversion=\v!yes,
- \c!reduction=\v!no,
- \c!rgb=\v!yes,
- \c!cmyk=\v!yes,
- \c!spot=\v!yes,
- \c!mp\c!cmyk=\@@clcmyk,
- \c!mp\c!spot=\@@clspot,
- \c!expansion=\v!no,
- \c!textcolor=,
- \c!split=\v!no,
- \c!criterium=\v!all]
-
-\setupcolor
- [\v!rgb]
-
-\protect \endinput
diff --git a/tex/context/base/colo-run.tex b/tex/context/base/colo-run.tex
index 762a10f88..6313255c3 100644
--- a/tex/context/base/colo-run.tex
+++ b/tex/context/base/colo-run.tex
@@ -159,18 +159,13 @@
\let\colorstyle\empty
\setupcolor[#1]%
\fi
- \setupwhitespace[\v!none]
\def\rule
- {\vrule\!!width4em\!!height\strutht\!!depth\strutdp}
+ {\vrule\!!width4em\!!height\strutht\!!depth\strutdp}%
\def\docommand##1%
- {\hbox
- {\graycolor[##1]{\rule}\quad
- \color[##1]{\rule}\quad
- \grayvalue{##1}\quad
- \hbox to 12em{\colorvalue{##1}\hss}%
- \strut##1}
- \endgraf}
- \processcommacommand[\colorlist]\docommand
+ {\NC\graycolor[##1]{\rule}\NC\color[##1]{\rule}\NC\grayvalue{##1}\NC\colorvalue{##1}\NC##1\NC\NR}%
+ \starttabulate[|l|l|l|l|l|l|l|]
+ \expanded{\globalprocesscommalist[\colorlist]}\docommand
+ \stoptabulate
\egroup}
\gdef\comparepalet
diff --git a/tex/context/base/cont-fil.tex b/tex/context/base/cont-fil.tex
index b5fea4e8e..a0712a42f 100644
--- a/tex/context/base/cont-fil.tex
+++ b/tex/context/base/cont-fil.tex
@@ -94,6 +94,9 @@
\definefilesynonym [pre-stepwise] [pre-60]
\definefilesynonym [pre-stepper] [pre-61]
+\definefilesynonym [pre-punk] [pre-70]
+\definefilesynonym [pre-random] [pre-71]
+
\definefilesynonym [abr-pseudocaps] [abr-01]
\definefilesynonym [abr-smallcaps] [abr-02]
diff --git a/tex/context/base/cont-fr.tex b/tex/context/base/cont-fr.tex
index f8f2f7a62..c6cf11ff1 100644
--- a/tex/context/base/cont-fr.tex
+++ b/tex/context/base/cont-fr.tex
@@ -2,7 +2,7 @@
%D [ file=cont-de,
%D version=1997.08.19,
%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ German Format Generation,
+%D subtitle=\CONTEXT\ French Format Generation,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index 107215e66..20813c37b 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,29 +11,75 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% \appendtoks
-% \writestatus\m!lua{tfm over afm, wide fonts not yet supported}
-% \to \everystoptext
-
% \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
-% \appendtoks
-% \ctxlua{
-% table.insert(input.stop_actions, function()
-% tex.sprint(tex.ctxcatcodes,"\\immediatewriteutilitytua{end}")
-% tex.sprint(tex.ctxcatcodes,"\\immediatewriteutilitytua{}")
-% tex.sprint(tex.ctxcatcodes,"\\immediatewriteutilitytua{end of utility file}")
-% end)
-% }%
-% \to \everyopenutilities
+% we have to make an mkii/mkiv core-not
+
+\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}
+
+%
\def\writestatus#1#2{\ctxlua{ctx.writestatus(\!!bs#1\!!es,\!!bs#2\!!es)}}
@@ -50,23 +96,15 @@
\global\@EA\let\csname\@@brk\string#1\endcsname\empty
\global\@EA\let\csname\@@crk\string#1\endcsname\empty}
-% \appendtoks
-% \ctxlua{garbagecollector.update()}%
-% \to \everyshipout
-
%D Since this can be a showstopper, we report the path at the beginning
%D as well as at the end of a run.
-\writestatus\m!lua{used config path - \ctxlua{tex.print(caches.configpath())}}
-\writestatus\m!lua{used cache path - \ctxlua{tex.print(caches.path)}}
+% \writestatus\m!lua{used config path - \ctxlua{tex.print(caches.configpath())}}
+% \writestatus\m!lua{used cache path - \ctxlua{tex.print(caches.path)}}
%D For the moment we report some statistics. Later this will become an option,
%D but for now we need this information.
-% \appendtoks
-% \ctxlua{ctx.show_statistics()}%
-% \to \everygoodbye
-
\def\nomkivstatistics{\ctxlua{function ctx.show_statistics() end}} % for taco
\def\resettimer {\ctxlua{environment.starttime = os.clock()}}
@@ -75,10 +113,6 @@
\resettimer
-% \appendtoks
-% \resettimer
-% \to \everyjob
-
%D For me.
\def\traceluausage
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index 0fd0e8dfe..ee047599b 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{2008.08.05 18:47}
+\newcontextversion{2008.10.31 13:58}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
@@ -197,15 +197,6 @@
% \expandafter\shapesynonym\csname shsy:#1\endcsname\else#1%
% \fi}
%
-% \beginTEX
-%
-% \def\shapesynonym#1%
-% {\expandafter\ifx\csname shsy:#1\endcsname\relax
-% #1\else\expandafter\shapesynonym\csname shsy:#1\endcsname
-% \fi}
-%
-% \endTEX
-%
%\defineshapesynonym[eacute] [e]
%\defineshapesynonym[egrave] [e]
%\defineshapesynonym[eumlaut [e]
@@ -572,8 +563,6 @@
{\executeifdefined{\??sx#1::\fontalternative}
{\getvalue {\??sx#1::\s!default}}}}}
-% \beginETEX \ifcsname
-%
% \unexpanded\def\styleinstance[#1]%
% {\csname\??sx#1%
% \ifcsname:\fontstyle:\fontalternative\endcsname
@@ -588,8 +577,6 @@
% % nothing, \relax
% \fi\fi\fi\fi
% \endcsname}
-%
-% \endETEX
% no, wrong! never!
%
@@ -794,19 +781,7 @@
\unexpanded\def\enableXML {\setinputmode[XML]} % \enableXML is used in edef's and marks
\unexpanded\def\disableXML{\setinputmode[TEX]}
-\beginTEX
-
- % else the skip aborts the reshape process
-
- \def\shapefill{\vskip\onepoint\!!plus\lineheight\!!minus\lineheight\relax}
-
-\endTEX
-
-\beginETEX
-
- \def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
-
-\endETEX
+\def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
\let\normaltype\type
diff --git a/tex/context/base/cont-old.tex b/tex/context/base/cont-old.tex
index 70628a10c..f8b4b6062 100644
--- a/tex/context/base/cont-old.tex
+++ b/tex/context/base/cont-old.tex
@@ -15,7 +15,7 @@
\unprotect
-% \def\middleraggedness {6\bodyfontsize}
+\def\middleraggedness {6\bodyfontsize}
\def\dosubstitutecommand#1#2%
{\writestatus\m!systems{\string#1\normalspace -> \string#2}%
diff --git a/tex/context/base/cont-pe.tex b/tex/context/base/cont-pe.tex
new file mode 100644
index 000000000..ab2b30bcd
--- /dev/null
+++ b/tex/context/base/cont-pe.tex
@@ -0,0 +1,37 @@
+%D \module
+%D [ file=cont-en,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%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.
+
+\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{persian} \def\messageinterface{english}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!pe]
+
+\loaduserspecifications
+
+% Do we need more defaults? or maybe all languages?
+
+\installlanguage [\s!us] [\c!state=\v!start]
+\installlanguage [\s!gb] [\c!state=\v!start]
+\installlanguage [\s!de] [\c!state=\v!start]
+\installlanguage [\s!fr] [\c!state=\v!start]
+\installlanguage [\s!es] [\c!state=\v!start]
+\installlanguage [\s!it] [\c!state=\v!start]
+\installlanguage [\s!nl] [\c!state=\v!start]
+\installlanguage [\s!pe] [\c!state=\v!start]
+
+\setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
new file mode 100644
index 000000000..d58ba7ad7
--- /dev/null
+++ b/tex/context/base/context.mkii
@@ -0,0 +1,397 @@
+%D \module
+%D [ file=context,
+%D version=2008.28.10, % 1995.10.10,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Format Generation,
+%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 First we load the system modules. These implement a lot of
+%D manipulation macros. The first one loads \PLAIN\ \TEX, as
+%D minimal as possible.
+
+\loadcorefile{syst-pln.tex}
+\loadcorefile{syst-prm.tex}
+
+\loadcorefile{syst-cat.tex}
+
+\loadcorefile{syst-etx.tex}
+\loadcorefile{syst-pdt.tex}
+\loadcorefile{syst-omg.tex}
+\loadcorefile{syst-xtx.tex}
+\loadcorefile{syst-mtx.tex}
+
+\loadcorefile{syst-gen.tex}
+\loadcorefile{syst-ext.tex}
+\loadcorefile{syst-chr.tex}
+\loadcorefile{syst-fnt.tex}
+\loadcorefile{syst-new.tex}
+\loadcorefile{syst-con.tex}
+\loadcorefile{syst-var.tex}
+\loadcorefile{syst-str.tex}
+\loadcorefile{syst-rtp.tex}
+
+%D To enable selective loading, we say:
+
+\CONTEXTtrue
+
+%D In order to conveniently load files, we need a few
+%D support modules.
+
+\loadcorefile{supp-ini.tex}
+\loadcorefile{supp-fil.tex}
+\loadcorefile{supp-dir.tex}
+
+%D After this we're ready for the multi||lingual interface
+%D modules.
+
+\loadmarkfile{mult-ini}
+\loadcorefile{mult-fst.tex}
+\loadcorefile{mult-sys.tex}
+\loadcorefile{mult-def.tex}
+
+%D We also use some third party macros. These are loaded by
+%D saying:
+
+\loadcorefile{thrd-ran.tex} % based on: Donald Arseneau
+\loadcorefile{thrd-trg.tex} % based on: David Carlisle
+
+%D Now we're ready for some general support modules. These
+%D modules implement some basic typesetting functionality.
+
+\loadcorefile{core-var.tex}
+
+\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-ran.tex}
+%loadcorefile{supp-mps.tex}
+\loadmkiifile{supp-mps.tex}
+\loadmkiifile{supp-tpi.tex}
+\loadcorefile{supp-mat.tex}
+\loadcorefile{supp-ali.tex}
+\loadcorefile{supp-num.tex}
+
+%D The next module deals with language specific typographic
+%D extensions.
+
+\loadcorefile{typo-ini.tex}
+
+%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}
+
+%D The following modules are not sequentially dependent,
+%D i.e. they have ugly dependencies, which will be cleaned
+%D up by adding more overloading.
+
+%D When loading the font, color and special modules, we need a
+%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}
+\loadcorefile{core-con.tex}
+
+%D We already need some synonyms (patterns). At runtime this
+%D file will be reloaded.
+
+\loadcorefile{cont-fil.tex}
+
+%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
+
+%D Here comes the last support modules. They take care of
+%D some language specific things.
+
+\loadcorefile{supp-pat.tex}
+
+%D The next few modules do what their names state. They
+%D load additional definition modules when needed.
+
+\loadcorefile{regi-ini.tex}
+\loadcorefile{enco-ini.tex}
+\loadcorefile{filt-ini.tex}
+\loadcorefile{hand-ini.tex}
+\loadcorefile{regi-syn.tex}
+\loadcorefile{lang-ini.tex}
+\loadcorefile{lang-ctx.tex}
+\loadcorefile{lang-dis.tex}
+
+\loadmarkfile{unic-ini}
+
+\loadcorefile{core-gen.tex}
+\loadcorefile{core-new.tex}
+\loadcorefile{core-uti.tex}
+\loadcorefile{core-two.tex}
+\loadcorefile{core-stg.tex}
+
+\loadcorefile{spec-mis.tex}
+\loadcorefile{spec-ini.tex}
+\loadcorefile{spec-def.tex}
+\loadcorefile{spec-var.tex}
+
+\loadcorefile{colo-ini.tex}
+\loadcorefile{colo-ext.tex}
+
+%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}
+\loadcorefile{lang-url.tex}
+\loadcorefile{lang-spe.tex}
+\loadcorefile{lang-lab.tex}
+
+\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}
+
+%D All kind of symbols are handled in:
+
+\loadcorefile{symb-ini.tex}
+
+%D Sorting:
+
+\loadcorefile{sort-ini.tex}
+
+%D Next we load some core macro's. These implement the
+%D macros' that are seen by the users. The order of loading
+%D is important, due to dependancies.
+
+\loadcorefile{core-spa.tex}
+\loadcorefile{core-grd.tex}
+\loadcorefile{core-mar.tex}
+\loadcorefile{core-pos.tex}
+\loadcorefile{core-mak.tex}
+\loadcorefile{core-dat.tex}
+\loadcorefile{core-ver.tex}
+\loadcorefile{core-rul.tex}
+\loadcorefile{core-vis.tex}
+\loadcorefile{core-num.tex}
+\loadcorefile{core-tsp.tex}
+\loadcorefile{core-tab.tex}
+\loadcorefile{core-nav.tex}
+\loadcorefile{core-ref.tex}
+\loadcorefile{core-obj.tex}
+\loadcorefile{core-lst.tex}
+\loadcorefile{core-itm.tex}
+\loadcorefile{core-des.tex}
+\loadcorefile{core-mat.tex}
+\loadcorefile{core-syn.tex}
+\loadcorefile{core-sys.tex}
+
+\loadcorefile{page-ini.tex}
+\loadcorefile{page-bck.tex}
+\loadcorefile{page-not.tex}
+\loadcorefile{page-one.tex}
+\loadcorefile{page-lay.tex}
+\loadmkiifile{page-log.tex}
+\loadcorefile{page-txt.tex}
+\loadcorefile{page-sid.tex}
+\loadcorefile{page-flt.tex}
+\loadcorefile{page-mul.tex}
+\loadcorefile{page-set.tex}
+\loadcorefile{page-lyr.tex}
+\loadcorefile{page-mak.tex}
+\loadcorefile{page-num.tex}
+\loadmarkfile{page-lin}
+\loadcorefile{page-par.tex}
+\loadcorefile{page-mar.tex}
+
+\loadcorefile{core-job.tex} % why so late?
+
+% so far
+
+\loadmarkfile{core-sec}
+\loadcorefile{core-swd.tex}
+\loadcorefile{core-buf.tex}
+\loadcorefile{core-blk.tex}
+\loadcorefile{page-imp.tex}
+\loadcorefile{core-tbl.tex}
+\loadcorefile{core-int.tex}
+\loadcorefile{core-ntb.tex}
+\loadcorefile{core-ltb.tex}
+
+%D A few more languages, that have specifics using core
+%D functionality:
+
+\loadcorefile{lang-chi.tex}
+\loadcorefile{lang-jap.tex}
+
+%D How about fill||in fields and related stuff?
+
+\loadcorefile{java-ini.tex}
+\loadcorefile{core-fld.tex}
+\loadcorefile{core-hlp.tex}
+
+%D Registers can depend on fields, so we load that now.
+
+\loadcorefile{core-reg.tex}
+
+%D Of course we do need fonts. There are no \TFM\ files
+%D loaded yet, so the format file is independant of their
+%D content. Here we also redefine \type{\it} as {\it italic}
+%D instead of italian.
+
+\loadmarkfile{font-ini}
+\loadcorefile{font-uni.tex}
+\loadcorefile{font-bfm.tex}
+
+\loadcorefile{enco-pfr.tex}
+
+\loadcorefile{type-ini.tex}
+\loadcorefile{type-def.tex}
+
+%D Properties. Don't ask.
+
+\loadcorefile{prop-ini.tex}
+\loadcorefile{prop-lay.tex}
+\loadcorefile{prop-mis.tex}
+
+%D Like languages, fonts, encodings and symbols, \METAPOST\
+%D support is also organized in its own class of modules.
+
+\loadmarkfile{meta-ini}
+\loadmarkfile{meta-tex}
+
+\loadcorefile{meta-pdf.tex}
+\loadcorefile{meta-pag.tex}
+
+%D Special page handling (maybe even later)
+
+\loadcorefile{page-flw.tex}
+\loadcorefile{page-spr.tex}
+\loadcorefile{page-plg.tex}
+\loadcorefile{page-str.tex}
+
+%D Hm.
+
+\loadcorefile{core-pgr.tex}
+\loadcorefile{core-bar.tex}
+\loadcorefile{core-snc.tex}
+
+
+%D Math.
+
+\loadcorefile{math-pln.tex}
+\loadcorefile{math-ini.tex}
+\loadcorefile{math-ext.tex}
+
+%D Now we're ready for more core modules.
+
+\loadcorefile{core-fnt.tex}
+\loadcorefile{core-not.tex}
+\loadcorefile{core-lnt.tex}
+
+\loadcorefile{core-mis.tex}
+
+\loadcorefile{core-trf.tex}
+\loadcorefile{core-inc.tex}
+\loadcorefile{core-fig.tex}
+\loadcorefile{core-par.tex}
+
+\loadcorefile{core-box.tex}
+\loadcorefile{page-app.tex}
+\loadmarkfile{meta-fig}
+
+%D Language specific spacing.
+
+\loadcorefile{lang-spa.tex}
+
+%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-prs.tex}
+\loadcorefile{xtag-map.tex}
+\loadcorefile{xtag-stk.tex}
+\loadcorefile{xtag-exp.tex}
+\loadcorefile{xtag-pre.tex}
+\loadcorefile{xtag-xsd.tex}
+\loadcorefile{xtag-rng.tex}
+%loadcorefile{xtag-ent.tex}
+
+%D How about this:
+
+\loadcorefile{meta-xml.tex}
+
+%D \TEX\ related logo's are always typeset in a special way.
+%D Here they come:
+
+\loadcorefile{cont-log.tex}
+
+%D This one overloads af few things:
+
+\loadcorefile{core-ctx.tex}
+
+%D Defaults go here (more will be moved to this module
+%D later):
+
+\loadcorefile{core-lme.tex}
+\loadcorefile{core-ini.tex}
+\loadcorefile{core-def.tex}
+
+%D Preloaded modules (some need xml support):
+
+%usemodule[x][res-04] % xml resource libraries
+%usemodule[x][res-08] % rlx runtime conversion
+\usemodule[x][res-12] % rli external indentification
+
+%D At run time, a few more files are loaded, like:
+%D
+%D \startitemize[packed]
+%D \item \type{cont-sys}: local (system dependant) defaults
+%D \item \type{cont-old}: substitutes for old (obsolete) macros
+%D \item \type{cont-new}: new macro implementations (for testing)
+%D \item \type{cont-fil}: filename and module synonyms
+%D \stopitemize
+
+\unprotect
+
+\beginLUATEX
+ \prependtoks
+ \ctxlua{input.starttiming(ctx)}%
+ \to \everyjob
+ \appendtoks
+ \ctxlua{input.stoptiming(ctx)}%
+ \to \everyjob
+ \appendtoks
+ \writestatus\m!lua{used config path - \ctxlua{tex.print(caches.configpath())}}%
+ \writestatus\m!lua{used cache path - \ctxlua{tex.print(caches.path)}}%
+ \to \everydump
+\endLUATEX
+
+\protect
+
+% %D Except from english, no hyphenation patterns are loaded
+% %D yet. Users can specify their needs in the next module:
+%
+% \input cont-usr.tex
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
new file mode 100644
index 000000000..fb130e5ea
--- /dev/null
+++ b/tex/context/base/context.mkiv
@@ -0,0 +1,418 @@
+%D \module
+%D [ file=context,
+%D version=2008.28.10, % 1995.10.10,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Format Generation,
+%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 First we load the system modules. These implement a lot of
+%D manipulation macros. The first one loads \PLAIN\ \TEX, as
+%D minimal as possible.
+
+\loadcorefile{syst-pln.tex}
+\loadcorefile{syst-prm.tex}
+
+\loadmkivfile{luat-env.tex}
+\loadmkivfile{luat-lib.tex}
+\loadcorefile{syst-cat.tex}
+
+\loadcorefile{syst-etx.tex}
+\loadcorefile{syst-pdt.tex}
+\loadcorefile{syst-omg.tex}
+\loadcorefile{syst-xtx.tex}
+\loadcorefile{syst-mtx.tex}
+
+\loadcorefile{syst-gen.tex}
+\loadcorefile{syst-ext.tex}
+\loadcorefile{syst-chr.tex}
+\loadcorefile{syst-fnt.tex}
+\loadcorefile{syst-new.tex}
+\loadcorefile{syst-con.tex}
+\loadcorefile{syst-var.tex}
+\loadcorefile{syst-str.tex}
+\loadcorefile{syst-rtp.tex}
+
+%D To enable selective loading, we say:
+
+\CONTEXTtrue
+
+%D In order to conveniently load files, we need a few
+%D support modules.
+
+\loadcorefile{supp-ini.tex}
+\loadcorefile{supp-fil.tex}
+\loadcorefile{supp-dir.tex}
+
+%D We need to initialize characters.
+
+\loadmkivfile{char-ini.tex}
+\loadmkivfile{char-utf.tex}
+
+%D After this we're ready for the multi||lingual interface
+%D modules.
+
+\loadmarkfile{mult-ini}
+\loadcorefile{mult-fst.tex}
+\loadcorefile{mult-sys.tex}
+\loadcorefile{mult-def.tex}
+
+\loadmkivfile{luat-ini.tex}
+\loadmkivfile{luat-lmx.tex}
+
+\loadmkivfile{luat-uni.tex}
+
+\loadmkivfile{toks-ini.tex}
+
+\loadmkivfile{attr-ini.tex}
+\loadmkivfile{node-ini.tex}
+\loadmkivfile{node-par.tex}
+
+%D We also use some third party macros. These are loaded by
+%D saying:
+
+\loadcorefile{thrd-ran.tex} % based on: Donald Arseneau
+\loadcorefile{thrd-trg.tex} % based on: David Carlisle
+
+%D Now we're ready for some general support modules. These
+%D modules implement some basic typesetting functionality.
+
+\loadcorefile{core-var.tex}
+\loadmkivfile{luat-deb.tex}
+
+\loadcorefile{supp-box.tex}
+\loadcorefile{supp-mrk.tex}
+\loadcorefile{supp-vis.tex}
+\loadcorefile{supp-fun.tex}
+\loadcorefile{supp-spe.tex}
+\loadcorefile{supp-ran.tex}
+\loadcorefile{supp-mat.tex}
+\loadcorefile{supp-ali.tex}
+\loadcorefile{supp-num.tex}
+
+%D The next module deals with language specific typographic
+%D extensions.
+
+\loadcorefile{typo-ini.tex}
+
+%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}
+
+%D The following modules are not sequentially dependent,
+%D i.e. they have ugly dependencies, which will be cleaned
+%D up by adding more overloading.
+
+%D When loading the font, color and special modules, we need a
+%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}
+\loadcorefile{core-con.tex}
+
+%D We already need some synonyms (patterns). At runtime this
+%D file will be reloaded.
+
+\loadcorefile{cont-fil.tex}
+
+%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
+
+%D Here comes the last support modules. They take care of
+%D some language specific things.
+
+\loadcorefile{supp-pat.tex}
+
+%D The next few modules do what their names state. They
+%D load additional definition modules when needed.
+
+\loadcorefile{regi-ini.tex}
+\loadcorefile{enco-ini.tex}
+\loadcorefile{filt-ini.tex}
+\loadcorefile{hand-ini.tex}
+\loadcorefile{regi-syn.tex}
+\loadcorefile{lang-ini.tex}
+\loadcorefile{lang-ctx.tex}
+\loadcorefile{lang-dis.tex}
+
+\loadmarkfile{unic-ini}
+
+% \readfile{lang-url.pat}{}{} % test
+
+\loadcorefile{core-gen.tex}
+\loadcorefile{core-new.tex}
+\loadcorefile{core-uti.tex}
+\loadcorefile{core-two.tex}
+\loadcorefile{core-stg.tex}
+
+\loadcorefile{spec-mis.tex}
+\loadcorefile{spec-ini.tex}
+\loadcorefile{spec-def.tex}
+\loadcorefile{spec-var.tex}
+
+\loadcorefile{colo-ini.tex}
+\loadcorefile{colo-ext.tex}
+
+%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}
+\loadcorefile{lang-url.tex}
+\loadcorefile{lang-spe.tex}
+\loadcorefile{lang-lab.tex}
+
+\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}
+
+%D All kind of symbols are handled in:
+
+\loadcorefile{symb-ini.tex}
+
+%D Sorting:
+
+\loadcorefile{sort-ini.tex}
+
+%D Next we load some core macro's. These implement the
+%D macros' that are seen by the users. The order of loading
+%D is important, due to dependancies.
+
+\loadcorefile{core-spa.tex}
+\loadcorefile{core-grd.tex}
+\loadcorefile{core-mar.tex}
+\loadcorefile{core-pos.tex}
+\loadcorefile{core-mak.tex}
+\loadcorefile{core-dat.tex}
+\loadcorefile{core-ver.tex}
+\loadcorefile{core-rul.tex}
+\loadcorefile{core-vis.tex}
+\loadcorefile{core-num.tex}
+\loadcorefile{core-tsp.tex}
+\loadcorefile{core-tab.tex}
+\loadcorefile{core-nav.tex}
+\loadcorefile{core-ref.tex}
+\loadcorefile{core-obj.tex}
+\loadcorefile{core-lst.tex}
+\loadcorefile{core-itm.tex}
+\loadcorefile{core-des.tex}
+\loadcorefile{core-mat.tex}
+\loadcorefile{core-syn.tex}
+\loadcorefile{core-sys.tex}
+
+\loadcorefile{page-ini.tex}
+\loadcorefile{page-bck.tex}
+\loadcorefile{page-not.tex}
+\loadcorefile{page-one.tex}
+\loadcorefile{page-lay.tex}
+\loadcorefile{page-txt.tex}
+\loadcorefile{page-sid.tex}
+\loadcorefile{page-flt.tex}
+\loadcorefile{page-mul.tex}
+\loadcorefile{page-set.tex}
+\loadcorefile{page-lyr.tex}
+\loadcorefile{page-mak.tex}
+\loadcorefile{page-num.tex}
+\loadmarkfile{page-lin}
+\loadcorefile{page-par.tex}
+\loadcorefile{page-mar.tex}
+
+\loadcorefile{core-job.tex} % why so late?
+
+% so far
+
+\loadmarkfile{core-sec}
+\loadcorefile{core-swd.tex}
+\loadcorefile{core-buf.tex}
+\loadcorefile{core-blk.tex}
+\loadcorefile{page-imp.tex}
+\loadcorefile{core-tbl.tex}
+\loadcorefile{core-int.tex}
+\loadcorefile{core-ntb.tex}
+\loadcorefile{core-ltb.tex}
+
+%D A few more languages, that have specifics using core
+%D functionality:
+
+\loadcorefile{lang-chi.tex}
+\loadcorefile{lang-jap.tex}
+
+%D How about fill||in fields and related stuff?
+
+\loadcorefile{java-ini.tex}
+\loadcorefile{core-fld.tex}
+\loadcorefile{core-hlp.tex}
+
+%D Registers can depend on fields, so we load that now.
+
+\loadcorefile{core-reg.tex}
+
+%D Of course we do need fonts. There are no \TFM\ files
+%D loaded yet, so the format file is independant of their
+%D content. Here we also redefine \type{\it} as {\it italic}
+%D instead of italian.
+
+\loadmarkfile{font-ini}
+\loadcorefile{font-uni.tex}
+\loadcorefile{font-bfm.tex}
+\loadmkivfile{font-col.tex}
+
+\loadcorefile{type-ini.tex}
+\loadcorefile{type-def.tex}
+
+%D Properties. Don't ask.
+
+\loadcorefile{prop-ini.tex}
+\loadcorefile{prop-lay.tex}
+\loadcorefile{prop-mis.tex}
+
+%D Like languages, fonts, encodings and symbols, \METAPOST\
+%D support is also organized in its own class of modules.
+
+\loadmkivfile{mlib-ctx.tex}
+\loadmkivfile{mlib-pdf.tex}
+\loadmkivfile{mlib-pps.tex}
+
+\loadmarkfile{meta-ini}
+\loadmarkfile{meta-tex}
+
+\loadcorefile{meta-pdf.tex}
+\loadcorefile{meta-pag.tex}
+
+%D Special page handling (maybe even later)
+
+\loadcorefile{page-flw.tex}
+\loadcorefile{page-spr.tex}
+\loadcorefile{page-plg.tex}
+\loadcorefile{page-str.tex}
+
+%D Hm.
+
+\loadcorefile{core-pgr.tex}
+\loadcorefile{core-bar.tex}
+\loadcorefile{core-snc.tex}
+
+
+%D Math.
+
+\loadcorefile{math-pln.tex}
+\loadcorefile{math-ini.tex}
+\loadcorefile{math-ext.tex}
+
+%D Now we're ready for more core modules.
+
+\loadcorefile{core-fnt.tex}
+\loadcorefile{core-not.tex}
+\loadcorefile{core-lnt.tex}
+
+\loadcorefile{core-mis.tex}
+
+\loadcorefile{core-trf.tex}
+\loadcorefile{core-inc.tex}
+\loadcorefile{core-fig.tex}
+\loadcorefile{core-par.tex}
+
+\loadcorefile{core-box.tex}
+\loadcorefile{page-app.tex}
+\loadmarkfile{meta-fig}
+
+%D Language specific spacing.
+
+\loadcorefile{lang-spa.tex}
+
+%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.
+
+\loadmkivfile{lxml-ini.tex}
+
+\loadcorefile{xtag-ini.tex}
+\loadcorefile{xtag-ext.tex}
+\loadcorefile{xtag-prs.tex}
+\loadcorefile{xtag-map.tex}
+\loadcorefile{xtag-stk.tex}
+\loadcorefile{xtag-exp.tex}
+\loadcorefile{xtag-pre.tex}
+\loadcorefile{xtag-xsd.tex}
+\loadcorefile{xtag-rng.tex}
+%loadcorefile{xtag-ent.tex}
+
+%D How about this:
+
+\loadcorefile{meta-xml.tex}
+
+%D \TEX\ related logo's are always typeset in a special way.
+%D Here they come:
+
+\loadcorefile{cont-log.tex}
+
+%D This one overloads af few things:
+
+\loadcorefile{core-ctx.tex}
+
+%D Defaults go here (more will be moved to this module
+%D later):
+
+\loadcorefile{core-lme.tex}
+\loadcorefile{core-ini.tex}
+\loadcorefile{core-def.tex}
+
+%D Preloaded modules (some need xml support):
+
+%usemodule[x][res-04] % xml resource libraries
+%usemodule[x][res-08] % rlx runtime conversion
+\usemodule[x][res-12] % rli external indentification
+
+%D At run time, a few more files are loaded, like:
+%D
+%D \startitemize[packed]
+%D \item \type{cont-sys}: local (system dependant) defaults
+%D \item \type{cont-old}: substitutes for old (obsolete) macros
+%D \item \type{cont-new}: new macro implementations (for testing)
+%D \item \type{cont-fil}: filename and module synonyms
+%D \stopitemize
+
+\unprotect
+
+\beginLUATEX
+ \prependtoks
+ \ctxlua{input.starttiming(ctx)}%
+ \to \everyjob
+ \appendtoks
+ \ctxlua{input.stoptiming(ctx)}%
+ \to \everyjob
+ \appendtoks
+ \writestatus\m!lua{used config path - \ctxlua{tex.print(caches.configpath())}}%
+ \writestatus\m!lua{used cache path - \ctxlua{tex.print(caches.path)}}%
+ \to \everydump
+\endLUATEX
+
+\protect
+
+% %D Except from english, no hyphenation patterns are loaded
+% %D yet. Users can specify their needs in the next module:
+%
+% \input cont-usr.tex
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index ec1d0bc0d..875779ef4 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -11,19 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% dec 07 2001 : cont-en.efmt : 4,035,912
-% aug 07 2004 : cont-en.efmt : 4,928,967 (5 more patterns)
-% aug 31 2006 : cont-en.fmt : 7,048,748 (all patterns)
-
-% todo 1: each module english commands
-% todo 2: replace lowlevel *!* by english variants
-% todo 3: make files more independent
-% todo 4: cleanup specials + adapt interface
-% todo 5: remove/replace old stuff (by new stuff, like couplepaper)
-% todo 6: create even more hooks (so that users can overload)
-% todo 7: conditionals
-% todo 8: redesign tui/tuo
-
\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
%D For many years \CONTEXT\ supported both good old \TEX\ and \ETEX, but
@@ -42,7 +29,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2008.08.05 18:47}
+\edef\contextversion{2008.10.31 13:58}
%D For those who want to use this:
@@ -66,30 +53,10 @@
\ifx\normalinput\undefined \let\normalinput\input \fi
-% trick:
+%D We have two versions, one for \PDFTEX\ and \XETEX, and one for
+%D \LUATEX.
-\ifx\directlua\undefined
- \chardef\contextmarkmode = 2
-\else
- \chardef\contextmarkmode = \directlua 0 { do
- if arg then
- local mkii = 4
- for k,v in pairs(arg) do
- if v == "--mkii" then mkii = 2 break end
- end
- tex.sprint(mkii)
- else
- tex.sprint(2)
- end
- end }
- % \ifnum\contextmarkmode=2
- % \immediate\write16{}
- % \immediate\write16{>> Quitting LuaTeX, test mode only! <<}
- % \immediate\write16{}
- % \def\next{\errorstopmode \dump \endinput}
- % \expandafter \expandafter \expandafter \next
- % \fi
-\fi
+\chardef\contextmarkmode = \ifx\directlua\undefined 2 \else 4 \fi
\def\loadcorefile#1{\normalinput#1\relax}
\def\loadmarkfile#1{\normalinput#1.\mksuffix\relax}
@@ -112,7 +79,7 @@
%D dutch version of \CONTEXT, supplying \type {english} will of
%D course end op in a english version.
%D
-%D Another option is to use \TEXEXEC:
+%D Another option is to use \TEXEXEC\ (for \MKII):
%D
%D \starttyping
%D texexec --make [--alone] [--engine] [--all]
@@ -120,6 +87,13 @@
%D \stoptyping
%D
%D More information can be found in the \TEXEXEC\ manual.
+%D
+%D For \MKIV\ you have to do:
+%D
+%D \starttyping
+%D luatools --generate
+%D context --make en nl ...
+%D \stoptyping
%D When you write modules (or extensions) you should avoid
%D conflicts with existing macro names and mechanisms. If you are
@@ -143,517 +117,9 @@
%D mailing list (ntg-context@ntg.nl). Much additional information
%D can be found at the PRAGMA website (www.pragma-ade.com).
-%D First we load the system modules. These implement a lot of
-%D manipulation macros. The first one loads \PLAIN\ \TEX, as
-%D minimal as possible.
-
-\loadcorefile{syst-pln.tex}
-\loadcorefile{syst-prm.tex}
-
-\loadmkivfile{luat-env.tex}
-\loadmkivfile{luat-lib.tex}
-\loadcorefile{syst-cat.tex}
-
-\loadcorefile{syst-etx.tex}
-\loadcorefile{syst-pdt.tex}
-\loadcorefile{syst-omg.tex}
-\loadcorefile{syst-xtx.tex}
-\loadcorefile{syst-mtx.tex}
-
-\loadcorefile{syst-gen.tex}
-\loadcorefile{syst-ext.tex}
-\loadcorefile{syst-chr.tex}
-\loadcorefile{syst-fnt.tex}
-\loadcorefile{syst-new.tex}
-\loadcorefile{syst-con.tex}
-\loadcorefile{syst-var.tex}
-\loadcorefile{syst-str.tex}
-
-%loadcorefile{syst-tra.tex}
-
-\loadcorefile{syst-rtp.tex}
-
-%D To enable selective loading, we say:
-
-\CONTEXTtrue
-
-%D In order to conveniently load files, we need a few
-%D support modules.
-
-\loadcorefile{supp-ini.tex}
-\loadcorefile{supp-fil.tex}
-\loadcorefile{supp-dir.tex}
-
-%D After this we're ready for the multi||lingual interface
-%D modules.
-
-\loadcorefile{mult-ini.tex}
-\loadcorefile{mult-fst.tex}
-\loadcorefile{mult-sys.tex}
-\loadcorefile{mult-con.tex}
-\loadcorefile{mult-com.tex}
-
-\loadmkivfile{luat-ini.tex}
-%loadmkivfile{luat-lib.tex}
-\loadmkivfile{luat-lmx.tex}
-
-\loadmkivfile{luat-uni.tex}
-
-\loadmkivfile{char-ini.tex}
-\loadmkivfile{char-def.tex}
-\loadmkivfile{char-utf.tex}
-
-\loadmkivfile{toks-ini.tex}
-
-\loadmkivfile{attr-ini.tex}
-\loadmkivfile{node-ini.tex}
-
-%D We also use some third party macros. These are loaded by
-%D saying:
-
-\loadcorefile{thrd-ran.tex} % based on: Donald Arseneau
-\loadcorefile{thrd-trg.tex} % based on: David Carlisle
-
-%D Now we're ready for some general support modules. These
-%D modules implement some basic typesetting functionality.
-
-\loadcorefile{core-var.tex}
-\loadmkivfile{luat-deb.tex}
-
-\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-ran.tex}
-%loadcorefile{supp-mps.tex}
-\loadmkiifile{supp-mps.tex}
-\loadmkiifile{supp-tpi.tex}
-\loadcorefile{supp-mat.tex}
-\loadcorefile{supp-ali.tex}
-\loadcorefile{supp-num.tex}
-
-%D The next module deals with language specific typographic
-%D extensions.
-
-\loadcorefile{typo-ini.tex}
-
-%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}
-
-%D The following modules are not sequentially dependent,
-%D i.e. they have ugly dependencies, which will be cleaned
-%D up by adding more overloading.
-
-%D When loading the font, color and special modules, we need a
-%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}
-\loadcorefile{core-con.tex}
-
-%D We already need some synonyms (patterns). At runtime this
-%D file will be reloaded.
-
-\loadcorefile{cont-fil.tex}
-
-%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
-
-%D Here comes the last support modules. They take care of
-%D some language specific things.
-
-%loadcorefile{supp-lan.tex} % replaced by lang-mis
-\loadcorefile{supp-pat.tex}
-
-%D The next few modules do what their names state. They
-%D load additional definition modules when needed.
-
-\loadcorefile{regi-ini.tex}
-\loadcorefile{enco-ini.tex}
-\loadcorefile{filt-ini.tex}
-\loadcorefile{hand-ini.tex}
-\loadcorefile{regi-syn.tex}
-\loadcorefile{lang-ini.tex}
-\loadcorefile{lang-ctx.tex}
-\loadcorefile{lang-dis.tex}
-
-\loadmarkfile{unic-ini}
-
-% \readfile{lang-url.pat}{}{} % test
-
-\loadcorefile{core-gen.tex}
-\loadcorefile{core-new.tex}
-\loadcorefile{core-uti.tex}
-\loadcorefile{core-two.tex}
-\loadcorefile{core-stg.tex}
-
-\loadcorefile{spec-mis.tex}
-\loadcorefile{spec-ini.tex}
-\loadcorefile{spec-def.tex}
-\loadcorefile{spec-var.tex}
-
-\doiffileelse{colo-new.tex}{\loadcorefile{colo-new.tex}}{\loadcorefile{colo-ini.tex}}
-\loadcorefile{colo-ext.tex}
-
-%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}
-\loadcorefile{lang-url.tex}
-\loadcorefile{lang-spe.tex}
-\loadcorefile{lang-lab.tex}
-
-\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}
-
-%D All kind of symbols are handled in:
-
-\loadcorefile{symb-ini.tex}
-
-%D Sorting:
-
-\loadcorefile{sort-ini.tex}
-
-%D Next we load some core macro's. These implement the
-%D macros' that are seen by the users. The order of loading
-%D is important, due to dependancies.
-
-\loadcorefile{core-spa.tex}
-\loadcorefile{core-grd.tex}
-\loadcorefile{core-mar.tex}
-\loadcorefile{core-pos.tex}
-\loadcorefile{core-mak.tex}
-\loadcorefile{core-dat.tex}
-\loadcorefile{core-ver.tex}
-\loadcorefile{core-rul.tex}
-\loadcorefile{core-vis.tex}
-\loadcorefile{core-num.tex}
-\loadcorefile{core-tsp.tex}
-\loadcorefile{core-tab.tex}
-\loadcorefile{core-nav.tex}
-\loadcorefile{core-ref.tex}
-\loadcorefile{core-obj.tex}
-\loadcorefile{core-lst.tex}
-\loadcorefile{core-itm.tex}
-\loadcorefile{core-des.tex}
-\loadcorefile{core-mat.tex}
-\loadcorefile{core-syn.tex}
-\loadcorefile{core-sys.tex}
-
-\loadcorefile{page-ini.tex}
-\loadcorefile{page-bck.tex}
-\loadcorefile{page-not.tex}
-\loadcorefile{page-one.tex}
-\loadcorefile{page-lay.tex}
-\loadcorefile{page-log.tex}
-\loadcorefile{page-txt.tex}
-\loadcorefile{page-sid.tex}
-\loadcorefile{page-flt.tex}
-\loadcorefile{page-mul.tex}
-\loadcorefile{page-set.tex}
-\loadcorefile{page-lyr.tex}
-\loadcorefile{page-mak.tex}
-\loadcorefile{page-num.tex}
-\loadmarkfile{page-lin}
-\loadcorefile{page-par.tex}
-\loadcorefile{page-mar.tex}
-
-\loadcorefile{core-job.tex} % why so late?
-
-% so far
-
-\loadcorefile{core-sec.tex}
-\loadcorefile{core-swd.tex}
-\loadcorefile{core-buf.tex}
-\loadcorefile{core-blk.tex}
-\loadcorefile{page-imp.tex}
-\loadcorefile{core-tbl.tex}
-\loadcorefile{core-int.tex}
-\loadcorefile{core-ntb.tex}
-\loadcorefile{core-ltb.tex}
-
-%D A few more languages, that have specifics using core
-%D functionality:
-
-\loadcorefile{lang-chi.tex}
-\loadcorefile{lang-jap.tex}
-
-%D How about fill||in fields and related stuff?
-
-\loadcorefile{java-ini.tex}
-\loadcorefile{core-fld.tex}
-\loadcorefile{core-hlp.tex}
-
-%D Registers can depend on fields, so we load that now.
-
-\loadcorefile{core-reg.tex}
-
-%D Of course we do need fonts. There are no \TFM\ files
-%D loaded yet, so the format file is independant of their
-%D content. Here we also redefine \type{\it} as {\it italic}
-%D instead of italian.
-
-% \loadmkivfile{font-set.tex} -- experimental but now obsolete
-
-\loadcorefile{font-ini.tex}
-\loadcorefile{font-uni.tex}
-\loadcorefile{font-bfm.tex}
-\loadmkivfile{font-col.tex}
-
-\loadcorefile{enco-pfr.tex}
-
-%loadmkiifile{pdfr-def.tex} -- dvi/pdf bugged, must be done runtime anyway
-
-\loadcorefile{type-ini.tex}
-\loadcorefile{type-def.tex}
-
-%D Properties. Don't ask.
-
-\loadcorefile{prop-ini.tex}
-\loadcorefile{prop-lay.tex}
-\loadcorefile{prop-mis.tex}
-
-%D Like languages, fonts, encodings and symbols, \METAPOST\
-%D support is also organized in its own class of modules.
-
-\loadmkivfile{mlib-ctx.tex}
-\loadmkivfile{mlib-pdf.tex}
-\loadmkivfile{mlib-pps.tex}
-
-\loadmarkfile{meta-ini}
-\loadmarkfile{meta-tex}
-
-\loadcorefile{meta-pdf.tex}
-\loadcorefile{meta-pag.tex}
-
-%D Special page handling (maybe even later)
-
-\loadcorefile{page-flw.tex}
-\loadcorefile{page-spr.tex}
-\loadcorefile{page-plg.tex}
-\loadcorefile{page-str.tex}
-
-%D Hm.
-
-\loadcorefile{core-pgr.tex}
-\loadcorefile{core-bar.tex}
-\loadcorefile{core-snc.tex}
-
-
-%D Math.
-
-\loadcorefile{math-pln.tex}
-\loadcorefile{math-ini.tex}
-\loadcorefile{math-ext.tex}
-
-%D Now we're ready for more core modules.
+%D We now go either the \MKII\ or \MKIV\ route:
-\loadcorefile{core-fnt.tex}
-\loadcorefile{core-not.tex}
-\loadcorefile{core-lnt.tex}
-
-\loadcorefile{core-mis.tex}
-
-\loadcorefile{core-trf.tex}
-\loadcorefile{core-inc.tex}
-\loadcorefile{core-fig.tex}
-\loadcorefile{core-par.tex}
-
-\loadcorefile{core-box.tex}
-\loadcorefile{page-app.tex}
-\loadmarkfile{meta-fig}
-
-%D Language specific spacing.
-
-\loadcorefile{lang-spa.tex}
-
-%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.
-
-\loadmkivfile{lxml-ini.tex}
-
-\loadcorefile{xtag-ini.tex}
-\loadcorefile{xtag-ext.tex}
-\loadcorefile{xtag-prs.tex}
-\loadcorefile{xtag-map.tex}
-\loadcorefile{xtag-stk.tex}
-\loadcorefile{xtag-exp.tex}
-\loadcorefile{xtag-pre.tex}
-\loadcorefile{xtag-xsd.tex}
-\loadcorefile{xtag-rng.tex}
-%loadcorefile{xtag-ent.tex}
-
-%D How about this:
-
-\loadcorefile{meta-xml.tex}
-
-%D \TEX\ related logo's are always typeset in a special way.
-%D Here they come:
-
-\loadcorefile{cont-log.tex}
-
-%D This one overloads af few things:
-
-\loadcorefile{core-ctx.tex}
-
-%D Defaults go here (more will be moved to this module
-%D later):
-
-\loadcorefile{core-lme.tex}
-\loadcorefile{core-ini.tex}
-\loadcorefile{core-def.tex}
-
-%D Preloaded modules (some need xml support):
-
-%usemodule[x][res-04] % xml resource libraries
-%usemodule[x][res-08] % rlx runtime conversion
-\usemodule[x][res-12] % rli external indentification
-
-%D At run time, a few more files are loaded, like:
-%D
-%D \startitemize[packed]
-%D \item \type{cont-sys}: local (system dependant) defaults
-%D \item \type{cont-old}: substitutes for old (obsolete) macros
-%D \item \type{cont-new}: new macro implementations (for testing)
-%D \item \type{cont-fil}: filename and module synonyms
-%D \stopitemize
-
-%D Just to keep the user busy for a while, we say:
-
-\iffalse
-
-\startinterface english
-
-\writebanner{This package is based on Plain TeX. It uses an adapted version of the}
-\writebanner{extended mark mechanism of J. Fox (1987) and a few parts of the sidefloat}
-\writebanner{mechanism of D. Comenetz (1993). Most of D.E. Knuth's Plain TeX}
-\writebanner{(\fmtversion) is available and can be used without problems. This package}
-\writebanner{uses TaBlE, a package designed and copyrighted by M.J. Wichura (1988).}
-\writebanner{Only a few auxiliary files are generated, of which some must be processed}
-\writebanner{by TeXExec.}
-
-\stopinterface
-
-\startinterface dutch
-
-\writebanner{Dit pakket is gebaseerd op Plain TeX. Er wordt gebruik gemaakt van een}
-\writebanner{aangepaste versie van het mark mechanisme van J. Fox (1987) en onderdelen}
-\writebanner{van het sidefloat mechanisme van D. Comenetz (1993). De functionaliteit}
-\writebanner{van D.E. Knuth's Plain TeX (\fmtversion) is grotendeels beschikbaar en}
-\writebanner{kan zonder problemen worden gebruikt. Dit pakket gebruikt TaBlE, ontworpen door}
-\writebanner{M.J. Wichura (1988), die ook het auteursrecht bezit. Er worden slechts een}
-\writebanner{paar hulpfiles gegenereerd, waarvan er enkele moeten worden bewerkt door}
-\writebanner{TeXExec.}
-
-\stopinterface
-
-\startinterface german
-
-\writebanner{Dieses Paket basiert auf Plain-TeX und benutzt eine angepasste Version}
-\writebanner{des erweiterten mark-Mechanismus von J. Fox (1987) und einige Teile des}
-\writebanner{sidefloat-Mechanismus von D. Comenetz (1993). Ein Grossteil D.E. Knuths}
-\writebanner{Plain-TeX (\fmtversion) ist verfuegbar und kann ohne Probleme benutzt werden.}
-\writebanner{Dieses Paket benutzt TaBlE, ein von M.J. Wichura (1988) erstelltes und}
-\writebanner{geschuetztes Paket. Nur einige Hilfsdateien werden erstellt; einige davon}
-\writebanner{muessen von TeXExec bearbeitet werden.}
-
-\stopinterface
-
-\startinterface czech
-
-\writebanner{Tento balik je zalozen na Plain TeXu. Pouziva prizpusobenou verzi}
-\writebanner{rozsireneho znackovaciho mechanismu J. Foxe (1987) a nekolik casti}
-\writebanner{sidefloat mechanismu D. Comenetze (1993). Vetsina prikazu Plain TeXu}
-\writebanner{D. E. Knutha (\fmtversion) je dostupna a muze byt bez problemu pouzita.}
-\writebanner{Tento balik pouziva balik TaBlE, ktery vytvoril M. J. Wichura (1988).}
-\writebanner{Je generovano jen nekolik pomocnych souboru, z nichz nektere musi byt}
-\writebanner{zpracovany programem TeXExec.}
-
-\stopinterface
-
-\startinterface italian
-
-\writebanner{Questo pacchetto è basato sul Plain TeX. Usa una versione adattata del}
-\writebanner{meccanismo di marcatura esteso di J. Fox (1987) ad alcune parti del}
-\writebanner{meccanismo per gli oggetti mobili laterali di D. Comenetz (1993).}
-\writebanner{La maggior parte del Plain TeX (\fmtversion) di D.E. Knuth è disponibile}
-\writebanner{e può essere usata senza problemi. Questo pacchetto usa TaBlE,}
-\writebanner{un pacchetto progettato da e con diritti di copia di M.J. Wichura (1988).}
-\writebanner{Vengono generati pochi file ausiliari, alcuni dei quali devono essere}
-\writebanner{elaborati da TeXExec.}
-
-\stopinterface
-
-\startinterface romanian
-
-\writebanner{Acest pachet este bazat pe Plain TeX. Foloseste o versiune adaptata a}
-\writebanner{mecanismului extins de marcare a lui J. Fox (1987) si cateva parti a mecanismului }
-\writebanner{blocurilor marginale a lui D. Comenetz (1993). Cea mai mare parte a Plain Tex}
-\writebanner{(\fmtversion) a lui D.E. Knuth este disponibila si poate fi folosita fara probleme.}
-\writebanner{Acest pachet foloseste TaBlE, un pachet proiectat si creat de M.J. Wichura (1988).}
-\writebanner{Numai un numar de fisiere auxiliare sunt generate, din care unele trebuie procesate}
-\writebanner{de catre TeXExec.}
-
-\stopinterface
-
-\startinterface french
-
-\writebanner{Ce package est basé sur Plain TeX. Il utilise une version modifiée du}
-\writebanner{mécanisme de marquage étendu de J. Fox (1987) et une partie du}
-\writebanner{mécanisme de placement latéral des flottants de D. Comenetz (1993). La}
-\writebanner{majeure partie de Plain TeX (\fmtversion) de D.E. Knuth est disponible}
-\writebanner{et peut être utilisée sans problèmes. Ce package utilise TaBlE, un}
-\writebanner{package conçu et copyrighté par M.J. Wichura (1988). Seul quelques}
-\writebanner{fichiers auxiliaire sont générés, dont certains doivent être traités}
-\writebanner{par TeXExec.}
-
-\stopinterface
-
-\edef\copyrightversion
- {Copyright 1990-\the\normalyear\normalspace /
- PRAGMA ADE / J. Hagen - A.F. Otten}
-
-\writeline\writebanner{\copyrightversion}\writeline
-
-\fi
-
-\unprotect
-\beginLUATEX
- \appendtoks
- \writestatus\m!lua{used config path - \ctxlua{tex.print(caches.configpath())}}%
- \writestatus\m!lua{used cache path - \ctxlua{tex.print(caches.path)}}%
- \to \everydump
-\endLUATEX
-\protect
-
-% %D Except from english, no hyphenation patterns are loaded
-% %D yet. Users can specify their needs in the next module:
-%
-% \input cont-usr.tex
+\loadmarkfile{context}
%D Let's quit this file when doing a \type {cont-..} generation.
@@ -674,9 +140,7 @@
\installlanguage [\s!us] [\c!state=\v!start]
\startinterface english
-
\installlanguage [\s!gb] [\c!state=\v!start]
-
\stopinterface
\appendtoks \language [\s!us] \to \everyjob
@@ -736,11 +200,24 @@
\stopinterface
+\startinterface persian
+
+ \installlanguage [\s!pe] [\c!state=\v!start]
+
+ \appendtoks \language [\s!pe] \to \everyjob
+ \appendtoks \mainlanguage [\s!pe] \to \everyjob
+
+\stopinterface
+
\protect
%D Finally we (pre)load some fonts.
-\setupbodyfont [cmr,rm,12pt]
+\setupencoding[default=ec]
+
+\usetypescript[fallback][\defaultencoding]
+
+\setupbodyfont[rm,12pt]
%D The next hook can be used to generate a local (extended)
%D format. This file is only searched for at the current
diff --git a/tex/context/base/core-blk.lua b/tex/context/base/core-blk.lua
new file mode 100644
index 000000000..1007273d5
--- /dev/null
+++ b/tex/context/base/core-blk.lua
@@ -0,0 +1,145 @@
+if not modules then modules = { } end modules ['core-blk'] = {
+ version = 1.001,
+ comment = "companion to core-blk.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this one runs on top of buffers and structure
+
+local texprint, format = tex.print, string.format
+
+structure = structure or { }
+structure.blocks = structure.blocks or { }
+
+local blocks = structure.blocks
+
+blocks.collected = blocks.collected or { }
+blocks.tobesaved = blocks.tobesaved or { }
+blocks.states = blocks.states or { }
+
+local tobesaved, collected, states = blocks.tobesaved, blocks.collected, blocks.states
+
+local function initializer()
+ tobesaved, collected, states = blocks.tobesaved, blocks.collected, blocks.states
+end
+
+-- not used, todo: option to do single or double pass
+
+-- job.register('structure.blocks.collected', structure.blocks.tobesaved, initializer, nil)
+
+local printer = (lpeg.linebyline/texprint)^0
+
+function blocks.print(name,data,hide)
+ if hide then
+ texprint(tex.ctxcatcodes,format("\\dostarthiddenblock{%s}",name))
+ else
+ texprint(tex.ctxcatcodes,format("\\dostartnormalblock{%s}",name))
+ end
+ if type(data) == "table" then
+ for i=1,#data do
+ texprint(data[i])
+ end
+ else
+ printer:match(data)
+ end
+ if hide then
+ texprint(tex.ctxcatcodes,"\\dostophiddenblock")
+ else
+ texprint(tex.ctxcatcodes,"\\dostopnormalblock")
+ end
+end
+
+function blocks.define(name)
+ states[name] = { all = "hide" }
+end
+
+function blocks.setstate(state,name,tag)
+ local all = tag == ""
+ local tags = not all and aux.settings_to_array(tag)
+ for n in name:gmatch("%s*([^,]+)") do
+ local sn = states[n]
+ if not sn then
+ -- error
+ elseif all then
+ sn.all = state
+ else
+ for _, tag in pairs(tags) do
+ sn[tag] = state
+ end
+ end
+ end
+end
+
+function blocks.select(state,name,tag,criterium)
+ criterium = criterium or "text"
+ if tag:find("=") then tag = "" end
+ local names = aux.settings_to_set(name)
+ local all = tag == ""
+ local tags = not all and aux.settings_to_set(tag)
+ local hide = state == "process"
+ local n = structure.sections.number_at_depth(criterium)
+ local result = structure.lists.filter_collected("all", criterium, n, tobesaved)
+ for i=1,#result do
+ local b = result[i].entry
+ if names[b.name] then
+ local btags = b.tags
+ if all then
+ blocks.print(name,b.data,hide)
+ else
+ for tag, sta in pairs(tags) do
+ if btags[tag] then
+ blocks.print(name,b.data,hide)
+ break
+ end
+ end
+ end
+ end
+ end
+end
+
+function blocks.save(name,tag,buffer)
+ local data = buffers.data[buffer]
+ local tags = aux.settings_to_set(tag)
+ local plus, minus = false, false
+ if tags['+'] then plus = true tags['+'] = nil end
+ if tags['-'] then minus = true tags['-'] = nil end
+ local slt = structure.lists.tobesaved
+ tobesaved[#tobesaved+1] = {
+ entry = {
+ name = name,
+ tags = tags,
+ data = data or "error",
+ plus = plus,
+ minus = minus,
+ },
+ sectionnumber = slt[#slt] and slt[#slt].sectionnumber
+ }
+ local allstate = states[name].all
+ if not next(tags) then
+ if allstate ~= "hide" then
+ blocks.print(name,data)
+ elseif plus then
+ blocks.print(name,data,true)
+ end
+ else
+ local sn = states[name]
+ for tag, _ in pairs(tags) do
+ if sn[tag] == nil then
+ if allstate ~= "hide" then
+ blocks.print(name,data)
+ break
+ end
+ elseif sn[tag] ~= "hide" then
+ blocks.print(name,data)
+ break
+ end
+ end
+ end
+ buffers.data[buffer] = nil
+end
+
+-- function sections.getnumber()
+-- structure.sections.number(entry, { }, "sectionnumber", "sectionnumber")
+-- end
diff --git a/tex/context/base/core-blk.mkiv b/tex/context/base/core-blk.mkiv
new file mode 100644
index 000000000..9d1f4deb4
--- /dev/null
+++ b/tex/context/base/core-blk.mkiv
@@ -0,0 +1,109 @@
+%D \module
+%D [ file=core-blk,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Blockmoves,
+%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
+
+% \registerctxluafile{core-blk}{1.001}
+\ctxloadluafile{core-blk}{}
+
+% we run on top of buffers and sections
+%
+% todo: prefix numbers (needs further integration elsewhere)
+% check functionality
+% alternative files (needs further integration elsewhere)
+
+\def\blockparameter#1#2{\ifcsname\??tb#1#2\endcsname\csname\??tb#1#2\endcsname\fi}
+
+\def\setupblockparameters{\dodoubleargument \dosetupblock} % fast one (for compatibility)
+\def\setupblock {\dodoubleargumentwithset\dosetupblock} % handles set
+
+\def\dosetupblock[#1]{\getparameters[\??tb#1]} % [#1][#2]}
+
+\def\defineblock
+ {\dosingleargument\dodefineblock}
+
+\def\dodefineblock[#1]%
+ {\getparameters
+ [\??tb#1]
+ [\c!before=\blank,
+ \c!after=\blank,
+ \c!inner=,
+ \c!style=,
+ \c!file=]% todo
+ \ctxlua{structure.blocks.define("#1")}%
+ \setvalue{\e!begin#1}{\dodoubleempty\dobeginofblock[#1]}%
+ \letvalue{\e!end#1}\relax}
+
+\long\def\dobeginofblock[#1][#2]%
+ {\expanded{\dodowithbuffer{@block@}{\e!begin#1}{\e!end#1}}
+ {}{\ctxlua{structure.blocks.save("#1","#2","@block@")}}}% before after
+
+\def\dostarthiddenblock
+ {\startnointerference
+ \dostartnormalblock}
+
+\def\dostophiddenblock
+ {\dostopnormalblock
+ \stopnointerference}
+
+% order matters: \c!before (think of: \c!before=\startitemize)
+
+\let\doblocksetups\gobbleoneargument
+
+\def\dostartnormalblock#1% name
+ {\bgroup
+\visibletrue
+ \edef\currentblock{#1}%
+ \doblocksetups\currentblock
+ \let\doblocksetups\gobbleoneargument
+ \blockparameter\currentblock\c!before
+ \dosetfontattribute{\??tb\currentblock}\c!style
+ \dosetcolorattribute{\??tb\currentblock}\c!color
+ \blockparameter\currentblock\c!inner
+ \ignorespaces}
+
+\def\dostopnormalblock
+ {\removeunwantedspaces
+ \blockparameter\currentblock\c!after
+ \par % todo: alternative = text, paragraph
+ \egroup}
+
+\def\dosetblockstate[#1][#2][#3]% state name tag
+ {\ctxlua{structure.blocks.setstate("#1","#2","#3")}}
+
+\def\doselectblocks[#1][#2][#3][#4]% state name tag setups
+ {\begingroup
+ \doifassignmentelse{#3}
+ {\getparameters[\??tb\??tb][\c!criterium=\v!text,#3]%
+ \def\doblocksetups##1{\getparameters[\??tb##1][#3]}%
+ \ctxlua{structure.blocks.select("#1","#2","","\@@tb@@tbcriterium")}}
+ {\getparameters[\??tb\??tb][\c!criterium=\v!text,#4]%
+ \def\doblocksetups##1{\getparameters[\??tb##1][#4]}%
+ \ctxlua{structure.blocks.select("#1","#2","#3","\@@tb@@tbcriterium")}}%
+ \endgroup}
+
+% hide: save, if [+] also hidden execute
+% keep: save and normal execute
+
+\def\hideblocks{\dotripleempty\dosetblockstate[hide]}
+\def\keepblocks{\dotripleempty\dosetblockstate[keep]}
+
+% use : normal execute unless [-]
+% process: hidden execute unless [-]
+% select : idem use
+
+\def\useblocks {\doquadrupleempty\doselectblocks[use]}
+\def\processblocks{\doquadrupleempty\doselectblocks[process]}
+\def\selectblocks {\doquadrupleempty\doselectblocks[use]}
+
+\protect
diff --git a/tex/context/base/core-box.tex b/tex/context/base/core-box.tex
index dd84fbc1a..bbcfe451d 100644
--- a/tex/context/base/core-box.tex
+++ b/tex/context/base/core-box.tex
@@ -922,8 +922,10 @@
\def\backgroundimage#1#2#3% repeat hsize vsize
{\bgroup
+ \forgetall
\dowithnextbox
- {\ifcase#1\relax
+ {\offinterlineskip
+ \ifcase#1\relax
% just one
\else
\scratchdimen#2\divide\scratchdimen\nextboxwd\count0\scratchdimen\advance\count0\plusone
@@ -940,7 +942,7 @@
\fi
\ifdim\nextboxwd>#2\relax
\setbox\nextbox\hbox to #2{\hss\flushnextbox\hss}%
- \setbox\scratchbox\hbox{\expanded{\clip[\c!width=#2,\c!height=\the\nextboxht]{\box\scratchbox}}}%
+ \setbox\nextbox\hbox{\expanded{\clip[\c!width=#2,\c!height=\the\nextboxht]{\flushnextbox}}}%
\fi
\ifdim\nextboxht>#3\relax
\setbox\nextbox\vbox to #3{\vss\flushnextbox\vss}%
diff --git a/tex/context/base/core-buf.lua b/tex/context/base/core-buf.lua
index 7c0164cf5..a43c33054 100644
--- a/tex/context/base/core-buf.lua
+++ b/tex/context/base/core-buf.lua
@@ -13,79 +13,87 @@ if not versions then versions = { } end versions['core-buf'] = 1.001
if unicode and not utf then utf = unicode.utf8 end
-buffers = { }
-buffers.data = { }
-buffers.hooks = { }
-buffers.flags = { }
-buffers.commands = { }
+buffers = { }
+buffers.data = { }
+buffers.hooks = { }
+buffers.flags = { }
+buffers.commands = { }
+buffers.visualizers = { }
-- if needed we can make 'm local
-local concat, texsprint, texprint = table.concat, tex.sprint, tex.print
+local concat, texsprint, texprint, texwrite = table.concat, tex.sprint, tex.print, tex.write
+local utfbyte, utffind, utfgsub = utf.byte, utf.find, utf.gsub
+local byte, sub, find, char, gsub, rep = string.byte, string.sub, string.find, string.char, string.gsub, string.rep
+
+local data, commands, flags, hooks, visualizers = buffers.data, buffers.commands, buffers.flags, buffers.hooks, buffers.visualizers
function buffers.erase(name)
- buffers.data[name] = nil
+ data[name] = nil
end
function buffers.set(name, str)
- buffers.data[name] = { str } -- CHECK THIS
+ data[name] = { str } -- CHECK THIS
end
function buffers.append(name, str)
- buffers.data[name] = (buffers.data[name] or "") .. str
+ data[name] = (data[name] or "") .. str
end
buffers.flags.store_as_table = true
-- to be sorted out: crlf + \ ; slow now
-function buffers.grab(name,begintag,endtag,data)
- if not buffers.data[name] or buffers.data[name] == "" then
- buffers.data[name] = ""
+local n = 0
+
+function buffers.grab(name,begintag,endtag,bufferdata)
+ local dn = data[name] or ""
+ if dn == "" then
buffers.level = 0
end
- buffers.level = buffers.level + data:count("\\"..begintag) - data:count("\\"..endtag)
+ buffers.level = buffers.level + bufferdata:count("\\"..begintag) - bufferdata:count("\\"..endtag)
local more = buffers.level>0
if more then
- buffers.data[name] = buffers.data[name] .. data .. endtag
+ dn = dn .. bufferdata .. endtag
buffers.level = buffers.level - 1
else
- if buffers.data[name] == "" then
- buffers.data[name] = data:sub(1,#data-1)
+ if dn == "" then
+ dn = bufferdata:sub(1,#bufferdata-1)
else
- buffers.data[name] = buffers.data[name] .. "\n" .. data:sub(1,#data-1)
+ dn = dn .. "\n" .. bufferdata:sub(1,#bufferdata-1)
end
- buffers.data[name] = buffers.data[name]:gsub("[\010\013]$","")
- if buffers.flags.store_as_table then
- buffers.data[name] = buffers.data[name]:splitlines()
+ dn = dn:gsub("[\010\013]$","")
+ if flags.store_as_table then
+ dn = dn:splitlines()
end
end
+ data[name] = dn
cs.testcase(more)
end
function buffers.exists(name)
- return buffers.data[name] ~= nil
+ return data[name] ~= nil
end
function buffers.doifelsebuffer(name)
- cs.testcase(buffers.data[name] ~= nil)
+ cs.testcase(data[name] ~= nil)
end
-buffers.flags.optimize_verbatim = true
-buffers.flags.count_empty_lines = false
+flags.optimize_verbatim = true
+flags.count_empty_lines = false
-buffers.commands.no_break = "\\doverbatimnobreak"
-buffers.commands.do_break = "\\doverbatimgoodbreak"
-buffers.commands.begin_of_line_command = "\\doverbatimbeginofline"
-buffers.commands.end_of_line_command = "\\doverbatimendofline"
-buffers.commands.empty_line_command = "\\doverbatimemptyline"
+commands.no_break = "\\doverbatimnobreak"
+commands.do_break = "\\doverbatimgoodbreak"
+commands.begin_of_line_command = "\\doverbatimbeginofline"
+commands.end_of_line_command = "\\doverbatimendofline"
+commands.empty_line_command = "\\doverbatimemptyline"
function buffers.verbatimbreak(n,m)
- if buffers.flags.optimize_verbatim then
+ if flags.optimize_verbatim then
if n == 2 or n == m then
- texsprint(buffers.commands.no_break)
+ texsprint(commands.no_break)
else
- texsprint(buffers.commands.do_break)
+ texsprint(commands.do_break)
end
end
end
@@ -110,7 +118,7 @@ function buffers.strip(lines)
end
function buffers.type(name)
- local lines = buffers.data[name]
+ local lines = data[name]
local action = buffers.typeline
if lines then
if type(lines) == "string" then
@@ -124,38 +132,33 @@ function buffers.type(name)
end
end
---~ function buffers.typefile(name)
+--~ function buffers.typefile(name) -- keep this one, uses tex reader
--~ local t = input.openfile(name)
--~ local action = buffers.typeline
--~ if t then
---~ local line, n, m = 0, 0, t.noflines
+--~ local lines = { }
--~ while true do
---~ str = t.reader(t)
+--~ local str = t.reader()
--~ if str then
---~ n, line = action(str, n, m, line)
+--~ lines[#lines+1] = str
--~ else
--~ break
--~ end
--~ end
--~ t.close()
+--~ local line, n = 0, 0
+--~ local first, last, m = buffers.strip(lines)
+--~ for i=first,last do
+--~ n, line = action(lines[i], n, m, line)
+--~ end
--~ end
--~ end
function buffers.typefile(name)
- local t = input.openfile(name)
- local action = buffers.typeline
- if t then
- local lines = { }
- while true do
- local str = t.reader()
- if str then
- lines[#lines+1] = str
- else
- break
- end
- end
- t.close()
- local line, n = 0, 0
+ local str = io.loaddata(name)
+ if str then
+ local lines = str:splitlines()
+ local line, n, action = 0, 0, buffers.typeline
local first, last, m = buffers.strip(lines)
for i=first,last do
n, line = action(lines[i], n, m, line)
@@ -168,14 +171,14 @@ function buffers.typeline(str,n,m,line)
buffers.verbatimbreak(n,m)
if str:find("%S") then
line = line + 1
- buffers.hooks.begin_of_line(line)
- buffers.hooks.flush_line(buffers.hooks.line(str))
- buffers.hooks.end_of_line()
+ hooks.begin_of_line(line)
+ hooks.flush_line(hooks.line(str))
+ hooks.end_of_line()
else
- if buffers.flags.count_empty_lines then
+ if flags.count_empty_lines then
line = line + 1
end
- buffers.hooks.empty_line(line)
+ hooks.empty_line(line)
end
return n, line
end
@@ -184,13 +187,28 @@ function buffers.save(name)
if not name or name == "" then
name = tex.jobname
end
- local b, f = buffers.data[name], tex.jobname .. "-" .. name .. ".tmp"
+ local b, f = data[name], tex.jobname .. "-" .. name .. ".tmp"
b = (b and type(b) == "table" and table.join(b,"\n")) or b or ""
io.savedata(f,b)
end
-- todo, use more locals
+--~ function buffers.get(name)
+--~ local b = data[name]
+--~ if b then
+--~ if type(b) == "table" then
+--~ for i=1,#b do
+--~ texprint(b[i])
+--~ end
+--~ else
+--~ string.piecewise(b, " *[\010\013]", texprint) -- hm, can be faster
+--~ end
+--~ end
+--~ end
+
+local printer = (lpeg.linebyline/texprint)^0
+
function buffers.get(name)
local b = buffers.data[name]
if b then
@@ -199,13 +217,14 @@ function buffers.get(name)
texprint(b[i])
end
else
- string.piecewise(b, " *[\010\013]", texprint) -- hm, can be faster
+ -- b:piecewise(" *[\010\013]", texprint) -- hm, can be faster
+ printer:match(b)
end
end
end
function buffers.content(name) -- no print
- local b = buffers.data[name]
+ local b = data[name]
if b then
if type(b) == "table" then
return concat(b," ")
@@ -238,7 +257,7 @@ function buffers.collect(names,separator) -- no print
end
function buffers.inspect(name)
- local b = buffers.data[name]
+ local b = data[name]
if b then
if type(b) == "table" then
for _,v in ipairs(b) do
@@ -246,13 +265,13 @@ function buffers.inspect(name)
texsprint(tex.ctxcatcodes,"[crlf]\\par ")
else
texsprint(tex.ctxcatcodes,(b:gsub("(.)",function(c)
- return " [" .. string.byte(c) .. "] "
+ return " [" .. byte(c) .. "] "
end)) .. "\\par")
end
end
else
texsprint(tex.ctxcatcodes,(b:gsub("(.)",function(c)
- return " [" .. string.byte(c) .. "] "
+ return " [" .. byte(c) .. "] "
end)))
end
end
@@ -260,117 +279,122 @@ end
-- maybe just line(n,str) empty(n,str)
-buffers.visualizers = { }
-buffers.visualizers.default = { }
-buffers.visualizers.tex = { }
-buffers.visualizers.mp = { }
+visualizers.default = { }
+visualizers.tex = { }
+visualizers.mp = { }
-buffers.visualizers.escapetoken = nil
-buffers.visualizers.tablength = 7
+visualizers.escapetoken = nil
+visualizers.tablength = 7
-buffers.visualizers.enabletab = false
-buffers.visualizers.enableescape = false
+visualizers.enabletab = false
+visualizers.enableescape = false
+visualizers.obeyspace = true
-function buffers.visualizers.reset()
- buffers.visualizers.enabletab = false
- buffers.visualizers.enableescape = false
- buffers.currentvisualizer = 'default'
+function visualizers.reset()
+--~ visualizers.enabletab = false
+--~ visualizers.enableescape = false
+--~ buffers.currentvisualizer = 'default'
end
buffers.currentvisualizer = 'default'
function buffers.setvisualizer(str)
- buffers.currentvisualizer = string.lower(str)
- if not buffers.visualizers[buffers.currentvisualizer] then
+ buffers.currentvisualizer = str:lower()
+ if not visualizers[buffers.currentvisualizer] then
buffers.currentvisualizer = 'default'
end
end
function buffers.doifelsevisualizer(str)
- cs.testcase((str ~= "") and (buffers.visualizers[string.lower(str)] ~= nil))
+ cs.testcase((str ~= "") and (visualizers[str:lower()] ~= nil))
end
-- calling routines, don't change
-function buffers.hooks.flush_line(str,nesting)
- if buffers.visualizers[buffers.currentvisualizer].flush_line then
- buffers.visualizers[buffers.currentvisualizer].flush_line(str,nesting)
---~ elseif nesting then
---~ buffers.visualizers.flush_nested(str,false) -- no real nesting
+
+function hooks.flush_line(str,nesting)
+ str = str:gsub(" *[\n\r]+ *"," ")
+ local flush_line = visualizers[buffers.currentvisualizer].flush_line
+ if flush_line then
+ flush_line(str,nesting)
else
- buffers.visualizers.default.flush_line(str,nesting)
+ visualizers.default.flush_line(str,nesting)
end
end
-function buffers.hooks.begin_of_line(n)
- if buffers.visualizers[buffers.currentvisualizer].begin_of_line then
- buffers.visualizers[buffers.currentvisualizer].begin_of_line(n)
+function hooks.begin_of_line(n)
+ local begin_of_line = visualizers[buffers.currentvisualizer].begin_of_line
+ if begin_of_line then
+ begin_of_line(n)
else
- buffers.visualizers.default.begin_of_line(n)
+ visualizers.default.begin_of_line(n)
end
end
-function buffers.hooks.end_of_line()
- if buffers.visualizers[buffers.currentvisualizer].end_of_line then
- buffers.visualizers[buffers.currentvisualizer].end_of_line()
+function hooks.end_of_line()
+ local end_of_line = visualizers[buffers.currentvisualizer].end_of_line
+ if end_of_line then
+ end_of_line()
else
- buffers.visualizers.default.end_of_line(str)
+ visualizers.default.end_of_line(str)
end
end
-function buffers.hooks.empty_line()
- if buffers.visualizers[buffers.currentvisualizer].empty_line then
- buffers.visualizers[buffers.currentvisualizer].empty_line()
+function hooks.empty_line()
+ local empty_line = visualizers[buffers.currentvisualizer].empty_line
+ if empty_line then
+ empty_line()
else
- buffers.visualizers.default.empty_line()
+ visualizers.default.empty_line()
end
end
-function buffers.hooks.line(str)
- if buffers.visualizers[buffers.currentvisualizer].line then
- return buffers.visualizers[buffers.currentvisualizer].line(str)
+function hooks.line(str)
+ local empty_line = visualizers[buffers.currentvisualizer].line
+ if line then
+ return line(str)
else
- return buffers.visualizers.default.line(str)
+ return visualizers.default.line(str)
end
end
-- defaults
-function buffers.visualizers.default.flush_line(str)
+function visualizers.default.flush_line(str)
texsprint(tex.ctxcatcodes,buffers.escaped(str))
end
-function buffers.visualizers.default.begin_of_line(n)
- texsprint(tex.ctxcatcodes, buffers.commands.begin_of_line_command .. "{" .. n .. "}")
+function visualizers.default.begin_of_line(n)
+ texsprint(tex.ctxcatcodes, commands.begin_of_line_command .. "{" .. n .. "}")
end
-function buffers.visualizers.default.end_of_line()
- texsprint(tex.ctxcatcodes,buffers.commands.end_of_line_command)
+function visualizers.default.end_of_line()
+ texsprint(tex.ctxcatcodes,commands.end_of_line_command)
end
-function buffers.visualizers.default.empty_line()
- texsprint(tex.ctxcatcodes,buffers.commands.empty_line_command)
+function visualizers.default.empty_line()
+ texsprint(tex.ctxcatcodes,commands.empty_line_command)
end
-function buffers.visualizers.default.line(str)
+function visualizers.default.line(str)
return str
end
-- special one
-buffers.commands.nested = "\\switchslantedtype "
+commands.nested = "\\switchslantedtype "
--- todo : utf + faster
+-- todo : utf + faster, direct print and such. no \\char, vrb catcodes, see end
-function buffers.visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess
+function visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess
+ str = str:gsub(" *[\n\r]+ *"," ")
local result, c, nested, i = "", "", 0, 1
- local sb, ss, sf = string.byte, string.sub, string.find
while i < #str do -- slow
- c = ss(str,i,i+1)
+ c = sub(str,i,i+1)
if c == "<<" then
nested = nested + 1
if enable then
- result = result .. "{" .. buffers.commands.nested
+ result = result .. "{" .. commands.nested
else
result = result .. "{"
end
@@ -382,18 +406,18 @@ function buffers.visualizers.flush_nested(str, enable) -- no utf, kind of obsole
end
i = i + 2
else
- c = ss(str,i,i)
+ c = sub(str,i,i)
if c == " " then
result = result .. "\\obs "
- elseif sf(c,"%a") then
+ elseif c:find("%a") then
result = result .. c
else
- result = result .. "\\char" .. sb(c) .. " "
+ result = result .. "\\char" .. byte(c) .. " "
end
i = i + 1
end
end
- result = result .. "\\char" .. sb(ss(str,i,i)) .. " " .. string.rep("}",nested)
+ result = result .. "\\char" .. byte(sub(str,i,i)) .. " " .. string.rep("}",nested)
texsprint(tex.ctxcatcodes,result)
end
@@ -433,11 +457,11 @@ function buffers.finish_state(state, result)
end
end
-buffers.open_nested = string.rep("\\char"..string.byte('<').." ",2)
-buffers.close_nested = string.rep("\\char"..string.byte('>').." ",2)
+buffers.open_nested = rep("\\char"..byte('<').." ",2)
+buffers.close_nested = rep("\\char"..byte('>').." ",2)
function buffers.replace_nested(result)
- return (string.gsub(result:gsub(buffers.open_nested,"{"),buffers.close_nested,"}"))
+ return (gsub(result:gsub(buffers.open_nested,"{"),buffers.close_nested,"}"))
end
function buffers.flush_result(result,nested)
@@ -448,24 +472,92 @@ function buffers.flush_result(result,nested)
end
end
+local function escaped_token(c)
+ if utffind(c,"^(%a%d)$") then
+ return c
+ elseif c == " " then
+ return "\\obs "
+ else
+ return "\\char" .. utfbyte(c) .. " "
+ end
+end
+
+buffers.escaped_token = escaped_token
+
function buffers.escaped(str)
- local sb, sf = utf.byte, utf.find
- return (utf.gsub(str,"(.)", function(c)
- if sf(c,"^(%a%d)$") then
- return c
- elseif c == " " then
- return "\\obs "
- else
- return "\\char" .. sb(c) .. " "
- end
- end))
+ -- use the utfcharacters loop
+ return (utfgsub(str,"(.)", escaped_token))
end
+--~ function buffers.escaped_chr(ch)
+--~ local b = utfbyte(ch)
+--~ if b == 32 then
+--~ return "\\obs "
+--~ else
+--~ return "\\char" .. b .. " "
+--~ end
+--~ end
+
function buffers.escaped_chr(ch)
- local b = utf.byte(ch)
- if b == 32 then
+ if ch == " " then
return "\\obs "
else
- return "\\char" .. b .. " "
+ return "\\char" .. utfbyte(ch) .. " "
+ end
+end
+
+-- redone
+
+--~ function visualizers.default.flush_line(str)
+--~ local tc = tex.ctxcatcodes
+--~ for u in str:utfcharacters() do
+--~ texsprint(tc,escaped_token(u))
+--~ end
+--~ end
+
+--~ local a, z, A, Z, zero, nine = byte("a"), byte("z"), byte("A"), byte("Z"), byte("0"), byte("9")
+
+--~ function visualizers.default.flush_line(str)
+--~ local tc = tex.ctxcatcodes
+--~ for b in str:utfvalues() do
+--~ if (b>=a and b<=z) or (b>=A and b<=Z) or (b>=zero and b<=nine) then
+--~ texsprint(tc,char(b))
+--~ elseif b == 32 then
+--~ texsprint(tc,"\\obs ")
+--~ else
+--~ texsprint(tc,"\\char",b," ")
+--~ end
+--~ end
+--~ end
+
+--~ function visualizers.default.flush_line(str)
+--~ local tc = tex.ctxcatcodes
+--~ local vc = tex.vrbcatcodes
+--~ local vs = visualizers.obeyspace
+--~ for ch in str:utfcharacters() do
+--~ if ch == "{" or ch == "}" then
+--~ texsprint(tc,"\\char",ch:byte()," ")
+--~ elseif vs and ch == " " then
+--~ texsprint(tc,"\\obs ")
+--~ else
+--~ texsprint(vc,ch)
+--~ end
+--~ end
+--~ end
+
+function visualizers.default.flush_line(str)
+ str = str:gsub(" *[\n\r]+ *"," ")
+ local vc = tex.vrbcatcodes
+ if visualizers.obeyspace then
+ local tc = tex.ctxcatcodes
+ for c in str:utfcharacters() do
+ if c == " " then
+ texsprint(tc,"\\obs ")
+ else
+ texsprint(vc,c)
+ end
+ end
+ else
+ texsprint(vc,str)
end
end
diff --git a/tex/context/base/core-con.lua b/tex/context/base/core-con.lua
index 36fe889cd..20bfef32a 100644
--- a/tex/context/base/core-con.lua
+++ b/tex/context/base/core-con.lua
@@ -35,7 +35,7 @@ languages.counters = {
0x006F, 0x0070, 0x0072, 0x0073, 0x0161,
0x0074, 0x0075, 0x0076, 0x007A, 0x017E
},
- ['greek'] = {
+ ['greek'] = { -- this should be the lowercase table
0x0391, 0x0392, 0x0393, 0x0394, 0x0395,
0x0396, 0x0397, 0x0398, 0x0399, 0x039A,
0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
@@ -112,7 +112,7 @@ end
function converters.alphabetic(n,code)
local code = counters[code] or counters['**']
- do_alphabetic(n,#code,function(n) return code[n] or fallback end)
+ do_alphabetic(n,#code,function(n) return characters.lccode(code[n] or fallback) end) -- lccode catches wrong tables
end
function converters.Alphabetic(n,code)
diff --git a/tex/context/base/core-con.mkii b/tex/context/base/core-con.mkii
index 9a4a0b0ff..d9347b475 100644
--- a/tex/context/base/core-con.mkii
+++ b/tex/context/base/core-con.mkii
@@ -94,33 +94,7 @@
\unknowncharacter
\fi}}
-\beginTEX
-
-\def\dodoconvertcharacters#1#2#3%
- {\ifnum#3>#1
- \bgroup
- \!!counta#3\relax
- \ifnum\!!counta>\zerocount
- \advance\!!counta \minusone
- \!!countb\!!counta
- \divide\!!counta #1%
- \!!countc\!!counta
- \multiply\!!countc #1%
- \advance\!!countb -\!!countc
- \doconvertcharacters#3{\!!counta}%
- \advance\!!countb \plusone
- #3{\the\!!countb}%
- \fi
- \egroup
- \else
- #2{#3}% pure expansion, used in references
- \fi}
-
-\endTEX
-
-%D A fully expandable alternative:
-
-\beginETEX \numexpr
+%D The fully expandable alternative:
\def\dodoconvertcharacters#1#2#3%
{\ifcase#3\else
@@ -132,8 +106,6 @@
\fi
\fi}
-\endETEX
-
\def\doconvertcharacters{\dodoconvertcharacters{26}}
\def\characters{\doconvertcharacters\character}
diff --git a/tex/context/base/core-con.mkiv b/tex/context/base/core-con.mkiv
index 2f1221605..70ddc6991 100644
--- a/tex/context/base/core-con.mkiv
+++ b/tex/context/base/core-con.mkiv
@@ -15,11 +15,11 @@
\registerctxluafile{core-con}{1.001}
-\def\romannumerals #1{\ctxlua{converters.romannumerals(\number#1)}}
-\def\Romannumerals #1{\ctxlua{converters.Romannumerals(\number#1)}}
-\def\abjadnumerals #1{\ctxlua{converters.arabicnumerals(\number#1)}}
-\def\abjadnodotnumerals #1{\ctxlua{converters.arabicnodotnumerals(\number#1)}}
-\def\abjadnaivenumerals #1{\ctxlua{converters.arabicnaivenumerals(\number#1)}}
+\def\romannumerals #1{\ctxlua{converters.romannumerals(\number#1)}}
+\def\Romannumerals #1{\ctxlua{converters.Romannumerals(\number#1)}}
+\def\abjadnumerals #1{\ctxlua{converters.arabicnumerals(\number#1)}}
+\def\abjadnodotnumerals#1{\ctxlua{converters.arabicnodotnumerals(\number#1)}}
+\def\abjadnaivenumerals#1{\ctxlua{converters.arabicnaivenumerals(\number#1)}}
\defineconversion [romannumerals] [\romannumerals]
\defineconversion [Romannumerals] [\Romannumerals]
diff --git a/tex/context/base/core-des.tex b/tex/context/base/core-des.tex
index f11721c96..1794800a4 100644
--- a/tex/context/base/core-des.tex
+++ b/tex/context/base/core-des.tex
@@ -89,7 +89,9 @@
{\dowritetolist
{\descriptionparameter\c!type:\descriptionparameter\c!list}
{}{#2}{\currentdescription}}%
- \rawreference\s!def{#1}{#2}} % brrr moet in #4
+ % beware: with footnotes #2 can be something messy but then #1 is
+ % empty anyway, so we have an extra safeguard
+ \doifsomething{#1}{\rawreference\s!def{#1}{#2}}} % brrr moet in #4
\setvalue{@@description\v!left}%
{\@@descriptionhang\@@descriptionleftpure\@@descriptionlefthang}
@@ -440,8 +442,8 @@
\def\definedescription
{\dodoubleemptywithset\dodefinedescription}
-\def\currentdescriptionnumber
- {\csname\??dd\currentdescription\??dd\c!number\endcsname}
+\def\currentdescriptionnumber {\csname\??dd\currentdescription\??dd\c!number\endcsname}
+\def\directcurrentdescriptionnumber#1{\csname\??dd #1\??dd\c!number\endcsname}
\ifx\preparednumber\undefined \let\preparednumber\empty \fi
@@ -570,7 +572,7 @@
\descriptionparameter\c!right}
\setvalue{\??dd\s!set\v!sub\s!sub\s!sub\c!number}#1%
- {\edef\@@descriptionnumber{\currentdescriptionnumber}%
+ {\edef\@@descriptionnumber{\directcurrentdescriptionnumber{#1}}%
\setnumber[\v!sub\v!sub\v!sub\@@descriptionnumber]}
\setvalue{\??dd\s!set\v!sub\s!sub\c!number}#1%
@@ -586,7 +588,7 @@
\setnumber[\@@descriptionnumber]}
\setvalue{\??dd\s!reset\v!sub\v!sub\v!sub\c!number}#1%
- {\edef\@@descriptionnumber{\currentdescriptionnumber}%
+ {\edef\@@descriptionnumber{\directcurrentdescriptionnumber{#1}}%
\resetnumber[\v!sub\v!sub\v!sub\@@descriptionnumber]}
\setvalue{\??dd\s!reset\v!sub\v!sub\c!number}#1%
@@ -601,25 +603,25 @@
{\getvalue{\??dd\s!reset\v!sub\c!number}{#1}%
\resetnumber[\@@descriptionnumber]}
-\setvalue{\??dd\e!next\v!sub\v!sub\v!sub\c!number}[#1]%
- {\edef\@@descriptionnumber{\currentdescriptionnumber}%
+\setvalue{\??dd\e!next\v!sub\v!sub\v!sub\c!number}#1#2%
+ {\edef\@@descriptionnumber{\directcurrentdescriptionnumber{#1}}%
\incrementnumber[\v!sub\v!sub\v!sub\@@descriptionnumber]%
- \rawreference\s!num{#1}{\getvalue{showdn\v!sub\v!sub\v!sub\c!number}}}%
+ \rawreference\s!num{#2}{\getvalue{showdn\v!sub\v!sub\v!sub\c!number}}}%
-\setvalue{\??dd\e!next\v!sub\v!sub\c!number}[#1]%
+\setvalue{\??dd\e!next\v!sub\v!sub\c!number}#1#2%
{\getvalue{\??dd\s!reset\v!sub\v!sub\v!sub\c!number}{#1}%
\incrementnumber[\v!sub\v!sub\@@descriptionnumber]%
- \rawreference\s!num{#1}{\getvalue{showdn\v!sub\v!sub\c!number}}}%
+ \rawreference\s!num{#2}{\getvalue{showdn\v!sub\v!sub\c!number}}}%
-\setvalue{\??dd\e!next\v!sub\c!number}[#1]%
+\setvalue{\??dd\e!next\v!sub\c!number}#1#2%
{\getvalue{\??dd\s!reset\v!sub\v!sub\c!number}{#1}%
\incrementnumber[\v!sub\@@descriptionnumber]%
- \rawreference\s!num{#1}{\getvalue{showdn\v!sub\c!number}}}%
+ \rawreference\s!num{#2}{\getvalue{showdn\v!sub\c!number}}}%
-\setvalue{\??dd\e!next\c!number}[#1]%
+\setvalue{\??dd\e!next\c!number}#1#2%
{\getvalue{\??dd\s!reset\v!sub\c!number}{#1}%
\incrementnumber[\@@descriptionnumber]%
- \rawreference\s!num{#1}{\getvalue{showdn\c!number}}}%
+ \rawreference\s!num{#2}{\getvalue{showdn\c!number}}}%
\def\dodosetupenumerations[#1][#2]%
{\getparameters[\??dd#1][#2]%
@@ -710,15 +712,15 @@
\def\defineenumeration
{\dotripleemptywithset\dodefineenumeration}
-\def\doresetenumerationnumber[#1][#2]%
+\def\doresetenumerationnumber[#1][#2]% name level
{\getvalue{\??dd\s!reset#2\c!number}{#1}}%
-\def\dosetenumerationnumber[#1][#2]%
+\def\dosetenumerationnumber[#1][#2]% name level
{\getvalue{\??dd\s!set#2\c!number}{#1}}%
-\def\donextenumerationnumber[#1][#2][#3]%
+\def\donextenumerationnumber[#1][#2][#3]% name level reference
{\pluscounter{\??dd\c!coupling#1}% new: global crosslinking
- \getvalue{\??dd\e!next#2\c!number}[#3]}%
+ \getvalue{\??dd\e!next#2\c!number}{#1}{#3}}%
\def\@@resetdescriptionclosesymbol
{\global\@EA\settrue\csname\??dd\currentdescription:mrk\endcsname
@@ -833,6 +835,14 @@
\def\do@@nextlabel[#1][#2]%
{\nextnumber[#1][\s!lab][#2]}
+
+\def\currentnumber[#1]% kan tekst hier weg ?
+ {\dotextprefix{\numberparameter{#1}\c!text}\sectionnumberonly[#1]}
+
+\def\nextnumber[#1][#2][#3]%
+ {\incrementnumber[#1]%
+ \currentnumber[#1]%
+ \rawreference{#2}{#3}{\composedsectionnumber}}
\setupdescriptions
[\c!location=\v!left,
diff --git a/tex/context/base/core-fig.tex b/tex/context/base/core-fig.tex
index 5b0af710c..714a85e49 100644
--- a/tex/context/base/core-fig.tex
+++ b/tex/context/base/core-fig.tex
@@ -524,3 +524,38 @@
[buffer] [\jobname] [\c!type=\v!buffer,\c!object=\v!no]
\protect \endinput
+
+% alternative for positioning
+
+% \definelayer[figure][width=\overlaywidth,height=\overlayheight]
+% \defineoverlay[figure][{\directsetup{figure}\tightlayer[figure]}]
+
+% \setupcolors[state=start]
+
+% \starttext
+
+% \startsetups figure
+% \setlayerframed[figure][preset=rightbottom,x=.25\layerwidth,y=.25\layerheight]{HERE}
+% \setlayerframed[figure][preset=leftbottom, x=.15\layerwidth,y=.35\layerheight]{THERE}
+% \stopsetups
+
+% \externalfigure[cow][background={foreground,figure},width=4cm,height=8cm]
+
+% \startsetups figure
+% \setlayerframed[figure][preset=righttop,x=.25\layerwidth,y=.25\layerheight]{MORE}
+% \setlayerframed[figure][preset=middle,foregroundcolor=green]{EVEN MORE}
+% \stopsetups
+
+% \externalfigure[cow][background={foreground,figure},width=14cm,height=2cm]
+
+% \defineexternalfigure[whatever][background={foreground,figure}]
+
+% \startsetups figure
+% \setlayerframed[figure][preset=righttop,x=.25\layerwidth,y=.25\layerheight]{\red MORE}
+% \setlayerframed[figure][preset=middle,foregroundcolor=green]{EVEN MORE}
+% \stopsetups
+
+% \externalfigure[cow][whatever][width=14cm,height=4cm]
+
+% \stoptext
+
diff --git a/tex/context/base/core-fnt.tex b/tex/context/base/core-fnt.tex
index 15f9f0e5c..e6f7fada4 100644
--- a/tex/context/base/core-fnt.tex
+++ b/tex/context/base/core-fnt.tex
@@ -356,7 +356,9 @@
\def\stretchedsomecase#1#2%
{\bgroup
#1{\def\textstring{#2}}%
- \ifdim\stretchedspaceamount>\zeropoint
+ \ifdim\stretchedspaceamount=\zeropoint
+ \textstring
+ \else
\def\textkern##1%
{% beware: ##1 may not be \box\somebox -)
\determinemidwordbreak{##1}{\stretchedbreaktokens}%
@@ -366,8 +368,6 @@
\hskip\stretchedspacefactor\scratchdimen}%
\@EA\processtokens\@EA\relax\@EA\textkern\@EA\relax\@EA
\textskip\@EA{\textstring}%
- \else
- \textstring
\fi
\egroup}
diff --git a/tex/context/base/core-inc.lua b/tex/context/base/core-inc.lua
index 5ecefc5bb..1707c1b25 100644
--- a/tex/context/base/core-inc.lua
+++ b/tex/context/base/core-inc.lua
@@ -200,31 +200,36 @@ end
function figures.registersuffix (suffix, target) register('list', target,suffix ) end
function figures.registerpattern(pattern,target) register('pattern',target,pattern) end
-local pathhash = { }
+local last_locationset, last_pathlist = last_locationset or nil, last_pathlist or nil
function figures.setpaths(locationset,pathlist)
- local ph, iv, t = pathhash[locationset], interfaces.variables, nil
- if ph then
- ph = ph[pathlist]
- if ph then
- figures.paths = ph
- return
+ if last_locationset == locationset and last_pathlist == pathlist then
+ -- this function can be called each graphic so we provide this optimization
+ return
+ end
+ local iv, t, h = interfaces.variables, figures.paths, locationset:tohash()
+ if last_locationset ~= locationset then
+ -- change == reset (actually, a 'reset' would indeed reset
+ if h[iv["local"]] then
+ t = table.fastcopy(figures.localpaths or { })
+ else
+ t = { }
end
+ figures.defaultsearch = h[iv["default"]]
+ last_locationset = locationset
end
- if not ph then
- ph = { }
- pathhash[locationset] = ph
- end
- local h = locationset:tohash()
- t = (h[iv["local"]] and figures.localpaths) or { }
if h[iv["global"]] then
for s in pathlist:gmatch("([^, ]+)") do
- t[#t+1] = s
+ if not table.contains(t,s) then
+ t[#t+1] = s
+ end
end
end
- figures.defaultsearch = h[iv["default"]]
- ph[pathlist] = t
- figures.paths = t
+ figures.paths, last_pathlist = t, pathlist
+ if figures.trace then
+ logs.report("figures","locations: %s",last_locationset)
+ logs.report("figures","path list: %s",table.concat(figures.paths))
+ end
end
-- check conversions and handle it here
@@ -244,7 +249,8 @@ end
--~ end
function figures.hash(data)
- return data.status.fullname .. "+".. (data.request.page or 1) -- img is still not perfect
+ return tostring(data.status.private) -- the
+-- return data.status.fullname .. "+".. (data.status.page or data.request.page or 1) -- img is still not perfect
end
-- interfacing to tex
@@ -345,8 +351,9 @@ do
local converter = figures.converters[format]
if converter then
local oldname = specification.fullname
+ local newformat = "pdf" -- todo, other target than pdf
local newpath = file.dirname(oldname)
- local newbase = file.replacesuffix(file.basename(oldname),"pdf") -- todo
+ local newbase = file.replacesuffix(file.basename(oldname),newformat)
local fc = specification.cache or figures.cachepaths.path
if fc and fc ~= "" and fc ~= "." then
newpath = fc
@@ -372,13 +379,17 @@ do
specification.prefix = prefix
specification.subpath = subpath
specification.converted = true
- elseif exists(oldname) then
+ format = newformat
+ elseif io.exists(oldname) then
specification.fullname = newname
specification.converted = false
end
end
end
- specification.found = true -- ?
+ specification.found = validtypes[format]
+ if figures.trace then
+ logs.report("figures","format not supported: %s",format)
+ end
else
specification = { }
end
@@ -394,7 +405,7 @@ do
end
local askedpath= file.dirname(askedname)
local askedbase = file.basename(askedname)
- local askedformat = (request.format ~= "" and request.format ~= "unknown" and request.format) or file.extname(askedname)
+ local askedformat = (request.format ~= "" and request.format ~= "unknown" and request.format) or file.extname(askedname) or ""
local askedcache = request.cache
if askedformat ~= "" then
askedformat = askedformat:lower()
@@ -623,7 +634,7 @@ 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", dr.page, dr.size or "crop"
+ local name, page, size = du.fullname or "unknown generic", du.page or dr.page, dr.size or "crop"
local hash = name .. "->" .. page .. "->" .. size
local figure = figures.loaded[hash]
if figure == nil then
@@ -795,7 +806,7 @@ function figures.bases.find(basename,askedlabel)
end
end
t = false
- if base[2] and base[3] then
+ if base[2] and base[3] then -- rlx:library
for e, d, k in xml.elements(base[3],"/(*:library|figurelibrary)/*:figure/*:label") do
page = page + 1
if xml.content(d[k]) == askedlabel then
@@ -806,11 +817,10 @@ function figures.bases.find(basename,askedlabel)
page = page,
}
figures.bases.found[askedlabel] = t
- break
+ return t
end
end
end
- figures.bases.found[askedlabel] = t
end
return t
end
@@ -837,6 +847,7 @@ function figures.identifiers.base(data)
du.fullname = fbl.base
ds.fullname = fbl.name
ds.format = fbl.format
+ ds.page = fbl.page
ds.status = 10
end
end
diff --git a/tex/context/base/core-itm.tex b/tex/context/base/core-itm.tex
index 605e3ef1d..1c8744d5b 100644
--- a/tex/context/base/core-itm.tex
+++ b/tex/context/base/core-itm.tex
@@ -149,7 +149,11 @@
\edef\currentminnofitems{\the\scratchcounter}%
% [[\currentnofitems,\currentminnofitems,\currentmaxnofitems]]
\fi
- \fi}
+ \else % new, when no tuo yet
+ \let\currentnofitems \!!zerocount
+ \let\currentminnofitems\!!plusone
+ \let\currentmaxnofitems\!!zerocount
+ \fi} % [[\currentnofitems,\currentminnofitems,\currentmaxnofitems]]
% \startitemize[n,packed]
% \item test \item test \item test
@@ -218,14 +222,14 @@
\def\doinitializeitemgrouplevel#1%
{\copyparameters
[\??op\currentitemgroup#1][\??oo]
- [\c!width,\c!factor,\c!distance,\c!align,\c!symalign,\c!option,
- \c!style,\c!marstyle,\c!symstyle,\c!headstyle,
- \c!color,\c!marcolor,\c!symcolor,\c!headcolor,
- \c!beforehead,\c!afterhead,\c!before,\c!inbetween,\c!after,
- \c!stopper,\c!placestopper,\c!indenting,
- \c!n,\c!inner,\c!symbol,\c!margin,\c!items,
- \c!leftmargin,\c!rightmargin,\c!indentnext,
- \c!command,
+ [\c!width,\c!factor,\c!distance,\c!align,\c!symalign,\c!option,%
+ \c!style,\c!marstyle,\c!symstyle,\c!headstyle,%
+ \c!color,\c!marcolor,\c!symcolor,\c!headcolor,%
+ \c!beforehead,\c!afterhead,\c!before,\c!inbetween,\c!after,%
+ \c!stopper,\c!placestopper,\c!indenting,%
+ \c!n,\c!inner,\c!symbol,\c!margin,\c!items,%
+ \c!leftmargin,\c!rightmargin,\c!indentnext,%
+ \c!command,%
\c!start,\c!lefttext,\c!righttext]}
\def\setupitemgroups
@@ -805,6 +809,9 @@
\def\itemgroupitem
{\doitemgroupitem}
+\def\itemgroupnoitem
+ {\doitemgroupnoitem}
+
\def\itemgroupbutton[#1]%
{\gdef\doitemdestination{#1}%
\itemgroupitem}
@@ -846,7 +853,8 @@
\itemgroupitem}
\appendtoks \let\item \itemgroupitem \to \itemgroupcommands
-%appendtoks \letvalue\v!item \itemgroupitem \to \itemgroupcommands
+\appendtoks \let\noitem \itemgroupnoitem \to \itemgroupcommands
+\appendtoks \letvalue\v!item \itemgroupitem \to \itemgroupcommands
\appendtoks \let\itm \itemgroupitem \to \itemgroupcommands
\appendtoks \let\but \itemgroupbutton \to \itemgroupcommands
\appendtoks \let\nop \itemgroupdummy \to \itemgroupcommands
@@ -1043,6 +1051,23 @@
\EveryPar{\ignorespaces}% needed ?
\ignorespaces}
+% For Wolfgang Schuster
+
+% \startitemize[n,repeat]
+% \noitem \startitemize[a] \item Item 1.a. \item Item 1.b. \stopitemize
+% \noitem \startitemize[a] \item Item 2.a. \item Item 2.b. \stopitemize
+% \stopitemize
+
+\def\donolistitem % reduced \dolistitem
+ {\increment\noflistelements
+ \setbox8\hbox
+ {\doitemattributes\currentitemlevel\c!style\c!color{\listitem}}%
+ \checkforrepeatedlistitem
+ \ignorespaces}
+
+\def\doitemgroupnoitem
+ {\doadvanceitem\donolistitem}
+
% For Frank Grieshaber and Mojca Miklavec:
\newconditional\repeatlistitem
@@ -1102,7 +1127,8 @@
\fi % new, concat
\doadvanceitem
\ifcase\itemcolumndepth \ifnum\noflistelements>0\relax
- \doitembreak\nobreak
+ % wrong, but why was this here in the first place, probably some
+ % mistaken change when cleaning up: \doitembreak\nobreak
\fi\fi
\ifconditional\firstlistitem
\setfalse\firstlistitem
diff --git a/tex/context/base/core-job.lua b/tex/context/base/core-job.lua
index 1739f5381..8b45a5783 100644
--- a/tex/context/base/core-job.lua
+++ b/tex/context/base/core-job.lua
@@ -39,6 +39,36 @@ function commands.doifelsespaces(str)
return commands.doifelse(str:find("^ +$"))
end
+local s = lpeg.splitat(",")
+
+local h = { }
+
+function commands.doifcommonelse(a,b)
+ local ha = h[a]
+ local hb = h[b]
+ if not ha then ha = s:match(a) h[a] = ha end
+ if not hb then hb = s:match(b) h[b] = hb end
+ for i=1,#ha do
+ for j=1,#hb do
+ if ha[i] == hb[i] then
+ return cs.testcase(true)
+ end
+ end
+ end
+ return cs.testcase(false)
+end
+
+function commands.doifinsetelse(a,b)
+ local hb = h[b]
+ if not hb then hb = s:match(b) h[b] = hb end
+ for j=1,#hb do
+ if a == hb[i] then
+ return cs.testcase(true)
+ end
+ end
+ return cs.testcase(false)
+end
+
function commands. def(cs,value) texsprint(tex.ctxcatcodes,format( "\\def\\%s{%s}",cs,value)) end
function commands.edef(cs,value) texsprint(tex.ctxcatcodes,format("\\edef\\%s{%s}",cs,value)) end
function commands.gdef(cs,value) texsprint(tex.ctxcatcodes,format("\\gdef\\%s{%s}",cs,value)) end
@@ -48,7 +78,7 @@ function commands.cs(cs,args) texsprint(tex.ctxcatcodes,format("\\csname %s\\end
-- main code
-local function find_file(name,maxreadlevel)
+function input.findctxfile(name,maxreadlevel)
local function exists(n)
if io.exists(n) then
return n
@@ -82,7 +112,7 @@ local function find_file(name,maxreadlevel)
end
function commands.processfile(name,maxreadlevel)
- name = find_file(name,maxreadlevel)
+ name = input.findctxfile(name,maxreadlevel)
if name ~= "" then
--~ texsprint(tex.ctxcatcodes,format('\\input {%s}',name)) -- future version
texsprint(tex.ctxcatcodes,format("\\input %s\\relax",name)) -- we need \input {name}
@@ -90,11 +120,11 @@ function commands.processfile(name,maxreadlevel)
end
function commands.doifinputfileelse(name,maxreadlevel)
- commands.doifelse(find_file(name,maxreadlevel) ~= "")
+ commands.doifelse(input.findctxfile(name,maxreadlevel) ~= "")
end
function commands.locatefilepath(name,maxreadlevel)
- texsprint(tex.texcatcodes,file.dirname(find_file(name,maxreadlevel)))
+ texsprint(tex.texcatcodes,file.dirname(input.findctxfile(name,maxreadlevel)))
end
function commands.usepath(paths,maxreadlevel)
@@ -124,26 +154,19 @@ end
--~
local function convertexamodes(str)
- local x, t = xml.convert(str), { }
+ local x = xml.convert(str)
for e, d, k in xml.elements(x,"exa:variable") do
local dk = d[k]
local label = dk.at and dk.at.label
if label and label ~= "" then
- local data = xml.content(dk)
+ local data = xml.content(dk) or ""
local mode = label:match("^mode:(.+)$")
if mode then
texsprint(tex.ctxcatcodes,format("\\enablemode[%s:%s]",mode,data))
end
- if data:find("{}") then
- t[#t+1] = format("%s={%s}",mode,data)
- else
- t[#t+1] = format("%s=%s",mode,data)
- end
+ texsprint(tex.ctxcatcodes,format("\\setvariable{exa:variables}{%s}{%s}",label,data:gsub("([{}])","\\%1")))
end
end
- if #t > 0 then
- texsprint(tex.ctxcatcodes,format("\\setvariables[exa:variables][%s]",table.concat(t,",")))
- end
end
-- we need a system file option: ,. .. etc + paths but no tex lookup so input.find_file is wrong here
diff --git a/tex/context/base/core-job.mkiv b/tex/context/base/core-job.mkiv
index b110f3892..2c0f34412 100644
--- a/tex/context/base/core-job.mkiv
+++ b/tex/context/base/core-job.mkiv
@@ -36,4 +36,7 @@
% \testfeatureonce{100000}{\doifelse{hello world}{here i am}{}} % 0.3
% \testfeatureonce{100000}{\expandabledoifelse{hello world}{here i am}{}} % 1.5
+\def\expdoifcommonelse#1#2{\ctxlua{commands.doifcommonelse("#1","#2")}}
+\def\expdoifinsetelse #1#2{\ctxlua{commands.doifinsetelse("#1","#2")}}
+
\protect \endinput
diff --git a/tex/context/base/core-job.tex b/tex/context/base/core-job.tex
index ea268c2f8..ca9ef67c3 100644
--- a/tex/context/base/core-job.tex
+++ b/tex/context/base/core-job.tex
@@ -78,7 +78,7 @@
\def\loadsystemfiles
{\reportprotectionstate
\readsysfile\f!newfilename{\showmessage\m!systems2\f!newfilename}\donothing
- \readsysfile\f!oldfilename{\showmessage\m!systems2\f!oldfilename}\donothing
+ %\readsysfile\f!oldfilename{\showmessage\m!systems2\f!oldfilename}\donothing
\loadallsystemfiles\f!filfilename
\donothing
\loadallsystemfiles\f!sysfilename
diff --git a/tex/context/base/core-lst.tex b/tex/context/base/core-lst.tex
index 1f6097771..d246be3bc 100644
--- a/tex/context/base/core-lst.tex
+++ b/tex/context/base/core-lst.tex
@@ -221,10 +221,15 @@
\setvalue{#1\c!inbetween}{\dobetweenlist{#1}}%
\setvalue{#1\c!list }{\dolistelement{#1}}}
+% \def\dodoresetlist#1%
+% {\let\nolist\empty
+% \setvalue{#1\c!inbetween}{\gobblefourarguments{#1}}%
+% \setvalue{#1\c!list }{\gobblesixarguments {#1}}}
+
\def\dodoresetlist#1%
{\let\nolist\empty
- \setvalue{#1\c!inbetween}{\gobblefourarguments{#1}}%
- \setvalue{#1\c!list }{\gobblesixarguments {#1}}}
+ \letvalue{#1\c!inbetween}\gobblethreearguments
+ \letvalue{#1\c!list }\gobblefivearguments}
\let\nolist\empty
@@ -263,6 +268,7 @@
\c!symbol=,
\c!interaction=\v!sectionnumber,
\v!part\v!number=\v!yes, % nodig ? % v
+ %\c!prefix=\v!no, % we need to initialize it
\c!label=\v!no,
\c!distance=\!!zeropoint,
\c!separator=\@@koseparator,
@@ -319,7 +325,7 @@
\dosettoclevel\??li\firstlistelement
\honorlocalfilterlevel
\doutilities{listentries,#1}\jobname{#1}\relax\par
- \stoplistreferences{#1}%
+ \stoplistreferences
\dosetlistmode
\endgroup}
@@ -1050,7 +1056,7 @@
\doifvalue{\??ih#1\c!coupling}\v!on
{\startlistreferences{#1}}%
\ExpandFirstAfter\dodoplacecombinedlist[\combinedlist][#2]%
- \stoplistreferences{#1}%
+ \stoplistreferences
\endgroup
\dosetlistmode}
diff --git a/tex/context/base/core-ltb.tex b/tex/context/base/core-ltb.tex
index 915307383..3ebd16379 100644
--- a/tex/context/base/core-ltb.tex
+++ b/tex/context/base/core-ltb.tex
@@ -16,10 +16,6 @@
% todo: als nx>1, dan in geval van rek tussenruimte berekenen en optellen
% bij breedte, dus: nx nog niet gebruiken in combinatie met rek ! ! ! ! !
-\beginTEX
- \expandafter \endinput
-\endTEX
-
% 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
diff --git a/tex/context/base/core-mar.tex b/tex/context/base/core-mar.tex
index 2051102f2..45d12d327 100644
--- a/tex/context/base/core-mar.tex
+++ b/tex/context/base/core-mar.tex
@@ -22,33 +22,6 @@
%
% \fetchmark[naam][plaats]
-% nog expansie in mainmarking
-
-% ook nog reset koppelen aan sectie
-
-%\def\mainmarking#1%
-% {\csname\??mk#1\c!koppeling\endcsname}
-%
-%\def\fastresetmarker#1%
-% {\doifdefined{\??mk\maimarking{#1}}
-% {\expandafter\resetmark\csname\??mk\mainmarking{#1}\endcsname}}
-
-\beginTEX
-
-\def\mainmarking#1%
- {\@EA\ifx\csname\??mk#1\c!coupling\endcsname\relax\else
- \csname\??mk#1\c!coupling\endcsname
- \fi}
-
-\def\fastresetmarker#1%
- {\@EA\ifx\csname\??mk#1\c!coupling\endcsname\relax\else
- \@EA\resetmark\csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\mainmarking#1%
{\ifcsname\??mk#1\c!coupling\endcsname
\csname\??mk#1\c!coupling\endcsname
@@ -59,8 +32,6 @@
\@EA\resetmark\csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
\fi}
-\endETEX
-
\def\fastresetmarkerlist[#1]%
{\expanded{\rawprocesscommalist[#1]}\fastresetmarker}
@@ -140,82 +111,6 @@
\def\doifmarkingelse#1%
{\doifdefinedelse{\??mk#1}}
-% \def\fetchmark[#1][#2]% never \unexpanded
-% {\@EA\csname\??mk\??mk#2\@EA\endcsname\csname\??mk\mainmarking{#1}\endcsname}
-
-% \beginTEX
-%
-% \def\fetchmark[#1][#2]% never \unexpanded
-% {\@EA\ifx\csname\??mk#1\c!coupling\endcsname\relax\else
-% \csname\??mk\??mk#2\@EA\endcsname
-% \csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
-% \fi}
-%
-% \endTEX
-%
-% \beginETEX \ifcsname
-%
-% \def\fetchmark[#1][#2]% never \unexpanded
-% {\ifcsname\??mk#1\c!coupling\endcsname
-% \csname\??mk\??mk#2\@EA\endcsname
-% \csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
-% \fi}
-%
-% \endETEX
-%
-% \def\fetchtwomarks[#1]%
-% {\doifsomething{\fetchmark[#1][\v!first]}
-% {\fetchmark[#1][\v!first]%
-% \doifsomething{\fetchmark[#1][\v!last]}
-% {\doifnot{\fetchmark[#1][\v!first]}{\fetchmark[#1][\v!last]}
-% {\getvalue{\??mk#1\c!separator}\fetchmark[#1][\v!last]}}}}
-%
-% \def\fetchallmarks[#1]%
-% {\doifsomething{\fetchmark[#1][\v!first]}
-% {\doifsomething{\fetchmark[#1][\v!previous]}
-% {\doifnot{\fetchmark[#1][\v!previous]}{\fetchmark[#1][\v!first]}
-% {\fetchmark[#1][\v!previous]\getvalue{\??mk#1\c!separator}}}}%
-% \fetchtwomarks[#1]}
-%
-% \def\dogetmarking[#1][#2]%
-% {\doifvalue{\??mk#1\c!state}\v!start
-% {\bgroup
-% %\def\nomarking##1{\unknown\ }%
-% \def\nomarking{\splitsequence{\getvalue{\??mk#1\c!limittext}}}%
-% \setfullsectionnumber{\??mk#1}%
-% \processaction % slow
-% [#2]
-% [ \v!both=>{\fetchtwomarks[#1]},
-% \v!all=>{\fetchallmarks[#1]},
-% \s!default=>{\fetchmark [#1][\v!first]},
-% \s!unknown=>{\fetchmark [#1][#2]}]%
-% \egroup}}
-%
-% \def\nogetmarking[#1][#2]%
-% {}
-%
-% \unexpanded\def\getmarking
-% {\dodoubleargument\dogetmarking}
-
-\beginTEX
-
-\def\fetchmark[#1][#2]% % expandable / never use \unexpanded
- {\@EA\ifx\csname\??mk::#1\endcsname\relax
- \@EA\ifx\csname\??mk#1\c!coupling\endcsname\relax
- % nothing
- \else
- \csname\??mk\??mk#2\@EA\endcsname
- \csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
- \fi
- \else
- \csname\??mk::\??mk::#2\@EA\@EA\@EA\endcsname
- \csname\??mk::#1\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\fetchmark[#1][#2]% % expandable / never use \unexpanded
{\ifcsname\??mk::#1\endcsname % saved mark
\csname\??mk::\??mk::#2\@EA\@EA\@EA\endcsname
@@ -225,17 +120,6 @@
\csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
\fi\fi}
-\endETEX
-
-% \def\fetchmark[#1][#2]% % expandable / never use \unexpanded
-% {\ifcsname\??mk::#1\endcsname % saved mark
-% \csname\??mk::\??mk::#2\@EA\@EA\@EA\endcsname
-% \csname\??mk::#1\endcsname
-% \else\ifcsname\??mk#1\c!coupling\endcsname % real mark
-% \csname\??mk\??mk#2\@EA\endcsname
-% \csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
-% \fi\fi}
-
\letvalue{\??mk::\??mk::\v!previous}\firstoffourarguments
\letvalue{\??mk::\??mk::\v!first }\secondoffourarguments
\letvalue{\??mk::\??mk::\v!last }\thirdoffourarguments
@@ -366,21 +250,6 @@
\let\setsomemark\setmark
-\beginTEX
-
-\def\domarking[#1]#2%
- {\@EA\ifx\csname\??mk#1\c!coupling\endcsname\relax\else
- \bgroup
- \doifelsevalue{\??mk#1\c!expansion}\v!yes
- \expandmarkstrue\expandmarksfalse
- \@EA\setsomemark\csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname{#2}%
- \egroup
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\domarking[#1]#2%
{\ifcsname\??mk#1\c!coupling\endcsname
\bgroup
@@ -390,8 +259,6 @@
\egroup
\fi}
-\endETEX
-
\def\marking
{\dosingleargument\domarking}
diff --git a/tex/context/base/core-mat.tex b/tex/context/base/core-mat.tex
index 9e5053f7f..f7517c445 100644
--- a/tex/context/base/core-mat.tex
+++ b/tex/context/base/core-mat.tex
@@ -2646,8 +2646,32 @@
\def\dofrac#1#2#3{\relax\mathematics{{{#1{#2}}\over{#1{#3}}}}}
+% \unexpanded\def\frac
+% {\dofrac\mathstyle}
+%
+% \chardef\mathfracmode=0 $\frac{1}{2}$
+% \chardef\mathfracmode=1 $\frac{1}{2}$
+% \chardef\mathfracmode=2 $\frac{1}{2}$
+% \chardef\mathfracmode=3 $\frac{1}{2}$
+% \chardef\mathfracmode=4 $\frac{1}{2}$
+% \chardef\mathfracmode=5 $\frac{1}{2}$
+
+\chardef\mathfracmode=0 % 0=mathstyle, 1=displaystyle, 2=textstyle, 3=scriptstyle, 4=scriptscriptstyle
+
\unexpanded\def\frac
- {\dofrac\mathstyle}
+ {\ifcase\mathfracmode
+ \expandafter\dofrac\expandafter\mathstyle
+ \or
+ \expandafter\dofrac\expandafter\displaystyle
+ \or
+ \expandafter\dofrac\expandafter\textstyle
+ \or
+ \expandafter\dofrac\expandafter\scriptstyle
+ \or
+ \expandafter\dofrac\expandafter\scriptscriptstyle
+ \else
+ \expandafter\dofrac\expandafter\mathstyle
+ \fi}
\unexpanded\def\xfrac#1#2%
{\begingroup
diff --git a/tex/context/base/core-mis.tex b/tex/context/base/core-mis.tex
index 1600705dc..de1da7597 100644
--- a/tex/context/base/core-mis.tex
+++ b/tex/context/base/core-mis.tex
@@ -650,17 +650,41 @@
\def\setuphyphenmark
{\dodoubleargument\getparameters[\??kp]}
-\setuphyphenmark
- [\c!sign=\composedhyphen]
-\def\defaultdiscretionaryhyphen{\@@kpsign}
+\def\setuphyphenmark[#1]% sign=normal|wide
+ {\dodoubleargument\getparameters[\??kp][#1]%
+ \doifinsetelse\@@kpsign {\v!normal}
+ {\let\textmodehyphen\normalhyphen \let\textmodehyphendiscretionary\normalhyphendiscretionary}
+ {\let\textmodehyphen\composedhyphen\let\textmodehyphendiscretionary\composedhyphendiscretionary}}
+
+\setuphyphenmark[\c!sign=\v!wide]
+% % \setuphyphenmark[\c!sign=\v!normal]
+
+\definesymbol[\c!lefthyphen] [\languageparameter\c!lefthyphen]
+\definesymbol[\c!righthyphen] [\languageparameter\c!righthyphen]
+\definesymbol[\c!hyphen] [\languageparameter\c!hyphen]
+
+\def\normalhyphen
+ {\hbox{\directsymbol\empty\c!hyphen}}
\def\composedhyphen
+ {\hbox{\directsymbol\empty\c!compoundhyphen}}
+
+\def\normalhyphendiscretionary
+ {\discretionary
+ {\hbox{\directsymbol\empty\c!lefthyphen}}
+ {\hbox{\directsymbol\empty\c!righthyphen}}
+ {\hbox{\directsymbol\empty\c!hyphen}}}
+
+\def\composedhyphendiscretionary
{\discretionary
{\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
{\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
{\hbox{\directsymbol\empty\c!compoundhyphen}}}
+\let\textmodehyphen \composedhyphen
+\let\textmodehyphendiscretionary\composedhyphendiscretionary
+
\definesymbol[\c!leftcompoundhyphen] [\languageparameter\c!leftcompoundhyphen]
\definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
\definesymbol[\c!compoundhyphen] [\languageparameter\c!compoundhyphen]
@@ -924,23 +948,12 @@
\dochecknextindentation{\??ci\currentdelimitedtext}% AM: here
\dorechecknextindentation}% AM: This was missing!
-% \def\dostartdelimitedtexttxt
-% {\let\dostopdelimitedtext\dostopdelimitedtexttxt
-% \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
-% \dohandledelimitedtext\c!left
-% \ignorespaces}
-
\def\dostartdelimitedtexttxt
{\let\dostopdelimitedtext\dostopdelimitedtexttxt
\dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
\dohandleleftdelimitedtext\c!left
\ignorespaces}
-% \def\dostopdelimitedtexttxt
-% {\removeunwantedspaces
-% \dohandledelimitedtext\c!right
-% \dostopattributes}
-
\def\dostopdelimitedtexttxt
{\removeunwantedspaces
\dohandlerightdelimitedtext\c!right
@@ -952,13 +965,13 @@
\egroup}
\def\pushdelimitedtext#1%
- {\pushmacro\currentdelimitedtext
+ {\globalpushmacro\currentdelimitedtext
\def\currentdelimitedtext{#1}%
\doglobal\incrementvalue{\??ci\currentdelimitedtext\c!level}}
\def\popdelimitedtext
{\doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
- \popmacro\currentdelimitedtext}
+ \globalpopmacro\currentdelimitedtext}
\def\delimitedtext[#1]%
{\pushdelimitedtext{#1}%
@@ -974,13 +987,15 @@
\def\delimited {\delimitedtext}
\def\leftdelimitedtextmark
- {\dontleavehmode
- \setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
- \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
- \box\scratchbox}
+ {\doifsomething{\delimitedtextparameter\c!left}
+ {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
+ \dontleavehmode
+ \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
+ \box\scratchbox}}
\def\rightdelimitedtextmark
- {\hsmash{\delimitedtextparameter\c!right}}
+ {\doifsomething{\delimitedtextparameter\c!right}
+ {\hsmash{\delimitedtextparameter\c!right}}}
% \starttext
% \hyphenatedword{groepsvrijstellingsverordeningen}\par
@@ -1077,13 +1092,6 @@
\def\handlerightdelimitedtext#1%
{\dohandlerightdelimitedtext{#1}\relax}
-% \unexpanded\def\dodelimitedtextpar
-% {\dohandledelimitedtext\c!left\relax
-% \groupedcommand
-% \donothing
-% {\dohandledelimitedtext\c!right\removelastskip
-% \popdelimitedtext}}
-
\unexpanded\def\dodelimitedtextpar
{\dohandleleftdelimitedtext\c!left\relax
\groupedcommand
@@ -1095,14 +1103,6 @@
{\doifelse{\delimitedtextparameter\c!style}\v!normal
\doquoteddelimited\doattributeddelimited}
-% \def\doquoteddelimited
-% {\dohandledelimitedtext\c!left\relax
-% \groupedcommand
-% \donothing
-% {\dohandledelimitedtext\c!right
-% \removelastskip
-% \popdelimitedtext}}
-
\def\doquoteddelimited
{\dohandleleftdelimitedtext\c!left\relax
\groupedcommand
diff --git a/tex/context/base/core-new.tex b/tex/context/base/core-new.tex
index b9b3ee43a..e96039d10 100644
--- a/tex/context/base/core-new.tex
+++ b/tex/context/base/core-new.tex
@@ -118,9 +118,17 @@
% \long\def\dodostartsetups#1#2#3% watch out: not \grabuntil
% {\cleanuplabel{\??su#2:#3}\dograbuntil#1{\endgroup\dodoglobal\long\setvalue\cleanlabel}} % \doglobal
+% \long\def\dodostartsetups#1#2#3%
+% {\cleanuplabel{\??su#2:#3}%
+% \long\def\dododostartsetups##1#1{\endgroup\dodoglobal\long\setvalue\cleanlabel####1{##1}}\dododostartsetups}
+
\long\def\dodostartsetups#1#2#3%
{\cleanuplabel{\??su#2:#3}%
- \long\def\dododostartsetups##1#1{\endgroup\dodoglobal\long\setvalue\cleanlabel####1{##1}}\dododostartsetups}
+ \long\def\dododostartsetups##1#1%
+ {\endgroup
+ \dodoglobal % bah
+ \long\expandafter\setvalue\expandafter\cleanlabel\expandafter####\expandafter1\expandafter{##1}}%
+ \dododostartsetups\empty} % the empty trick prevents the { } in {arg} from being eaten up
\def\systemsetupsprefix{*}
@@ -276,23 +284,10 @@
%
% \def\env#1{\csname\??en#1\endcsname}
%
-% \beginTEX
-%
-% \def\envvar#1#2%
-% {\@EA\ifx\csname\??en#1\endcsname\relax
-% #2\else\csname\??en#1\endcsname
-% \fi}
-%
-% \endTEX
-%
-% \beginETEX \ifcsname
-%
% \def\envvar#1#2%
% {\ifcsname\??en#1\endcsname
% \csname\??en#1\endcsname\else#2%
% \fi}
-%
-% \endETEX
% low level change, now also accessible as \getvariable{environment}{...}; the
% next macros will become obsolete some day in favor of normal variables
diff --git a/tex/context/base/core-not.tex b/tex/context/base/core-not.tex
index b74ba9403..aa6edd0e6 100644
--- a/tex/context/base/core-not.tex
+++ b/tex/context/base/core-not.tex
@@ -218,6 +218,7 @@
\c!interaction=\v!yes,
\c!factor=,
\c!scope=, % \v!text \v!page
+ \c!next=\autoinsertnextspace, % new, experimental with startnotes
\c!n=1]%
\definenumber
[\currentnote]
@@ -225,10 +226,15 @@
\c!sectionnumber=\noteparameter\c!way,
\c!conversion=\noteparameter\c!conversion]%
\letvalue{\??vn\c!rule:\currentnote}\normalnoterule
- \unexpanded\setvalue{\currentnote}{\setnote[#1]}%
- \unexpanded\setvalue{\currentnote\v!text}{\setnotetext[#1]}%
+ \unexpanded\setvalue{\currentnote }{\setnote[#1]}%
+ \unexpanded\setvalue{\currentnote\v!text }{\setnotetext[#1]}%
+ \unexpanded\setvalue{\e!start\currentnote}{\dodoubleempty\dostartcurrentnote[#1]}%
+ \unexpanded\setvalue{\e!stop\currentnote }{\dostopcurrentnote}%
\setupnote[\currentnote][#2]}
+\def\dostartcurrentnote[#1][#2]{\setnote[#1][#2]\bgroup\ignorespaces}
+\def\dostopcurrentnote {\removeunwantedspaces\egroup\noteparameter\c!next}
+
\def\setupnotedefinition[#1]%
{\setupdescriptions[\??vn\??vn#1]}
@@ -238,15 +244,15 @@
\def\dosetupnote[#1][#2]%
{\edef\currentnote{#1}%
\ifsecondargument
-\ifcase\localnodemode\or
- \edef\localnode@n{\noteparameter\c!n}%
- \edef\localnode@l{\noteparameter\c!location}%
-\fi
+ \ifcase\localnodemode\or
+ \edef\localnode@n{\noteparameter\c!n}%
+ \edef\localnode@l{\noteparameter\c!location}%
+ \fi
\getparameters[\??vn\currentnote][#2]%
-\ifcase\localnodemode\or
- \letvalue{\??vn\currentnote\c!n }\localnode@n
- \letvalue{\??vn\currentnote\c!location}\localnode@l
-\fi
+ \ifcase\localnodemode\or
+ \letvalue{\??vn\currentnote\c!n }\localnode@n
+ \letvalue{\??vn\currentnote\c!location}\localnode@l
+ \fi
\processaction
[\noteparameter\c!rule]
[ \v!on=>\letvalue{\??vn\c!rule:\currentnote}\normalnoterule,
@@ -277,6 +283,10 @@
% so that it matches:
+% todo: make sure less calls, is quite some code
+
+% BEWARE, OVERLOADED IN cont-new.mkiv
+
\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 (**)
@@ -939,9 +949,7 @@
\dochecknote
\ifendnotes \else
% not that accurate when multiple notes
- \scratchdimen\pagegoal
- \advance\scratchdimen -\pagetotal
- \ifdim\scratchdimen<\ht\localpostponednotes
+ \ifdim\dimexpr\pagegoal-\pagetotal\relax<\ht\localpostponednotes
\message{[moved note \currentnote]}%
\fi
\insert\currentnoteins\bgroup\unvbox\localpostponednotes\egroup
diff --git a/tex/context/base/core-num.tex b/tex/context/base/core-num.tex
index 154bf2f3c..4dde1d4d3 100644
--- a/tex/context/base/core-num.tex
+++ b/tex/context/base/core-num.tex
@@ -29,7 +29,7 @@
% \convertednumber[name]
% \rawnumber[name]
-% private (defined in core-sec.tex)
+% private (defined in core-des.tex)
%
% \nextnumber[name][tag][reference]
% \currentnumber[name]
diff --git a/tex/context/base/core-obj.lua b/tex/context/base/core-obj.lua
index 53f0d6159..338ca9d1f 100644
--- a/tex/context/base/core-obj.lua
+++ b/tex/context/base/core-obj.lua
@@ -7,32 +7,43 @@ if not modules then modules = { } end modules ['core-obj'] = {
}
--[[ldx--
-We save object references in the main utility table. Objects are
+
We save object references in the main utility table. jobobjects are
reusable components.
--ldx]]--
local texsprint = tex.sprint
-if not jobs then jobs = { } end
-if not job then jobs['main'] = { } end job = jobs['main']
-if not job.objects then job.objects = { } end
+jobobjects = jobobjects or { }
+jobobjects.collected = jobobjects.collected or { }
+jobobjects.tobesaved = jobobjects.tobesaved or { }
-function job.getobjectreference(tag,default)
- if job.objects[tag] then
- texsprint(job.objects[tag][1] or default)
- else
- texsprint(default)
- end
+local collected, tobesaved = jobobjects.collected, jobobjects.tobesaved
+
+local function initializer()
+ collected, tobesaved = jobobjects.collected, jobobjects.tobesaved
+end
+
+job.register('jobobjects.collected', jobobjects.tobesaved, initializer, nil)
+
+function jobobjects.save(tag,number,page)
+ local t = { number, page }
+ tobesaved[tag], collected[tag] = t, t
+end
+
+function jobobjects.set(tag,number,page)
+ collected[tag] = { number, page }
+end
+
+function jobobjects.number(tag,default)
+ local o = collected[tag] or tobesaved[tag]
+ texsprint((o and o[1]) or default)
end
-function job.getobjectreferencepage(tag,default)
- if job.objects[tag] then
- texsprint(job.objects[tag][2] or default)
- else
- texsprint(default)
- end
+function jobobjects.page(tag,default)
+ local o = collected[tag] or tobesaved[tag]
+ texsprint((o and o[2]) or default)
end
-function job.doifobjectreference(tag)
- cs.testcase(job.objects[tag])
+function jobobjects.doifelse(tag)
+ cs.testcase(collected[tag] or tobesaved[tag])
end
diff --git a/tex/context/base/core-obj.mkii b/tex/context/base/core-obj.mkii
index 361c1a979..b0599dde9 100644
--- a/tex/context/base/core-obj.mkii
+++ b/tex/context/base/core-obj.mkii
@@ -16,7 +16,11 @@
\def\mkcheckobjectreferences
{\startnointerference
\protectlabels
- \doutilities{objectreferences}\jobname\empty\relax\relax
+ \ifx\usedoutputdriver\currentoutput
+ \doutilities{objectreferences}\jobname\empty\relax\relax
+ \else
+ % different format (will fails on \purenumber)
+ \fi
\global\let\checkobjectreferences\relax
\stopnointerference}
@@ -63,7 +67,7 @@
\def\mkgetobjectreferencepage
{\dodogetobjectreference\secondoftwoarguments\defaultobjectpage}
-\def\mkifobjectreferencefoundelse#1#2%
+\def\mkdoifobjectreferencefoundelse#1#2%
{\checkobjectreferences
\blabelgroup \ifcsname\r!driver#1::#2\endcsname
\elabelgroup \expandafter\firstoftwoarguments
diff --git a/tex/context/base/core-obj.mkiv b/tex/context/base/core-obj.mkiv
index 022b6908d..3a54e6507 100644
--- a/tex/context/base/core-obj.mkiv
+++ b/tex/context/base/core-obj.mkiv
@@ -17,39 +17,10 @@
\registerctxluafile{core-obj}{1.001}
-\appendtoks
- \immediatewriteutilitytua{if not job.objects then job.objects = { } end}%
- \immediatewriteutilitytua{local ob = job.objects}%
-\to \everyopenutilities
-
-\def\mkregisterobjectreference#1#2#3%
- {\blabelgroup
- \expanded{\writeutilitytua{ob['#1::#2']={"#3","\noexpand\realfolio"}}}%
- \expanded{\ctxlua{job.objects['#1::#2']={"#3","\noexpand\realfolio"}}}%
- \elabelgroup}
-
-\def\mkoverloadobjectreference#1#2#3%
- {\blabelgroup
- \expanded{\ctxlua{job.objects['#1::#2']={"#3","\noexpand\realfolio"}}}%
- \elabelgroup}
-
-\def\mkgetobjectreference#1#2#3%
- {\blabelgroup
- \xdef#3{\ctxlua{job.getobjectreference ('#1::#2',"\defaultobjectreference{#1}{#2}")}}%
- \elabelgroup}
-
-\def\mkgetobjectreferencepage#1#2#3%
- {\blabelgroup
- \xdef#3{\ctxlua{job.getobjectreferencepage('#1::#2',"\defaultobjectpage{#1}{#2}")}}%
- \elabelgroup}
-
-% \def\doifobjectreferencefoundelse#1#2
-% {\ctxlua{job.doifobjectreference('#1::#2')}}
-
-\def\doifobjectreferencefoundelse#1#2%
- {\blabelgroup
- \ctxlua{job.doifobjectreference('#1::#2')}%
- {\elabelgroup\firstoftwoarguments}
- {\elabelgroup\secondoftwoarguments}}
+\def\mkregisterobjectreference #1#2#3{\expanded{\ctxlatelua{jobobjects.save("#1::#2",#3,\noexpand\the\realpageno)}}}
+\def\mkoverloadobjectreference #1#2#3{\ctxlua{jobobjects.set("#1::#2",#3,\the\realpageno)}}
+\def\mkgetobjectreference #1#2#3{\xdef#3{\ctxlua{jobobjects.number("#1::#2","\defaultobjectreference{#1}{#2}")}}}
+\def\mkgetobjectreferencepage #1#2#3{\xdef#3{\ctxlua{jobobjects.page("#1::#2","\defaultobjectpage{#1}{#2}")}}}
+\def\mkdoifobjectreferencefoundelse#1#2{\ctxlua{jobobjects.doifelse("#1::#2")}}
\protect \endinput
diff --git a/tex/context/base/core-obj.tex b/tex/context/base/core-obj.tex
index a1b0796d1..23873d2d6 100644
--- a/tex/context/base/core-obj.tex
+++ b/tex/context/base/core-obj.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% todo, move more to mkiv, get rid of blabelgroup
+
\writestatus{loading}{Context Core Macros / Object Handling}
\unprotect
@@ -99,7 +101,7 @@
\def\presetobject#1#2% \global added
{\blabelgroup
- \ifundefined{\r!object#1::#2}%
+ \ifcsname\r!object#1::#2\endcsname\else
\global\@EA\let\csname\r!object#1::#2\endcsname\objectplaceholder
\fi
\elabelgroup}
@@ -107,10 +109,10 @@
\def\dosetobject#1#2#3% \initializepaper this will move to \everyshipout
{\initializepaper
\blabelgroup
- \ifundefined{\r!object#2::#3}%
- \elabelgroup \expandafter\dodosetobject
- \else % tzt, overload internal referenced objects to save entries
+ \ifcsname\r!object#2::#3\endcsname
\elabelgroup \expandafter\gobblefivearguments
+ \else % tzt, overload internal referenced objects to save entries
+ \elabelgroup \expandafter\dodosetobject
\fi
{#1}{#2}{#3}}
@@ -325,7 +327,7 @@
\elabelgroup \expandafter\secondoftwoarguments
\fi}
-\def\doifobjectreferencefoundelse{\mkifobjectreferencefoundelse}
+\def\doifobjectreferencefoundelse{\mkdoifobjectreferencefoundelse}
%D \macros
%D {doifobjectssupportedelse}
diff --git a/tex/context/base/core-pgr.tex b/tex/context/base/core-pgr.tex
index c35a42886..e6f91cec8 100644
--- a/tex/context/base/core-pgr.tex
+++ b/tex/context/base/core-pgr.tex
@@ -169,8 +169,7 @@
%{\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}}}%
% but this one prevents cyclic runs due to
% rounding errors
- {\setbox\scratchbox\hbox to \overlaywidth
- {\dopositionaction{#1::\MPanchoridentifier}\hss}%
+ {\setbox\scratchbox\hbox to \overlaywidth{\dopositionaction{#1::\MPanchoridentifier}\hss}%
\ht\scratchbox\overlayheight
\dp\scratchbox\zeropoint
\box\scratchbox}}%
@@ -202,7 +201,7 @@
\newtoks\everyinsertpositionaction
\def\cleanuppositionaction#1% not in trialtypesetting
- {\ifundefined{\POSactionprefix#1++}\else
+ {\ifcsname\POSactionprefix#1++\endcsname % \ifundefined{\POSactionprefix#1++}\else
\the\everycleanpositionaction
\iflocalpositioning
\letgvalue{\POSactionprefix#1++}\empty
@@ -211,6 +210,16 @@
\fi
\fi}
+% \def\cleanuppositionaction#1% not in trialtypesetting
+% {\ifcsname\POSactionprefix#1++\endcsname
+% \the\everycleanpositionaction
+% \iflocalpositioning
+% \global\expandafter\let\csname\POSactionprefix#1++\endcsname\empty
+% \else
+% \global\expandafter\let\csname\POSactionprefix#1++\expandafter\endcsname\csname\POSactionprefix#1++\endcsname
+% \fi
+% \fi}
+
\def\handlepositionaction#1\with#2\on#3%
{\bgroup
\ifx\currentpositionoverlay\empty
@@ -232,11 +241,8 @@
{\handlepositionaction\dohandlepositionboxes\with{#1}{#2}{#3}\on{#2}}
\def\doinsertpositionboxes#1#2#3% pos tag setups
- {\ifnum\MPp{#1}=\realpageno\relax
- % \doifdefined{\MPoverlayposprefix#1}
- % {\getvalue{\MPoverlayposprefix#1}{#1}{#2}{#3}}%
- \executeifdefined{\MPoverlayposprefix#1}%
- \gobblethreearguments{#1}{#2}{#3}%
+ {\ifnum\MPp{#1}=\realpageno\relax % can be sped up
+ \executeifdefined{\MPoverlayposprefix#1}\gobblethreearguments{#1}{#2}{#3}%
\fi}
\appendtoks
@@ -267,9 +273,13 @@
\let\stopMPpositiongraphic\relax
+% \def\prepareMPpositionvariables
+% {\ifundefined{\@@meta self}\setvalue{\@@meta self}{\currentposition}\fi
+% \ifundefined{\@@meta from}\setvalue{\@@meta from}{\currentposition}\fi}
+
\def\prepareMPpositionvariables
- {\ifundefined{\@@meta self}\setvalue{\@@meta self}{\currentposition}\fi
- \ifundefined{\@@meta from}\setvalue{\@@meta from}{\currentposition}\fi}
+ {\ifcsname\@@meta self\endcsname\else\setvalue{\@@meta self}{\currentposition}\fi
+ \ifcsname\@@meta from\endcsname\else\setvalue{\@@meta from}{\currentposition}\fi}
\newif\ifcollectMPpositiongraphics \collectMPpositiongraphicstrue
@@ -1250,35 +1260,37 @@
{\bgroup
\ifrepositionmarginbox
\global\advance\currentmarginpos\plusone
- \setposition{\s!margin:\number\currentmarginpos}%
+ %\setposition{\s!margin:\number\currentmarginpos}% not always
\ifcase\marginrepositionmethod
% nothing
\or
% nothing
\or
% stack / page check yet untested
+ \setposition{\s!margin:\number\currentmarginpos}%
\scratchdimen\MPy{\s!margin:\number\currentmarginpos}%
\global\advance\currentmarginpos\plusone
\advance\scratchdimen -\MPy{\s!margin:\number\currentmarginpos}%
\advance\scratchdimen -\strutdp
- % new
-% bugged
-% \setbox#1\hbox
-% {\hskip-\MPx{\s!margin:\number\currentmarginpos}%
-% \hskip\MPx{head:\realfolio}%
-% \box#1}%
+ % new but bugged
+ % \setbox#1\hbox
+ % {\hskip-\MPx{\s!margin:\number\currentmarginpos}%
+ % \hskip\MPx{head:\realfolio}%
+ % \box#1}%
% so far
\setbox#1\hbox
{\setposition{\s!margin:\number\currentmarginpos}%
\raise\scratchdimen\box#1}%
\or
% move up
+ \setposition{\s!margin:\number\currentmarginpos}%
\ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax
\scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax
\expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}%
\fi
\or
% move up, assume end of par
+ \setposition{\s!margin:\number\currentmarginpos}%
\ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax
\getnoflines\margincontentheight
\advance\noflines\minusone
@@ -1332,7 +1344,6 @@
{\global\chardef\currentamrealpage0}}% % not found
\expanded
{\doglobal\noexpand\appendtoks
-% #1_menu_button(\currentamposition,\the\currentamrealpage,\noexpand\MPpos{#1:\currentamposition}) ;
#1_menu_button(\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ;
\to \MPmenutoks}%
\hpos{#1:\currentamposition}{#3}}
diff --git a/tex/context/base/core-pos.lua b/tex/context/base/core-pos.lua
index 3bfb89a82..212c65190 100644
--- a/tex/context/base/core-pos.lua
+++ b/tex/context/base/core-pos.lua
@@ -12,83 +12,94 @@ can we store much more information in but it's also
more efficient.
--ldx]]--
-if not jobs then jobs = { } end
-if not job then jobs['main'] = { } end job = jobs['main']
-if not job.positions then job.positions = { } end
+local texprint, concat, format = tex.print, table.concat, string.format
-local texprint = tex.print
-local positions = job.positions
-local concat = table.concat
-local format = string.format
+jobpositions = jobpositions or { }
+jobpositions.collected = jobpositions.collected or { }
+jobpositions.tobesaved = jobpositions.tobesaved or { }
-function job.MPp(id) local jpi = positions[id] texprint((jpi and jpi[1]) or '0' ) end
-function job.MPx(id) local jpi = positions[id] texprint((jpi and jpi[2]) or '0pt') end
-function job.MPy(id) local jpi = positions[id] texprint((jpi and jpi[3]) or '0pt') end
-function job.MPw(id) local jpi = positions[id] texprint((jpi and jpi[4]) or '0pt') end
-function job.MPh(id) local jpi = positions[id] texprint((jpi and jpi[5]) or '0pt') end
-function job.MPd(id) local jpi = positions[id] texprint((jpi and jpi[6]) or '0pt') end
+ptbs, pcol = jobpositions.tobesaved, jobpositions.collected -- global
+
+local function initializer()
+ ptbs, pcol = jobpositions.tobesaved, jobpositions.collected
+end
+
+job.register('jobpositions.collected', jobpositions.tobesaved, initializer)
+
+function jobpositions.copy(target,source)
+ jobpositions.collected[target] = jobpositions.collected[source] or ptbs[source]
+end
+
+function jobpositions.replace(name,...)
+ jobpositions.collected[name] = {...}
+end
+
+function jobpositions.doifelse(name)
+ cs.testcase(jobpositions.collected[name] or ptbs[name])
+end
+
+function jobpositions.MPp(id) local jpi = pcol[id] or ptbs[id] texprint((jpi and jpi[1]) or '0' ) end
+function jobpositions.MPx(id) local jpi = pcol[id] or ptbs[id] texprint((jpi and jpi[2]) or '0pt') end
+function jobpositions.MPy(id) local jpi = pcol[id] or ptbs[id] texprint((jpi and jpi[3]) or '0pt') end
+function jobpositions.MPw(id) local jpi = pcol[id] or ptbs[id] texprint((jpi and jpi[4]) or '0pt') end
+function jobpositions.MPh(id) local jpi = pcol[id] or ptbs[id] texprint((jpi and jpi[5]) or '0pt') end
+function jobpositions.MPd(id) local jpi = pcol[id] or ptbs[id] texprint((jpi and jpi[6]) or '0pt') end
-- the following are only for MP so there we can leave out the pt
-function job.MPxy(id)
- local jpi = positions[id]
+function jobpositions.MPxy(id)
+ local jpi = pcol[id] or ptbs[id]
if jpi then
texprint(format('(%s,%s)',jpi[2],jpi[3]))
else
texprint('(0,0)')
end
end
-
-function job.MPll(id)
- local jpi = positions[id]
+function jobpositions.MPll(id)
+ local jpi = pcol[id] or ptbs[id]
if jpi then
texprint(format('(%s,%s-%s)',jpi[2],jpi[3],jpi[6]))
else
texprint('(0,0)')
end
end
-function job.MPlr(id)
- local jpi = positions[id]
+function jobpositions.MPlr(id)
+ local jpi = pcol[id] or ptbs[id]
if jpi then
texprint(format('(%s+%s,%s-%s)',jpi[2],jpi[4],jpi[3],jpi[6]))
else
texprint('(0,0)')
end
end
-function job.MPur(id)
- local jpi = positions[id]
+function jobpositions.MPur(id)
+ local jpi = pcol[id] or ptbs[id]
if jpi then
texprint(format('(%s+%s,%s+%s)',jpi[2],jpi[4],jpi[3],jpi[5]))
else
texprint('(0,0)')
end
end
-function job.MPul(id)
- local jpi = positions[id]
+function jobpositions.MPul(id)
+ local jpi = pcol[id] or ptbs[id]
if jpi then
texprint(format('(%s,%s+%s)',jpi[2],jpi[3],jpi[5]))
else
texprint('(0,0)')
end
end
-
--- todo
-
-function job.MPpos(id)
- local jpi = positions[id]
+function jobpositions.MPpos(id)
+ local jpi = pcol[id] or ptbs[id]
if jpi then
texprint(concat(jpi,',',1,6))
else
texprint('0,0,0,0,0,0')
end
end
-
-function job.MPplus(id,n,default)
- local jpi = positions[id]
+function jobpositions.MPplus(id,n,default)
+ local jpi = pcol[id] or ptbs[id]
texprint((jpi and jpi[6+n]) or default)
end
-
-function job.MPrest(id,default)
- local jpi = positions[id]
+function jobpositions.MPrest(id,default)
+ local jpi = pcol[id] or ptbs[id]
texprint((jpi and jpi[7] and concat(jpi,",",7,#jpi)) or default)
end
diff --git a/tex/context/base/core-pos.mkiv b/tex/context/base/core-pos.mkiv
index abd95d1a5..860a7a967 100644
--- a/tex/context/base/core-pos.mkiv
+++ b/tex/context/base/core-pos.mkiv
@@ -13,53 +13,51 @@
\unprotect
-\registerctxluafile{core-pos}{1.001}
-
-\appendtoks
- \immediatewriteutilitytua{if not job.positions then job.positions = { } end}%
- \immediatewriteutilitytua{local jp = job.positions}%
-\to \everyopenutilities
-
-\def\replacepospxywhd#1#2#3#4#5#6#7% maybe better just numbers, less garbage collection
- {\ctxlua{job.positions['#1']={\number#2,"\the\dimexpr#3\relax","\the\dimexpr#4\relax",%
- "\the\dimexpr#5\relax","\the\dimexpr#6\relax","\the\dimexpr#7\relax"}}}
-
-\def\dolazysaveposition#1#2#3#4%
- {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4"}}}}
-
-\def\dolazysavepositionwhd#1#2#3#4#5#6#7%
- {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7"}}}}
-
-\def\dolazysavepositionplus#1#2#3#4#5#6#7#8%
- {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+% saveposition : tag page x y
+% savepositionwhd : tag page x y w h d
+% savepositionplus : tag page x y w h d list
+%
+% at some point (when we no longer share code) we will move to numbers
+% do that we have less garbage collection and hashing
+%
+% the global table ptbs is equivalent to jobpositions.tobesaved
+%
+% btw, using a function is more efficient than passing longer code
+% snippets to ctxlua
-\def\dosaveposition#1#2#3#4% tag page x y
- {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4"}}}}
-
-\def\dosavepositionwhd#1#2#3#4#5#6#7% tag page x y w h d
- {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7"}}}}
-
-\def\dosavepositionplus#1#2#3#4#5#6#7#8% tag page x y w h d list
- {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
-
-\def\MPp #1{\ctxlua{job.MPp("#1")}}
-\def\MPx #1{\ctxlua{job.MPx("#1")}}
-\def\MPy #1{\ctxlua{job.MPy("#1")}}
-\def\MPw #1{\ctxlua{job.MPw("#1")}}
-\def\MPh #1{\ctxlua{job.MPh("#1")}}
-\def\MPd #1{\ctxlua{job.MPd("#1")}}
-\def\MPxy #1{\ctxlua{job.MPxy("#1")}}
-\def\MPll #1{\ctxlua{job.MPll("#1")}}
-\def\MPlr #1{\ctxlua{job.MPlr("#1")}}
-\def\MPur #1{\ctxlua{job.MPur("#1")}}
-\def\MPul #1{\ctxlua{job.MPul("#1")}}
-\def\MPpos#1{\ctxlua{job.MPpos("#1")}}
-
-\def\MPplus#1#2#3{\ctxlua{job.MPplus("#1",#2,"#3")}}
-\def\MPrest #1#2{\ctxlua{job.MPrest("#1","#2")}}
-
-\def\doifpositionelse#1{\ctxlua{cs.testcase(job.positions['#1'])}}
+\registerctxluafile{core-pos}{1.001}
-\def\copyposition#1#2{\ctxlua{job.positions['#1']=job.positions['#2']}}
+% \def\dolazysaveposition #1#2#3#4{\expanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4"}}}}
+% \def\dolazysavepositionwhd #1#2#3#4#5#6#7{\expanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+% \def\dolazysavepositionplus#1#2#3#4#5#6#7#8{\expanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+% \def\dosaveposition #1#2#3#4{\expanded{\ctxlua {ptbs['#1']={#2,"#3","#4"}}}}
+% \def\dosavepositionwhd #1#2#3#4#5#6#7{\expanded{\ctxlua {ptbs['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+% \def\dosavepositionplus #1#2#3#4#5#6#7#8{\expanded{\ctxlua {ptbs['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+
+\def\dolazysaveposition #1#2#3#4{\normalexpanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4"}}}}
+\def\dolazysavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+\def\dolazysavepositionplus#1#2#3#4#5#6#7#8{\normalexpanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+\def\dosaveposition #1#2#3#4{\normalexpanded{\ctxlua {ptbs['#1']={#2,"#3","#4"}}}}
+\def\dosavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlua {ptbs['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+\def\dosavepositionplus #1#2#3#4#5#6#7#8{\normalexpanded{\ctxlua {ptbs['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+
+\def\doifpositionelse #1{\ctxlua{jobpositions.doifelse('#1')}}
+\def\copyposition #1#2{\ctxlua{jobpositions.copy('#1','#2')}}
+\def\replacepospxywhd#1#2#3#4#5#6#7{\ctxlua{jobpositions.replace('#1',\number#2,"\the\dimexpr#3\relax","\the\dimexpr#4\relax","\the\dimexpr#5\relax","\the\dimexpr#6\relax","\the\dimexpr#7\relax")}}
+
+\def\MPp #1{\ctxlua{jobpositions.MPp("#1")}}
+\def\MPx #1{\ctxlua{jobpositions.MPx("#1")}}
+\def\MPy #1{\ctxlua{jobpositions.MPy("#1")}}
+\def\MPw #1{\ctxlua{jobpositions.MPw("#1")}}
+\def\MPh #1{\ctxlua{jobpositions.MPh("#1")}}
+\def\MPd #1{\ctxlua{jobpositions.MPd("#1")}}
+\def\MPxy #1{\ctxlua{jobpositions.MPxy("#1")}}
+\def\MPll #1{\ctxlua{jobpositions.MPll("#1")}}
+\def\MPlr #1{\ctxlua{jobpositions.MPlr("#1")}}
+\def\MPur #1{\ctxlua{jobpositions.MPur("#1")}}
+\def\MPul #1{\ctxlua{jobpositions.MPul("#1")}}
+\def\MPpos #1{\ctxlua{jobpositions.MPpos("#1")}}
+\def\MPplus#1#2#3{\ctxlua{jobpositions.MPplus("#1",#2,"#3")}}
+\def\MPrest #1#2{\ctxlua{jobpositions.MPrest("#1","#2")}}
\protect \endinput
diff --git a/tex/context/base/core-pos.tex b/tex/context/base/core-pos.tex
index bc311dbda..06bf55cae 100644
--- a/tex/context/base/core-pos.tex
+++ b/tex/context/base/core-pos.tex
@@ -350,52 +350,18 @@
\let\cleanuppositionaction\gobbleoneargument
-%D The next one will be overloaded later.
-%D
-%D \starttyping
-%D \def\dopositionaction#1% test saves hash entry in etex
-%D {\ifundefined{\POSactionprefix#1::}\else
-%D \ifnum\MPp{#1}>\zerocount % new
-%D \setbox\scratchbox\hbox \bgroup
-%D \traceposstring\clap\red{<#1>}%
-%D \the\everyinsertpositionaction
-%D \the\everypositionaction
-%D \ifcollectMPpositiongraphics
-%D % can save a lot of run time
-%D \pushMPdrawing
-%D \MPshiftdrawingtrue
-%D \resetMPdrawing
-%D \getvalue{\POSactionprefix#1::}%
-%D \ifMPdrawingdone
-%D \getMPdrawing
-%D \fi
-%D \resetMPdrawing
-%D \popMPdrawing
-%D \else
-%D \getvalue{\POSactionprefix#1::}%
-%D \fi
-%D \cleanuppositionaction{#1}%
-%D \egroup
-%D \smashedbox\scratchbox
-%D \else
-%D % shouldn't happen too often
-%D \traceposstring\clap\cyan{<#1>}%
-%D \fi
-%D \fi}
-%D \stoptyping
-
\def\doifpositionaction#1%
- {\ifundefined{\POSactionprefix#1::}%
- \@EA\gobbleoneargument
- \else
+ {\ifcsname\POSactionprefix#1::\endcsname
\@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
\fi}
\def\doifpositionactionelse#1%
- {\ifundefined{\POSactionprefix#1::}%
- \@EA\secondoftwoarguments
- \else
+ {\ifcsname\POSactionprefix#1::\endcsname
\@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
\fi}
%D We can copy a position with:
@@ -522,27 +488,38 @@
\chardef\parposstrut=1 % 0 => no strut data, so fall backs used
+\newif\iftracepositions
+
+% \def\doregisterparoptions
+% {\global\advance\parposcounter\plusone
+% \begingroup
+% \leftskip 1\leftskip
+% \rightskip1\rightskip
+% \setpositiondataplus
+% {p:\number\parposcounter}% identifier
+% {\the\zeropoint}%
+% {\the\strutht}%
+% {\the\strutdp}%
+% {\the\hsize ,% 1
+% \the\leftskip ,% 2
+% \the\rightskip ,% 3
+% \the\hangindent,% 4
+% \the\hangafter ,% 5 (num)
+% \the\parindent }% 6
+% %\normalhbox{\registerparsymbol}%
+% \registerparsymbol
+% \endgroup}
+
\def\doregisterparoptions
{\global\advance\parposcounter\plusone
- \begingroup
- \leftskip 1\leftskip
- \rightskip1\rightskip
- \setpositiondataplus
- {p:\number\parposcounter}% identifier
- {\the\zeropoint}%
- {\the\strutht}%
- {\the\strutdp}%
- {\the\hsize ,% 1
- \the\leftskip ,% 2
- \the\rightskip ,% 3
- \the\hangindent,% 4
- \the\hangafter ,% 5 (num)
- \the\parindent }% 6
- %\normalhbox{\registerparsymbol}%
- \registerparsymbol
- \endgroup}
-
-\newif\iftracepositions
+ \setpositiondataplus
+ {p:\number\parposcounter}% identifier
+ {\the\zeropoint}%
+ {\the\strutht}%
+ {\the\strutdp}%
+ {\the\hsize,\the\dimexpr\leftskip\relax,\the\dimexpr\rightskip\relax,\the\hangindent,\the\hangafter,\the\parindent}%
+ %\normalhbox{\registerparsymbol}%
+ \iftracepositions\registerparsymbol\fi}
\def\traceposstring#1#2#3%
{\iftracepositions\smashedhbox{#1{\infofont#2#3}}\fi}
diff --git a/tex/context/base/core-ref.lua b/tex/context/base/core-ref.lua
new file mode 100644
index 000000000..6aaef5cc9
--- /dev/null
+++ b/tex/context/base/core-ref.lua
@@ -0,0 +1,106 @@
+if not modules then modules = { } end modules ['core-ref'] = {
+ version = 1.001,
+ comment = "companion to core-ref.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, texsprint = string.format, tex.sprint
+
+-- beware, this is a first step in the rewrite (just getting rid of
+-- the tuo file); later all access and parsing will also move to lua
+
+jobreferences = jobreferences or { }
+jobreferences.tobesaved = jobreferences.tobesaved or { }
+jobreferences.collected = jobreferences.collected or { }
+
+local tobesaved, collected = jobreferences.tobesaved, jobreferences.collected
+
+local function initializer()
+ tobesaved, collected = jobreferences.tobesaved, jobreferences.collected
+ -- hack, just the old way
+ texsprint(tex.ctxcatcodes,"\\bgroup\\the\\everyreference")
+ for prefix, list in pairs(collected) do
+ for tag, data in pairs(list) do
+ texsprint(tex.ctxcatcodes,format("\\dosetjobreference{%s}{%s}{%s}{%s}{%s}",prefix,tag,data[1],data[2],data[3]))
+ end
+ end
+ texsprint(tex.ctxcatcodes,"\\egroup")
+end
+
+if job then
+ job.register('jobreferences.collected', jobreferences.tobesaved, initializer)
+end
+
+function jobreferences.set(prefix,tag,page,realpage,text)
+ for ref in tag:gmatch("[^,]+") do
+ local p, r = ref:match("^(%-):(.-)$")
+ if p and r then
+ prefix, ref = "", r
+ end
+ if ref ~= "" then
+ local pd = tobesaved[prefix]
+ if not pd then
+ pd = { }
+ tobesaved[prefix] = pd
+ end
+ pd[ref] = { page, realpage, text }
+ end
+ end
+end
+
+function jobreferences.with(tag)
+ for ref in tag:gmatch("[^,]+") do
+ texsprint(tex.ctxcatcodes,format("\\dowithjobreference{%s}",ref:gsub("^(%-):","")))
+ end
+end
+
+-- this reference parser is just an lpeg version of the tex based one
+
+local result = { }
+
+local lparent, rparent, lbrace, rbrace, dcolon = 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 outer_reference = (outer * dcolon)^0
+
+operation = outer_reference * operation -- special case: page(file::1) and file::page(1)
+
+local optional_arguments = (lbrace * arguments * rbrace)^0
+local inner_reference = inner * optional_arguments
+local special_reference = special * lparent * (operation * optional_arguments + operation^0) * rparent
+
+
+local scanner = (reset * outer_reference * (special_reference + inner_reference)^-1 * -1) / function() return result end
+
+function jobreferences.analyse(str)
+ return scanner:match(str)
+end
+
+local template = "\\setreferencevariables{%s}{%s}{%s}{%s}{%s}"
+
+function jobreferences.split(str)
+ local t = scanner:match(str)
+ texsprint(tex.ctxcatcodes,format(template,t.special or "",t.operation or "",t.arguments or "",t.outer or "",t.inner or ""))
+end
+
+--~ print(table.serialize(jobreferences.analyse("")))
+--~ print(table.serialize(jobreferences.analyse("inner")))
+--~ print(table.serialize(jobreferences.analyse("special(operation{argument,argument})")))
+--~ print(table.serialize(jobreferences.analyse("special(operation)")))
+--~ print(table.serialize(jobreferences.analyse("special()")))
+--~ print(table.serialize(jobreferences.analyse("inner{argument}")))
+--~ print(table.serialize(jobreferences.analyse("outer::")))
+--~ print(table.serialize(jobreferences.analyse("outer::inner")))
+--~ print(table.serialize(jobreferences.analyse("outer::special(operation{argument,argument})")))
+--~ print(table.serialize(jobreferences.analyse("outer::special(operation)")))
+--~ print(table.serialize(jobreferences.analyse("outer::special()")))
+--~ print(table.serialize(jobreferences.analyse("outer::inner{argument}")))
+--~ print(table.serialize(jobreferences.analyse("special(outer::operation)")))
diff --git a/tex/context/base/core-ref.mkii b/tex/context/base/core-ref.mkii
new file mode 100644
index 000000000..a5937726a
--- /dev/null
+++ b/tex/context/base/core-ref.mkii
@@ -0,0 +1,90 @@
+%D \module
+%D [ file=core-ref,
+%D version=2008.10.14,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Cross Referencing,
+%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
+
+\def\rawreference#1#2#3%
+ {\bgroup
+ \the\everyreference
+ \makesectionformat
+ \writereference{#2}
+ {\sectionformat\sectionseparator\sectionseparator\noexpand\pagenumber}%
+ {\noexpand\realfolio}%
+ {#3}%
+ \egroup}
+
+\def\rawpagereference#1#2%
+ {\bgroup
+ \the\everyreference
+ \makesectionformat
+ \writereference{#2}
+ {\sectionformat\sectionseparator\sectionseparator\noexpand\pagenumber}%
+ {\noexpand\realfolio}%
+ {}%
+ \egroup}
+
+\def\rawtextreference#1#2#3%
+ {\bgroup
+ \the\everyreference
+ \writereference{#2}
+ {}%
+ {\noexpand\realfolio}%
+ {#3}%
+ \egroup}
+
+%D The last reference is saved in a macro named \type
+%D {\lastreference} (indeed). To keep track of the order of
+%D references, later we will see for what purpose, we maintain
+%D a counter.
+
+\newcount\crossreferencenumber \crossreferencenumber\plusone
+
+\let\lastreference\empty
+
+\def\writereference#1#2#3#4%
+ {\ifreferencing
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\empty \else
+ \def\dowritereference##1%
+ {\xdef\lastreference{##1}%
+ \@EA\dodowritereference\lastreference\empty\empty\end{#2}{#3}{#4}}%
+ \rawprocesscommalist[\!!stringa]\dowritereference
+ \fi
+ \fi}
+
+%D Beware: \type {#2} gobbles space in references so that
+%D \typ {a nice ref} becomes \typ {anice ref}.
+
+\def\dodowritereference#1#2#3\end#4#5#6%
+ {\bgroup
+ \global\advance\crossreferencenumber \plusone\relax
+ \if#1-\if#2:%
+ \let\referenceprefix\empty
+ \xdef\lastreference{#3}%
+ \else
+ % \xdef\lastreference{#1#2#3}% here we loose the space
+ \fi\else
+ % \xdef\lastreference{#1#2#3}% here we loose the space
+ \fi
+ \ifx\lastreference\empty \else
+ \doiffirstreferenceoccurance\lastreference
+ {\thisisdestination{\referenceprefix\lastreference}}%
+ \referenceinfo>\lastreference
+ \expanded{\writeutilitycommand{\noexpand\mainreference{\referenceprefix}{\lastreference}{#4}{#5}{#6}}}%
+ \fi
+ \egroup}
+
+%D We will implement \type {\doiffirstreferenceoccurance}
+%D later on.
+
+\protect
diff --git a/tex/context/base/core-ref.mkiv b/tex/context/base/core-ref.mkiv
new file mode 100644
index 000000000..56ef77b37
--- /dev/null
+++ b/tex/context/base/core-ref.mkiv
@@ -0,0 +1,107 @@
+%D \module
+%D [ file=core-ref,
+%D version=2008.10.14,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Cross Referencing,
+%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.
+
+\let\mainreference\gobblefivearguments % catch mkii tuo stuff
+
+\registerctxluafile{core-ref}{1.001}
+
+\unprotect
+
+% later we will use the lua tables directly (first a hack)
+%
+% \the\everyreference % we're grouped anyway
+
+\newcount\crossreferencenumber \crossreferencenumber\plusone
+
+\def\dowithjobreference#1%
+ {\global\advance\crossreferencenumber\plusone
+ \doiffirstreferenceoccurance{#1}{\thisisdestination{\referenceprefix#1}}%
+ \referenceinfo>{#1}}
+
+% \def\dowithjobreference#1{}
+
+\def\dosetjobreference#1#2#3#4#5%
+ {\ifcsname\r!cross\fileprefix#1#2\endcsname
+ \ifcase0#4\else
+ \showmessage\m!references2{[#1][#2],#4 (\currentutilityfilename)}%
+ \fi
+ \else
+ \ifcase\autocrossfilereferences
+ \setglobalcrossreference{#1#2}{#3}{#4}{#5}%
+ \or
+ \setglobalcrossreference{#1#2}{#3}{#4}{#5}%
+ \ifcsname\r!cross#1#2\endcsname
+ \showmessage\m!references2{[#1][#2],#4 (auto \currentutilityfilename)}%
+ \else
+ \expanded{\definereference[#1#2][\fileprefix#1#2]}%
+ \fi
+ \or
+ \ifcsname\r!cross#1#2\endcsname
+ \showmessage\m!references2{[#1][#2],#4 (auto \currentutilityfilename)}%
+ \else
+ \expanded{\definereference[#1#2][\noexpand\v!page(\fileprefix#4)]}%
+ \fi
+ \fi
+ \fi}
+
+\def\rawreference#1#2#3%
+ {\ifreferencing
+ \doifsomething{#2}
+ {\bgroup
+ \the\everyreference
+ \makesectionformat
+ \expanded{\ctxlua{jobreferences.with("#2")}}%
+ \expanded{\ctxlatelua{jobreferences.set(
+ "\referenceprefix",
+ "#2",
+ "\sectionformat\sectionseparator\sectionseparator\noexpand\pagenumber",
+ "\noexpand\the\realpageno",
+ \!!bs#3\!!es
+ )}}%
+ \egroup}%
+ \fi}
+
+\def\rawpagereference#1#2%
+ {\ifreferencing
+ \doifsomething{#2}
+ {\bgroup
+ \the\everyreference
+ \makesectionformat
+ \expanded{\ctxlua{jobreferences.with("#2")}}%
+ \expanded{\ctxlatelua{jobreferences.set(
+ "\referenceprefix",
+ "#2",
+ "\sectionformat\sectionseparator\sectionseparator\noexpand\pagenumber",
+ "\noexpand\the\realpageno",
+ ""
+ )}}%
+ \egroup}%
+ \fi}
+
+\def\rawtextreference#1#2#3%
+ {\ifreferencing
+ \doifsomething{#2}
+ {\bgroup
+ \the\everyreference
+ \expanded{\ctxlua{jobreferences.with("#2")}}%
+ \expanded{\ctxlatelua{jobreferences.set(
+ "\referenceprefix",
+ "#2",
+ "",
+ "\noexpand\the\realpageno",
+ \!!bs#3\!!es
+ )}}%
+ \egroup}%
+ \fi}
+
+\protect
diff --git a/tex/context/base/core-ref.tex b/tex/context/base/core-ref.tex
index 1132fcc34..b67928e45 100644
--- a/tex/context/base/core-ref.tex
+++ b/tex/context/base/core-ref.tex
@@ -193,36 +193,11 @@
%D full reference, but it's the concept that counts. The low
%D level implementation is:
-\def\rawreference#1#2#3%
- {\bgroup
- \the\everyreference
- \makesectionformat
- \writereference{#2}
- {\sectionformat\sectionseparator\sectionseparator\noexpand\pagenumber}%
- {\noexpand\realfolio}%
- {#3}%
- \egroup}
-
-\def\rawpagereference#1#2%
- {\bgroup
- \the\everyreference
- \makesectionformat
- \writereference{#2}
- {\sectionformat\sectionseparator\sectionseparator\noexpand\pagenumber}%
- {\noexpand\realfolio}%
- {}%
- \egroup}
+\let\rawreference \gobblethreearguments
+\let\rawpagereference\gobbletwoarguments
+\let\rawtextreference\gobbletwoarguments
-\def\rawtextreference#1#2#3%
- {\bgroup
- \the\everyreference
- \writereference{#2}
- {}%
- {\noexpand\realfolio}%
- {#3}%
- \egroup}
-
-%D As we can see, these macros depend on three other ones,
+%D These macros depend on three other ones,
%D \type {\makesectionformat}, that generated \type
%D {\sectionformat}, \type {\pagenumber}. The not yet used
%D argument \type{#1} is a tag that specifies the type of
@@ -256,7 +231,7 @@
%D
%D Therefore, during a pass, \CONTEXT\ writes the references to
%D a the utility file. The next macro does the job and
-%D generates entries like:
+%D generates entries like: (for mkii)
%D
%D \starttyping
%D \mainreference{prefix}{reference}{page}{realpage}{text}
@@ -277,49 +252,6 @@
\let\referenceprefix=\empty
\let\lastreference =\empty
-%D The last reference is saved in a macro named \type
-%D {\lastreference} (indeed). To keep track of the order of
-%D references, later we will see for what purpose, we maintain
-%D a counter.
-
-\newcount\crossreferencenumber \crossreferencenumber=1
-
-\def\writereference#1#2#3#4%
- {\ifreferencing
- \edef\!!stringa{#1}%
- \ifx\!!stringa\empty \else
- \def\dowritereference##1%
- {\xdef\lastreference{##1}%
- \@EA\dodowritereference\lastreference\empty\empty\end{#2}{#3}{#4}}%
- \rawprocesscommalist[\!!stringa]\dowritereference
- \fi
- \fi}
-
-%D Beware: \type {#2} gobbles space in references so that
-%D \typ {a nice ref} becomes \typ {anice ref}.
-
-\def\dodowritereference#1#2#3\end#4#5#6%
- {\bgroup
- \global\advance\crossreferencenumber \plusone\relax
- \if#1-\if#2:%
- \let\referenceprefix\empty
- \xdef\lastreference{#3}%
- \else
- % \xdef\lastreference{#1#2#3}% here we loose the space
- \fi\else
- % \xdef\lastreference{#1#2#3}% here we loose the space
- \fi
- \ifx\lastreference\empty \else
- \doiffirstreferenceoccurance\lastreference
- {\thisisdestination{\referenceprefix\lastreference}}%
- \referenceinfo>\lastreference
- \expanded{\writeutilitycommand{\noexpand\mainreference{\referenceprefix}{\lastreference}{#4}{#5}{#6}}}%
- \fi
- \egroup}
-
-%D We will implement \type {\doiffirstreferenceoccurance}
-%D later on.
-
%D When (during a second pass over the document) references are
%D loaded, they are saved in a macro, one for each reference.
%D In practice this comes to giving \type {\mainreference} a
@@ -746,6 +678,14 @@
\let\currentouterreference =\empty
\let\currentinnerreference =\empty
+\def\setreferencevariables#1#2#3#4#5#6%
+ {\def\currentfullreference {#1}%
+ \def\currentreferencespecial {#2}%
+ \def\currentreferenceoperation{#3}%
+ \def\currentreferencearguments{#4}%
+ \def\currentouterreference {#5}%
+ \def\currentinnerreference {#6}}
+
\def\splitofffullreference#1%
{\edef\currentfullreference{#1}%
\@EA\dosplitofffullreference\currentfullreference\empty(\relax)\empty\end}
@@ -912,30 +852,6 @@
\def\resetreference[#1]%
{\global\letbeundefined{\specialREFidentifier#1}}
-\beginTEX
-
-\newcount\nofexpandedreferences
-
-\def\dodoexpandreferences#1REF(#2#3)#4\relax
- {\ifx#2\relax
- \@EA\ifx\csname\specialREFidentifier#1\endcsname\relax
- \global\advance\nofexpandedreferences \plusone
- \@EA\xdef\csname REF::\number\nofexpandedreferences\endcsname{#1}%
- \else
- \edef\expandedreference{\csname\specialREFidentifier#1\endcsname,}%
- \fi
- \else
- \@EA\ifx\csname\specialREFidentifier#2#3\endcsname\relax
- % not set
- \else
- \edef\expandedreference{\csname\specialREFidentifier#2#3\endcsname,}%
- \fi
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\newcount\nofexpandedreferences
\def\dodoexpandreferences#1REF(#2#3)#4\relax
@@ -954,8 +870,6 @@
\fi
\fi}
-\endETEX
-
\def\doexpandreferences#1,%
{\if]#1\else
\let\expandedreference\empty
@@ -1673,26 +1587,12 @@
\def\setexecutecommandcheck#1#2% #2 permits \first \second
{\setvalue{\s!do:\s!do:#1}{#2}}
-\beginETEX
-
\def\checkexecutecommand#1#2% evt geen #1 en #2
{\ifx#2\empty \else \ifcsname\s!do:\s!do:#1\endcsname
\@EA\let\@EA\docheckexecutecommand\csname\s!do:\s!do:#1\endcsname
\rawprocesscommalist[#2]\docheckexecutecommand
\fi \fi }
-\endETEX
-
-\beginTEX
-
-\def\checkexecutecommand#1#2% evt geen #1 en #2
- {\ifx#2\empty \else \@EA\ifx\csname\s!do:\s!do:#1\endcsname\relax \else
- \@EA\let\@EA\docheckexecutecommand\csname\s!do:\s!do:#1\endcsname
- \rawprocesscommalist[#2]\docheckexecutecommand
- \fi \fi }
-
-\endTEX
-
%D Command references (in dutch, english, german of
%D whatever interface language) are translated into a bit
%D shorter reference (\type{close}) and passed to the
@@ -3081,6 +2981,10 @@
\fi
\egroup}
+%D Plugin code:
+
+\loadmarkfile{core-ref}
+
%D In the next settings we see some variables that were not
%D used here and that concern the way the pagenumbers refered
%D to are typeset.
diff --git a/tex/context/base/core-reg.lua b/tex/context/base/core-reg.lua
index f490f2cca..820d316a6 100644
--- a/tex/context/base/core-reg.lua
+++ b/tex/context/base/core-reg.lua
@@ -1,185 +1,186 @@
--- filename : core-reg.lua
--- comment : companion to core-reg.tex
--- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
--- copyright: PRAGMA ADE / ConTeXt Development Team
--- license : see context related readme files
-
-if not versions then versions = { } end versions['core-reg'] = 1.001
-if not jobs then jobs = { } end
-if not job then jobs['main'] = { } end job = jobs['main']
-if not job.registers then job.registers = { } end
-
-function job.defineregister(id)
- if not job.registers[id] then
- job.registers[id] = { }
- end
-end
-
--- {'e','3','','test+test+test','2--0-0-0-0-0-0-0--1','1'}
+if not modules then modules = { } end modules ['core-reg'] = {
+ version = 1.001,
+ comment = "companion to core-reg.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
--- load index (we could rease the original entry afterwards, freeing memory)
+sorters = sorters or { }
+sorters.register = sorters.register or { }
--- index sorting
-
-sorters = sorters or { }
-sorters.index = sorters.index or { }
-sorters.index.data = sorters.index.data or { }
-
-do
+-- {'e','3','','test+test+test','2--0-0-0-0-0-0-0--1','1'}
- function sorters.index.compare(a,b)
- local result = 0
- for i=1,4 do
- if result == 0 then
- result = sorters.comparers.basic(a,b,i)
- else
- return result
- end
+function sorters.register.compare(a,b)
+ local result = 0
+ for i=1,4 do
+ if result == 0 then
+ result = sorters.comparers.basic(a,b,i)
+ else
+ return result
end
- if a[1] ~= 's' then -- e/f/t
- local page_a, page_b = a[3], b[3]
- if page_a < page_b then
- return -1
- elseif page_a > page_b then
- return 1
- end
+ end
+ if a[1] ~= 's' then -- e/f/t
+ local page_a, page_b = a[3], b[3]
+ if page_a < page_b then
+ return -1
+ elseif page_a > page_b then
+ return 1
end
- return 0
end
+ return 0
+end
- function sorters.index.prepare(data)
- sorters.prepare(data,sorters.splitters.utf,4)
- end
+function sorters.register.prepare(data)
+ sorters.prepare(data,sorters.splitters.utf,4)
+end
- function sorters.index.sort(data)
- sorters.sort(data,sorters.index.compare)
- end
+function sorters.register.sort(data)
+ sorters.sort(data,sorters.register.compare)
+end
- function sorters.index.unique(data)
- sorters.unique(data)
- end
+function sorters.register.unique(data)
+ sorters.unique(data)
+end
- function sorters.index.cleanup(data)
- sorters.cleanup(data)
- end
+function sorters.register.cleanup(data)
+ sorters.cleanup(data)
+end
- function sorters.index.finalize(data)
- local split = { }
- for k,v in ipairs(data) do
- local entry, tag = v[2][1][3][1], ""
- local se = sorters.entries[sorters.language]
- if se and se[entry] then
- if type(se[entry]) == "number" then
- entry = se[entry]
- end
- tag = se[entry]
- else
- entry = 0
- tag = "unknown"
+function sorters.register.finalize(data)
+ local split = { }
+ for k,v in ipairs(data) do
+ local entry, tag = v[2][1][3][1], ""
+ local se = sorters.entries[sorters.language]
+ if se and se[entry] then
+ if type(se[entry]) == "number" then
+ entry = se[entry]
end
- split[entry] = split[entry] or { tag = tag, data = { } }
- split[entry].data[#split[entry].data+1] = v
+ tag = se[entry]
+ else
+ entry = 0
+ tag = "unknown"
end
- return split
+ split[entry] = split[entry] or { tag = tag, data = { } }
+ split[entry].data[#split[entry].data+1] = v
end
+ return split
+end
- -- \registerpage{index}{,}{6}{2--0-0-0-0-0-0-0--1}{1}
-
- -- for the moment we use the old structure, some day mkiv code
- -- will be different: more structure, less mess
-
- local template = {
- page = "\\registerpage{%s}{%s}{%s}{%s}{%s}",
- see = "\\registersee{%s}{%s}{%s}{%s}",
- letter = "\\registerentry{%s}{%s}",
- entry = {
- "\\registerentrya{%s}{%s}",
- "\\registerentryb{%s}{%s}",
- "\\registerentryc{%s}{%s}",
- "\\registerentryd{%s}{%s}",
- },
- }
-
- function sorters.index.flush(sorted,class,flush)
- flush = flush or print
- class = class or 'index'
- for k,v in ipairs(table.sortedkeys(sorted)) do
- local s = sorted[v]
- flush(template.letter:format(class,s.tag))
- local done = { false, false, false }
- for kk,vv in ipairs(s.data) do
- if vv[2][1] then
- local e = { false, false, false, false }
- for i=1,4,1 do
- if vv[2][i] then
- e[i] = vv[2][i][1]
- end
- if e[i] ~= done[i] then
- if e[i] and e[i] ~= "" then
- done[i] = e[i]
- flush(template.entry[i]:format(class,e[i]))
- else
- done[i] = false
- end
- end
+-- \registerpage{index}{,}{6}{2--0-0-0-0-0-0-0--1}{1}
+
+-- for the moment we use the old structure, some day mkiv code
+-- will be different: more structure, less mess
+
+local template = {
+ page = "\\registerpage{%s}{%s}{%s}{%s}{%s}",
+ see = "\\registersee{%s}{%s}{%s}{%s}",
+ letter = "\\registerentry{%s}{%s}",
+ entry = {
+ "\\registerentrya{%s}{%s}",
+ "\\registerentryb{%s}{%s}",
+ "\\registerentryc{%s}{%s}",
+ "\\registerentryd{%s}{%s}",
+ },
+}
+
+function sorters.register.flush(sorted,class)
+ class = class or 'index'
+ for k,v in ipairs(table.sortedkeys(sorted)) do
+ local s = sorted[v]
+ tex.sprint(tex.ctxcatcodes,template.letter:format(class,s.tag))
+ local done = { false, false, false }
+ for kk,vv in ipairs(s.data) do
+ if vv[2][1] then
+ local e = { false, false, false, false }
+ for i=1,4,1 do
+ if vv[2][i] then
+ e[i] = vv[2][i][1]
end
- if vv[1] == 'e' then
- -- format reference pagespec realpage
- flush(template.page:format(class,",",vv[4],vv[5],vv[3]))
- elseif vv[1] == 's' then
- flush(template.see:format(class,",",vv[5],vv[3]))
+ if e[i] ~= done[i] then
+ if e[i] and e[i] ~= "" then
+ done[i] = e[i]
+ tex.sprint(tex.ctxcatcodes,template.entry[i]:format(class,e[i]))
+ else
+ done[i] = false
+ end
end
end
+ if vv[1] == 'e' then
+ -- format reference pagespec realpage
+ tex.sprint(tex.ctxcatcodes,template.page:format(class,",",vv[4],vv[5],vv[3]))
+ elseif vv[1] == 's' then
+ tex.sprint(tex.ctxcatcodes,template.see:format(class,",",vv[5],vv[3]))
+ end
end
end
end
+end
+
+function sorters.register.process(data)
+ return sorters.process('register',data)
+end
- function sorters.index.process(data)
- return sorters.process('index',data)
+-- { { entry, key }, { entry, key }, { entry, key }, { entry, key } }, kind, realpage|see, reference, pagespec
+
+jobregisters = jobregisters or { }
+jobregisters.collected = jobregisters.collected or { }
+jobregisters.tobesaved = jobregisters.tobesaved or { }
+
+job.register('jobregisters.collected', jobregisters.tobesaved)
+
+local function allocate(class)
+ local d = jobregisters.tobesaved[class]
+ if not d then
+ d = {
+ language = 'en',
+ entries = { },
+ sorted = false,
+ class = class
+ }
+ jobregisters.tobesaved[class] = d
end
+ return d
+end
+local function collect(class)
+ return jobregisters.collected[class]
end
--- { { entry, key }, { entry, key }, { entry, key }, { entry, key } }, kind, realpage|see, reference, pagespec
+jobregisters.define = allocate
-function job.loadregister(class)
- if job.registers[class] then
- if not sorters.index.data[class] then
- sorters.index.data[class] = {
- language = 'en',
- entries = { },
- flush = function(s) tex.sprint(tex.ctxcatcodes,s) end,
- sorted = false,
- class = class
- }
- local entries = sorters.index.data[class].entries
- for k,v in ipairs(job.registers[class]) do
- if v[1] == 'l' then -- language
- sorters.index.data[class].language = v[2]
- else
- local key, entry = v[3], v[4]
- if type(entry) == 'string' then
- entry = entry:splitchr('+')
- end
- if type(key) == 'string' then
- key = key:splitchr('+')
- end
- entries[#entries+1] = {
- v[1], -- kind (e, f, t, s)
- {
- { entry[1] or "", key[1] or "" },
- { entry[2] or "", key[2] or "" },
- { entry[3] or "", key[3] or "" },
- { entry[4] or "", key[4] or "" }
- },
- v[6], -- realpage or seeword (check see)
- v[2], -- reference
- v[5], -- pagespec
- }
- end
- end
- end
- -- maybe we should also save the register result stream
- sorters.index.process(sorters.index.data[class])
+function jobregisters.save_entry(class,kind,reference,key,entry,page,realpage) -- realpage|see
+ local data = allocate(class).entries
+ if type(entry) == 'string' then
+ entry = entry:splitchr('+')
+ end
+ if type(key) == 'string' then
+ key = key:splitchr('+')
+ end
+ data[#data+1] = {
+ kind, -- kind (e, f, t, s)
+ {
+ { entry[1] or "", key[1] or "" },
+ { entry[2] or "", key[2] or "" },
+ { entry[3] or "", key[3] or "" },
+ { entry[4] or "", key[4] or "" }
+ },
+ realpage, -- realpage or seeword (check see)
+ reference, -- reference
+ page, -- pagespec
+ }
+end
+
+jobregisters.save_see = jobregisters.save_entry
+
+function jobregisters.save_variable(class,key,value)
+ if key == "l" then key = "language" end
+ allocate(class)[key] = value
+end
+
+function jobregisters.process(class)
+ local data = collect(class)
+ if data then
+ return sorters.register.process(data)
end
end
diff --git a/tex/context/base/core-reg.mkiv b/tex/context/base/core-reg.mkiv
index d6407612f..6b7ee4e30 100644
--- a/tex/context/base/core-reg.mkiv
+++ b/tex/context/base/core-reg.mkiv
@@ -15,34 +15,17 @@
\registerctxluafile{core-reg}{1.001}
-\appendtoks
- \immediatewriteutilitytua{if not job.registers then job.registers = { } end}%
- \immediatewriteutilitytua{local jr = job.registers}%
-\to \everyopenutilities
-
-\let\allregisters\empty
-
-\appendtoks
- \processcommacommand[\allregisters]\mkdodefineregister
- \globallet\allregisters\empty
-\to \everyopenutilities
-
-\def\mkdodefineregister#1% class
- {\ctxlua{job.defineregister('#1')}%
- \immediatewriteutilitytua{job.defineregister('#1')}}
-
\def\mkdefineregister#1% class
- {\mkdodefineregister{#1}%
- \doglobal\addtocommalist{#1}\allregisters}
+ {\ctxlua{jobregisters.define('#1')}}
\def\mksaveregisterentry#1#2#3#4#5#6#7% class type reference key entry pagespec realpage
- {\expanded{\writeutilitytua{ti(jr['#1'],{'#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7'})}}}
+ {\expanded{\ctxlatelua{jobregisters.save_entry('#1','#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7')}}}
\def\mksaveregistersee#1#2#3#4#5#6#7% class type reference key entry see pagespec
- {\expanded{\writeutilitytua{ti(jr['#1'],{'#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7'})}}}
+ {\expanded{\ctxlatelua{jobregisters.save_see('#1','#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7')}}}
\def\mksaveregistervariable#1#2#3% class type value
- {\expanded{\immediatewriteutilitytua{ti(jr['#1'],{'#2','#3'})}}}
+ {\expanded{\ctxlua{jobregisters.save_variable('#1','#2','#3')}}}
% Beware, we have no filename support here. For that we need to save the resulting
% tex code in a file. No big deal.
@@ -50,7 +33,7 @@
\def\mkloadregister#1#2#3% class, todo: loader macro just like mkii
{\bgroup
\getvalue{\s!set#1}% smells like a hack
- #2\ctxlua{job.loadregister('#1')}#3% par needed for hanging indentation
+ #2\ctxlua{jobregisters.process('#1')}#3% par needed for hanging indentation
\getvalue{\s!reset#1}%
\egroup}
diff --git a/tex/context/base/core-rul.lua b/tex/context/base/core-rul.lua
index 93bda0277..1c93542db 100644
--- a/tex/context/base/core-rul.lua
+++ b/tex/context/base/core-rul.lua
@@ -24,7 +24,6 @@ function commands.doreshapeframedbox(n)
if lastlinelength > width then
width = lastlinelength
end
- p.list = nil
free(p)
end
if done then
diff --git a/tex/context/base/core-rul.mkii b/tex/context/base/core-rul.mkii
index c480bffbc..4381a8d5a 100644
--- a/tex/context/base/core-rul.mkii
+++ b/tex/context/base/core-rul.mkii
@@ -25,49 +25,51 @@
\let\framedboxdepth \!!zeropoint
\def\doreshapeframedbox % frozen, that is ... \shapeboxstrut added
- {\beginofshapebox
- \unvcopy\framebox
- \endofshapebox
- \global\@@globalwidth\zeropoint
- \edef\framedboxwidth {\the\wd\framebox}%
- \edef\framedboxheight{\the\ht\framebox}%
- \edef\framedboxdepth {\the\dp\framebox}%
- \resetshapeframebox
- \reshapebox
- {\setbox0\hbox
- {\strut\ifhbox\shapebox\shapeboxstrut\unhbox\else\box\fi\shapebox}%
- \global\advance\framednoflines \plusone
- \ifdim\framedlastlength>\zeropoint\else
- \global\framedlastlength\wd0
- \fi
- \ifdim\wd0>\@@globalwidth
- \global\@@globalwidth\wd0
- \fi}%
- \ifreshapingfailed
- % no need for anothr pass or finalizer
- \else
- \dosetraggedcommand\localformat
- \raggedcommand
- \ifboxhasheight
- \setbox\framebox\vbox to \localheight
- {\hsize\@@globalwidth
- \reshapebox{\hbox to \hsize{\ifhbox\shapebox\shapeboxstrut\unhbox\else\box\fi\shapebox}}%
- \dobeforeframedbox
- \innerflushshapebox
- \doafterframedbox}%
- \else
- \setbox\framebox\vbox to \framedboxheight % \ht\framebox
- {\hsize\@@globalwidth
- \reshapebox{\hbox to \hsize{\ifhbox\shapebox\shapeboxstrut\unhbox\else\box\fi\shapebox}}%
- \ifcase\reshapeframeboxmethod
- \or \innerflushshapebox \or \innerflushshapebox
- \fi}%
- \ifcase\reshapeframeboxmethod \or
- \dp\framebox\framedboxdepth % \strutdp otherwise problem with math
+ {\ifvbox\framebox
+ \beginofshapebox
+ \unvcopy\framebox
+ \endofshapebox
+ \global\@@globalwidth\zeropoint
+ \edef\framedboxwidth {\the\wd\framebox}%
+ \edef\framedboxheight{\the\ht\framebox}%
+ \edef\framedboxdepth {\the\dp\framebox}%
+ \resetshapeframebox
+ \reshapebox
+ {\setbox0\hbox
+ {\strut\ifhbox\shapebox\shapeboxstrut\unhbox\else\box\fi\shapebox}%
+ \global\advance\framednoflines \plusone
+ \ifdim\framedlastlength>\zeropoint\else
+ \global\framedlastlength\wd0
\fi
- \fi
- \ifdim\framedlastlength=\zeropoint\global\framedlastlength\wd\framebox\fi
- \ifcase\framednoflines\global\framednoflines\plusone\fi
+ \ifdim\wd0>\@@globalwidth
+ \global\@@globalwidth\wd0
+ \fi}%
+ \ifreshapingfailed
+ % no need for anothr pass or finalizer
+ \else
+ \dosetraggedcommand\localformat
+ \raggedcommand
+ \ifboxhasheight
+ \setbox\framebox\vbox to \localheight
+ {\hsize\@@globalwidth
+ \reshapebox{\hbox to \hsize{\ifhbox\shapebox\shapeboxstrut\unhbox\else\box\fi\shapebox}}%
+ \dobeforeframedbox
+ \innerflushshapebox
+ \doafterframedbox}%
+ \else
+ \setbox\framebox\vbox to \framedboxheight % \ht\framebox
+ {\hsize\@@globalwidth
+ \reshapebox{\hbox to \hsize{\ifhbox\shapebox\shapeboxstrut\unhbox\else\box\fi\shapebox}}%
+ \ifcase\reshapeframeboxmethod
+ \or \innerflushshapebox \or \innerflushshapebox
+ \fi}%
+ \ifcase\reshapeframeboxmethod \or
+ \dp\framebox\framedboxdepth % \strutdp otherwise problem with math
+ \fi
+ \fi
+ \ifdim\framedlastlength=\zeropoint\global\framedlastlength\wd\framebox\fi
+ \ifcase\framednoflines\global\framednoflines\plusone\fi
+ \fi
\fi}
\protect \endinput
diff --git a/tex/context/base/core-rul.mkiv b/tex/context/base/core-rul.mkiv
index 374da9f59..24e05974d 100644
--- a/tex/context/base/core-rul.mkiv
+++ b/tex/context/base/core-rul.mkiv
@@ -30,6 +30,29 @@
% \ctxlua{commands.doreshapeframedbox(\number\luashapebox)}%
% \setbox\framebox\box\luashapebox}
-\def\doreshapeframedbox{\ctxlua{commands.doreshapeframedbox(\number\framebox)}}
+\def\doreshapeframedbox{\ifvbox\framebox\ctxlua{commands.doreshapeframedbox(\number\framebox)}\fi}
+
+% speedup, prelude to dedicated mkiv module
+
+\def\dobackgroundcolorbox
+ {\hbox{\faststartcolor[\framedbackgroundcolor]\dofilledbox\faststopcolor}}
+ %{\hbox{\doactivatecolor\framedbackgroundcolor\dofilledbox}}
+
+\def\docolorbox % can be more of \color[] -> \faststartcolor in mkiv
+ {\ifincolor
+ \edef\framedbackgroundcolor{\framedparameter\c!backgroundcolor}%
+ \ifx\framedbackgroundcolor\empty
+ \dophantombox
+ \else
+ \doifcolorelse\framedbackgroundcolor\dobackgroundcolorbox\dophantombox
+ \fi
+ \else
+ \dophantombox
+ \fi}
+
+\def\docolorframebox
+ {\doifcolor\framedforegroundcolor
+ {\setbox\framebox\hbox{\faststartcolor[\framedforegroundcolor]\box\framebox\faststopcolor}}}
+ %{\setbox\framebox\hbox{\doactivatecolor\framedforegroundcolor\box\framebox}}}
\protect \endinput
diff --git a/tex/context/base/core-rul.tex b/tex/context/base/core-rul.tex
index d292d8742..f9386d560 100644
--- a/tex/context/base/core-rul.tex
+++ b/tex/context/base/core-rul.tex
@@ -170,38 +170,47 @@
{\bgroup
\doifelse{\framedparameter\c!backgroundcorner}\v!rectangular
{\dofilledlinedbox}
- {\scratchdimen\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize
- \ifzeropt\scratchdimen
+ {\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize
\dofilledlinedbox
\else
\dofilledroundbox
\fi}%
\egroup}
-
\def\dophantombox
{\hphantom{\dofilledbox}}
\def\dofilledlinedbox
{\vrule\!!width\frameddimenwd\!!height\frameddimenht\!!depth\frameddimendp\relax}%
-\def\dofilledroundbox
- {\doroundedbox\v!off\v!on{\framedparameter\c!backgroundcorner}}
+\def\dostrokedroundbox
+ {\doif{\framedparameter\c!frame}\v!on\dodostrokedroundbox}
-\def\doroundedbox#1#2#3%
+\def\dodostrokedroundbox
{\bgroup
- \doifelse{#3}\v!round{\let\ovalmod\!!zerocount}{\edef\ovalmod{\number#3}}%
+ \edef\ovalmod{\framedparameter\c!framecorner}%
+ \doifelse\ovalmod\v!round{\let\ovalmod\!!zerocount}{\edef\ovalmod{\number\ovalmod}}%
\edef\ovalwid{\the\frameddimenwd}%
\edef\ovalhei{\the\frameddimenht}%
\edef\ovaldep{\the\frameddimendp}%
- \scratchdimen\ruledlinewidth\edef\ovallin{\the\scratchdimen}%
- \scratchdimen\framedparameter\c!frameradius\edef\ovalrad{\the\scratchdimen}%
- \doifelse{#1}\v!on % will be a macro that handles
- {\let\ovalstr\!!plusone} % start, stop, ja, nee, aan, uit
- {\let\ovalstr\!!zerocount}% % and something \doif
- \doifelse{#2}\v!on
- {\let\ovalfil\!!plusone}
- {\let\ovalfil\!!zerocount}%
+ \edef\ovallin{\the\dimexpr\ruledlinewidth}%
+ \edef\ovalrad{\the\dimexpr\framedparameter\c!frameradius}%
+ \let\ovalstr\!!plusone
+ \let\ovalfil\!!zerocount
+ \doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil\ovalmod
+ \egroup}
+
+\def\dofilledroundbox
+ {\bgroup
+ \edef\ovalmod{\framedparameter\c!backgroundcorner}%
+ \doifelse\ovalmod\v!round{\let\ovalmod\!!zerocount}{\edef\ovalmod{\number\ovalmod}}%
+ \edef\ovalwid{\the\frameddimenwd}%
+ \edef\ovalhei{\the\frameddimenht}%
+ \edef\ovaldep{\the\frameddimendp}%
+ \edef\ovallin{\the\dimexpr\ruledlinewidth\relax}%
+ \edef\ovalrad{\the\dimexpr\framedparameter\c!backgroundradius\relax}%
+ \let\ovalstr\!!zerocount
+ \let\ovalfil\!!plusone
\doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil\ovalmod
\egroup}
@@ -368,13 +377,7 @@
%\edef\overlaycorner{\framedparameter\c!backgroundcorner}%
%\edef\overlayradius{\framedparameter\c!backgroundradius}%
\let\overlayoffset\backgroundoffset % we steal this one
- %\writestatus
- % {overlay}
- % {#1\space w=\overlaywidth/h+d=\overlayheight/d=\overlaydepth]}%
\setbox\scratchbox\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}%
-% \dimen0=\dimexpr\wd\scratchbox-\overlaywidth \relax
-% \dimen2=\dimexpr\ht\scratchbox-\frameddimenht\relax % not overlayheight !
-% \setbox\scratchbox\hbox{\hskip-.5\dimen0\raise-.5\dimen2\box\scratchbox}%
\setbox\scratchbox\hbox
{\hskip-.5\dimexpr\wd\scratchbox-\overlaywidth \relax
\raise-.5\dimexpr\ht\scratchbox-\frameddimenht\relax % not overlayheight !
@@ -423,18 +426,49 @@
\let\currentbackground\empty
-\def\dodobackgroundbox#1% also less passing, we can get rid of the old method
+% \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
- \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
+ \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\dododobackgroundbox#1,#2% #2 gobbles spaces
+ {\edef\currentbackground{#1}%
+ \ifx\currentbackground\s!unknown\else
+ \dodobackgroundbox\expandafter\dododobackgroundbox
+ \fi#2}
+
\let\backgroundoffset\!!zeropoint
\let\backgrounddepth \!!zeropoint
\def\backgroundwidth {\the\hsize}
@@ -442,6 +476,35 @@
% 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%
{\setbox\framebox\vbox
{\forgetall
@@ -455,15 +518,14 @@
\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}%
+ \let\foregroundbox\normalforegroundbox
\hbox to \backgroundwidth % in case 'foreground' is used as overlay
{\ifx\component\empty
- \expanded{\rawprocesscommalist[\framedparameter\c!background]}\dodobackgroundbox
+ \expanded{\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax
\else
\startlayoutcomponent{b:\component}{background \component}%
- \expanded{\rawprocesscommalist[\framedparameter\c!background]}\dodobackgroundbox
+ \expanded{\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax
\stoplayoutcomponent
\fi
\box\framebox\hss}}}
@@ -482,12 +544,14 @@
%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
- {\scratchdimen \framedparameter\c!frameoffset\relax
- \frameddimenwd\dimexpr\wd\framebox+2\scratchdimen\relax
- \frameddimenht\dimexpr\ht\framebox+ \scratchdimen\relax
- \frameddimendp\dimexpr\dp\framebox+ \scratchdimen+\framedparameter\c!framedepth\relax
+ {\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
\ifdim\frameddimendp<\zeropoint
\advance\frameddimenht \frameddimendp
\scratchdimen-\frameddimendp
@@ -499,7 +563,7 @@
{\doifsomething{\framedparameter\c!framecolor}{\color[\framedparameter\c!framecolor]}{\dostrokedbox}}%
\setbox\extraframebox\hbox
{\raise\scratchdimen\vbox
- {\moveleft\framedparameter\c!frameoffset
+ {\moveleft\scratchoffset
\box\extraframebox}}%
\wd\extraframebox\wd\framebox
\ht\extraframebox\ht\framebox
@@ -577,6 +641,8 @@
\def\@@frame@@rrules{\kern-\ruledlinewidth\vrule\!!height\dimexpr\frameddimenht-\ruledlinewidth\relax\!!depth-\ruledlinewidth\!!width\ruledlinewidth}
\def\@@frame@@lrules{\vrule\!!height\dimexpr\frameddimenht-\ruledlinewidth\relax\!!depth-\ruledlinewidth\!!width\ruledlinewidth\kern-\ruledlinewidth}
+% small is relatively new
+
\letvalue{t\@@frame@@\v!small\v!small}\@@frame@@trules
\letvalue{t\@@frame@@\v!off \v!small}\@@frame@@trules
\letvalue{t\@@frame@@\v!small }\@@frame@@trules
@@ -610,14 +676,6 @@
% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=on]
% {}
-%D Before we come to using these macros we yet have to define
-%D the rounded corner alternative, which after all is not that
-%D hard because it uses the previously defined macro \type
-%D {\doroundedbox}.
-
-\def\dostrokedroundbox
- {\doif{\framedparameter\c!frame}\v!on{\doroundedbox\v!on\v!off{\framedparameter\c!framecorner}}}
-
%D The next few macros are probably the most misused ones in
%D \CONTEXT. They deal with putting rules around boxes, provide
%D backgrounds, offer alignment features, and some more. We
@@ -670,28 +728,67 @@
\unexpanded\def\framed
{\bgroup
- \presetlocalframed[\??ol]%
+ \copylocalframed[\??ol][\??oi]% == \presetlocalframed[\??ol]%
\dodoubleempty\startlocalframed[\??ol]}
\def\presetlocalframed[#1]%
{\copylocalframed[#1][\??oi]}
+% \def\copylocalframed[#1]#2[#3]%
+% {\copyparameters[#1][#3]%
+% [\c!width,\c!height,\c!radius,\c!corner,\c!depth,\c!offset,%
+% \c!autowidth,\c!empty,\c!component,\c!orientation,\c!lines,%
+% \c!align,\c!bottom,\c!top,\c!strut,\c!autostrut,\c!location,\c!setups,\c!extras,%
+% \c!foregroundstyle,\c!foregroundcolor,%
+% \c!background,\c!backgroundoffset,\c!backgroundcorner,\c!backgroundradius,\c!backgrounddepth,\c!backgroundcolor,\c!backgroundscreen,%
+% \c!frame,\c!frameoffset,\c!framecorner,\c!frameradius,\c!framedepth,\c!framecolor,\c!rulethickness,%
+% \c!topframe,\c!bottomframe,\c!leftframe,\c!rightframe]}
+
+% since framed is used all over the place, we have a (small) speedup)
+
\def\copylocalframed[#1]#2[#3]%
- {\copyparameters[#1][#3]%
- [\c!width,\c!height,\c!autowidth,\c!offset,\c!empty,\c!rulethickness,%
- \c!radius,\c!corner,\c!depth,\c!frame,\c!framecolor,%
- \c!foregroundstyle,\c!foregroundcolor,\c!lines,\c!orientation,%
- \c!topframe,\c!bottomframe,\c!leftframe,\c!rightframe,%
- \c!rulethickness,\c!frameoffset,\c!background,\c!component,%
- \c!backgroundoffset,\c!backgroundscreen,\c!backgroundcolor,%
- \c!align,\c!bottom,\c!top,\c!strut,\c!autostrut,\c!location,\c!setups,\c!extras]%
- \copyparameters[#1\c!background][#1]%
- [\c!radius,\c!corner,\c!depth]%
- \copyparameters[#1\c!frame][#1]%
- [\c!radius,\c!corner,\c!depth]}
-
-% \def\setupframed
-% {\dodoubleargument\getparameters[\??oi]}
+ {\edef\copiedfrom{#1}\edef\copiedto{#3}%
+ \docopyvalue\copiedfrom\copiedto\c!width
+ \docopyvalue\copiedfrom\copiedto\c!height
+ \docopyvalue\copiedfrom\copiedto\c!autowidth
+ \docopyvalue\copiedfrom\copiedto\c!offset
+ \docopyvalue\copiedfrom\copiedto\c!empty
+ \docopyvalue\copiedfrom\copiedto\c!rulethickness
+ \docopyvalue\copiedfrom\copiedto\c!radius
+ \docopyvalue\copiedfrom\copiedto\c!corner
+ \docopyvalue\copiedfrom\copiedto\c!depth
+ \docopyvalue\copiedfrom\copiedto\c!frame
+ \docopyvalue\copiedfrom\copiedto\c!framecolor
+ \docopyvalue\copiedfrom\copiedto\c!foregroundstyle
+ \docopyvalue\copiedfrom\copiedto\c!foregroundcolor
+ \docopyvalue\copiedfrom\copiedto\c!lines
+ \docopyvalue\copiedfrom\copiedto\c!orientation
+ \docopyvalue\copiedfrom\copiedto\c!topframe
+ \docopyvalue\copiedfrom\copiedto\c!bottomframe
+ \docopyvalue\copiedfrom\copiedto\c!leftframe
+ \docopyvalue\copiedfrom\copiedto\c!rightframe
+ \docopyvalue\copiedfrom\copiedto\c!rulethickness
+ \docopyvalue\copiedfrom\copiedto\c!frameoffset
+ \docopyvalue\copiedfrom\copiedto\c!background
+ \docopyvalue\copiedfrom\copiedto\c!component
+ \docopyvalue\copiedfrom\copiedto\c!backgroundoffset
+ \docopyvalue\copiedfrom\copiedto\c!backgroundscreen
+ \docopyvalue\copiedfrom\copiedto\c!backgroundcolor
+ \docopyvalue\copiedfrom\copiedto\c!align
+ \docopyvalue\copiedfrom\copiedto\c!bottom
+ \docopyvalue\copiedfrom\copiedto\c!top
+ \docopyvalue\copiedfrom\copiedto\c!strut
+ \docopyvalue\copiedfrom\copiedto\c!autostrut
+ \docopyvalue\copiedfrom\copiedto\c!location
+ \docopyvalue\copiedfrom\copiedto\c!component
+ \docopyvalue\copiedfrom\copiedto\c!extras
+ \docopyvalue\copiedfrom\copiedto\c!setups
+ \docopyvalue\copiedfrom\copiedto\c!backgroundradius
+ \docopyvalue\copiedfrom\copiedto\c!backgroundcorner
+ \docopyvalue\copiedfrom\copiedto\c!backgrounddepth
+ \docopyvalue\copiedfrom\copiedto\c!frameradius
+ \docopyvalue\copiedfrom\copiedto\c!framecorner
+ \docopyvalue\copiedfrom\copiedto\c!framedepth}
\def\setupframed
{\dodoubleempty\dosetupframed}
@@ -775,17 +872,21 @@
% \edef\doframedsetups{\noexpand\setups[\doframedsetups]}%
% \fi
\removeframedboxdepth
- \docolorframebox
+ \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
- \doifvaluesomething{\@@framed\c!rulethickness}
- {\ruledlinewidth\framedparameter\c!rulethickness\relax
- \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi}%
+ \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+ \ifx\framedrulethickness\empty\else
+ \ruledlinewidth\framedrulethickness\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+ \fi
\dooutlinebox % real or invisible frame
\fi \fi
- \doifvaluesomething{\@@framed\c!background}\dobackedbox
+ \edef\framedbackground{\framedparameter\c!background}%
+ \ifx\framedbackground\empty\else\dobackedbox\fi
\restoreframedboxdepth
\box\framebox
\egroup}
@@ -865,9 +966,11 @@
\boxhasframetrue
\fi\fi
\ifboxhasframe
- \doifvaluesomething{\@@framed\c!rulethickness}
- {\ruledlinewidth\framedparameter\c!rulethickness\relax
- \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi}%
+ \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+ \ifx\framedrulethickness\empty\else
+ \ruledlinewidth\framedrulethickness\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+ \fi
\else
\ruledlinewidth\zeropoint
\fi
@@ -1125,7 +1228,8 @@
\ht\scratchbox\ht\framebox
\dp\scratchbox\dp\framebox
\setbox\framebox\box\scratchbox}%
- \docolorframebox
+ \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
+ \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
\ifboxhasoffset
\dooffsetframebox
\fi
@@ -1142,7 +1246,8 @@
\ifboxhasframe % real or invisible frame
\dooutlinebox
\fi
- \doifvaluesomething{\@@framed\c!background}\dobackedbox
+ \edef\framedbackground{\framedparameter\c!background}%
+ \ifx\framedbackground\empty\else\dobackedbox\fi
\handleframedlocator\c!after\@@locallocation
\box\framebox
\egroup
@@ -1916,8 +2021,8 @@
%\endgraf\nointerlineskip\localbegstrut
\endgraf\obeydepth\nointerlineskip
\moveleft\dimen4\box0
- \endgraf\nointerlineskip\localbegstrut
- \egroup}
+ \endgraf\nointerlineskip\localbegstrut % beware, we might kill it in a style using \vskip\lineheight
+ \egroup} % so this must not be changed
\def\hboxedhairline % use framed dimen
{\bgroup
@@ -3332,6 +3437,9 @@
%{\doifsomething{#1}{\dobackgroundline{#1}}\hbox}
{\doifcolorelse{#1}{\dobackgroundline{#1}\hbox}\hbox}
+% \def\backgroundline[#1]%
+% {\doifcolor{#1}{\dobackgroundline{#1}}\hbox}
+
\def\dobackgroundline#1%
{\dowithnextbox
{\hbox
@@ -3382,6 +3490,12 @@
\c!backgroundoffset=\!!zeropoint,
\c!framecolor=,
\c!frameoffset=\!!zeropoint,
+ \c!backgroundcorner=\framedparameter\c!corner,
+ \c!backgroundradius=\framedparameter\c!radius,
+ \c!backgrounddepth=\framedparameter\c!depth,
+ \c!framecorner=\framedparameter\c!corner,
+ \c!frameradius=\framedparameter\c!radius,
+ \c!framedepth=\framedparameter\c!depth,
\c!component=,
\c!align=,
\c!bottom=\vss,
diff --git a/tex/context/base/core-sec.mkii b/tex/context/base/core-sec.mkii
new file mode 100644
index 000000000..960de366f
--- /dev/null
+++ b/tex/context/base/core-sec.mkii
@@ -0,0 +1,2620 @@
+%D \module
+%D [ file=core-sec,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Sectioning,
+%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.
+
+% start-stop per section en dan combineren met sectieblok; in dat geval
+% eenvoudiger per-* acties
+
+% nummeren per sectieblok implementeren
+
+% this module needs a clean up, currently some manipulations
+% take place multiple times; also, some clever recursive level
+% thing makes more sense
+
+% in manual (zie prikkels) : tussen=\blanko is enige hook om
+% met kop-in-hoofd een spatiering af te dwingen
+
+\writestatus{loading}{Context Core Macros / Sectioning}
+
+\startmessages dutch library: structures
+ title: structuur
+ 1: begin van sectieblok --
+ 2: eind van sectieblok --
+\stopmessages
+
+\startmessages english library: structures
+ title: structure
+ 1: begin of sectionblock --
+ 2: end of sectionblock --
+\stopmessages
+
+\startmessages german library: structures
+ title: struktur
+ 1: Begin des Abschnittsblocks --
+ 2: Ende des Abschnittsblocks --
+\stopmessages
+
+\startmessages czech library: structures
+ title: struktury
+ 1: zacatek oddilu (sekce) --
+ 2: konec oddilu (sekce) --
+\stopmessages
+
+\startmessages italian library: structures
+ title: struttura
+ 1: inizio del blocco (sezione) --
+ 2: fine del blocco (sezione) --
+\stopmessages
+
+\startmessages norwegian library: structures
+ title: struktur
+ 1: starten av blokk -- (seksjon)
+ 2: slutten av blokk -- (seksjon)
+\stopmessages
+
+\startmessages romanian library: structures
+ title: structuri
+ 1: inceput de bloc sectiune --
+ 2: sfarsit de bloc sectiune --
+\stopmessages
+
+\startmessages french library: structures
+ title: structure
+ 1: début de blocsection --
+ 2: fin de blocsection --
+\stopmessages
+
+\unprotect
+
+% new and to be tested
+
+\unexpanded\def\separatorlist#1%
+ {\ifx\sepnumber\undefined\def\sepnumber{0}\fi
+ \increment\sepnumber
+ \getfromcommacommand[#1][\sepnumber]%
+ \ifx\commalistelement\empty
+ \getcommalistsize[#1]%
+ \def\sepnumber{\number\commalistsize}%
+ \getfromcommacommand[#1][\sepnumber]%
+ \fi
+ \commalistelement}
+
+% \setuphead[section] [separator=\separatorlist{?,!,*}]
+% \setuphead[subsection][separator=\separatorlist{??,!!,**}]
+%
+% \let\spr\separatorlist % this will enable this feature
+%
+% \setuphead[section] [separator={?,!,*}]
+% \setuphead[subsection][separator={??,!!,**}]
+%
+% \setupheads[separator={A,B,C,D,E,F}]
+% \chapter{test}
+% \section{test} \subsection{test} \subsection{test}
+% \section{test} \subsection{test} \subsection{test}
+
+% from now on, internaly numbers are separated by a period
+% and postprocessed on demand; this will change to {} {} {}
+
+\def\numberseparator {.} % reasonable default
+\def\sectionseparator{-} % was : but is now -
+
+\def\@@filterfirstpart [#1--#2]{#1}
+\def\@@filtersecondpart [#1--#2]{#2}
+
+\def\@@filterblockpart [#1--#2--#3]{#1}
+\def\@@filternumberpart [#1--#2--#3]{#2}
+\def\@@filterpagepart [#1--#2--#3]{#3}
+\def\@@filterblocknumberpart[#1--#2--#3]{#1--#2}
+
+\def\@@filterheadpart[#1]{\@EA\@@dofilterheadpart\@EA[#1-0]}
+\def\@@filtertailpart[#1]{\@EA\@@dofiltertailpart\@EA[#1-0]}
+
+\def\@@dofilterheadpart[#1-#2]{#1}
+\def\@@dofiltertailpart[#1-#2]{#2}
+
+\def\@@filterlevelpart[#1--#2--#3]{\@@dofilterlevelpart[#2-0-0-0-0]}
+
+\def\@@dofilterlevelpart[#1-0-0-0-#2]{#1}
+
+\def\gobbleuntilrelax#1\relax{}
+
+\def\separatednumber #1{\doseparatednumber #1.\empty\relax}
+\def\removefirstprefix#1{\doremovefirstprefix#1.\empty\relax}
+\def\removeallprefixes#1{\doremoveallprefixes#1.\empty\relax}
+
+\def\doseparatednumber#1.#2%
+ {#1%
+ \ifx#2\empty
+ \@EA\gobbleuntilrelax
+ \else \numberseparator
+ \@EA\doseparatednumber
+ \fi#2}
+
+\def\doremoveallprefixes#1.#2%
+ {\ifx#2\empty
+ #1\@EA\gobbleuntilrelax
+ \else
+ \@EA\doremoveallprefixes
+ \fi#2}
+
+\def\doremovefirstprefix#1.#2%
+ {\ifx#2\empty
+ #1\@EA\gobbleuntilrelax
+ \else
+ \@EA\noremovefirstprefix
+ \fi#2}
+
+\def\noremovefirstprefix#1.\empty\relax
+ {#1}
+
+% we need to expand in order to get something separatable
+
+\def\dohandleheadnumber#1%
+ {\expanded{\separatednumber{#1}}}
+
+\def\dodochecknumber#1#2#3% will become ugly after speed up
+ {\bgroup
+ \doifinstringelse{.0}{.#2}
+ {\doifnot{#3}\v!by
+ {%\debuggerinfo\m!systems{number #1 #3 becomes \getnumbervariable{#1\c!way}}%
+ \setevalue{\@@thenumber{#1}\c!way}{#3}% geen \xdef, gaat mis met \subpage
+ \dochecknumber{#1}}} % tricky and ugly
+ {\doifnotvalue{\@@thenumber{#1}\s!check}{#2}
+ {% new, calculate accumulated number
+ \scratchcounter\getvalue{\@@thenumber{#1}\c!n}\relax
+ \advance\scratchcounter\countervalue{\@@thenumber{#1}}\relax
+ \setxvalue{\@@thenumber{#1}\c!n}{\the\scratchcounter}%
+ %
+ \setcounter{\@@thenumber{#1}}{0\getvalue{\@@thenumber{#1}\c!start}}%
+ \setxvalue{\@@thenumber{#1}\c!way\c!local}{\getvalue{\@@thenumber{#1}\c!way}}%
+ \setxvalue{\@@thenumber{#1}\s!check}{#2}}}%
+ \egroup}
+
+\def\dochecknumber#1%
+ {\edef\currentsection{\csname\??by\csname\@@thenumber{#1}\c!way\endcsname\endcsname}%
+ \ifx\currentsection\empty\else
+ \dodochecknumber
+ {#1}%
+ {\csname\currentsection\c!number\endcsname}%
+ {\v!by\previoussection\currentsection}%
+ \fi}
+
+\def\checknumber[#1]%
+ {\bgroup
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
+ \fi
+ \dochecknumber{#1}%
+ \egroup}
+
+\def\rawsectionnumber#1%
+ {\countervalue{\??se#1}}
+
+\def\precedingseparator{\@@koseparator} % brrr
+
+\def\domakeprecedingsectionnumber[#1]% will become ugly after speed up
+ {\bgroup % added
+ \globallet\precedingsectionnumber\empty
+ \ifsectionnumber
+ \doifvalue{\??sb\@@sectionblock\c!number}\v!yes % added
+ {\doifelsevalue{\@@thenumber{#1}\c!sectionnumber}\v!yes
+ \donetrue\donefalse
+ \doifvalue{\@@thenumber{#1}\c!sectionnumber}\v!number
+ {\donetrue\let\@@sectionconversion\gobbleoneargument}%
+ \ifdone
+ \edef\currentsection
+ {\getvalue{\??by\getvalue{\@@thenumber{#1}\c!way\c!local}}}%
+ \doifnot\currentsection\zerosection
+ {\doifnot{\@@sectionvalue\currentsection}{0}
+ {\xdef\precedingsectionnumber
+ {\getvalue{\currentsection\c!number}%
+ \spr{\precedingseparator}}}}%
+ \fi}%
+ \fi
+ \egroup}
+
+\def\makeprecedingsectionnumber[#1]%
+ {\bgroup
+ %\ifnum\blocklevel>0
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
+ \fi
+ \domakeprecedingsectionnumber[#1]%
+ \egroup}
+
+% \def\makesectionnumber[#1]%
+% {\makeprecedingsectionnumber[#1]%
+% \xdef\composedsectionnumber%
+% {\precedingsectionnumber\convertednumber[#1]}}%
+%
+% hack needed for chinese and oldstyle in normal tex, will change
+
+\def\makesectionnumber[#1]%
+ {\bgroup
+ \forceunexpanded % i don't like this hack
+ \makeprecedingsectionnumber[#1]%
+ \xdef\composedsectionnumber% was \xdef maar dat gaat fout met font switches
+ {\precedingsectionnumber\convertednumber[#1]}%
+ \egroup}
+
+% \def\preparethenumber#1#2#3% {\??id#1} \number \result
+% {\doifelsevaluenothing{#1\c!separator}
+% {\let\numberseparator\empty
+% \let#3#2}
+% {% was \unexpanded \edef, but we need it unexpanded !
+% \edef\numberseparator{\spr{\getvalue{#1\c!separator}}}%
+% \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
+% {\edef#3%
+% {\@EA\separatednumber\@EA{#2}%
+% }}%\stp{\getvalue{#1\c!stopper}}}}
+% {\edef#3%
+% {\@EA\separatednumber\@EA{#2}%
+% \spr{\getvalue{#1\c!separator}}%
+% \getvalue{#1\c!suffix}%
+% \stp{\getvalue{#1\c!stopper}}}}}}
+%
+% some day we do a real cleanup
+
+\def\analyzenumber#1#2#3% {\??id#1} \(precedingsection)number \result
+ {% was \unexpanded \edef, but we need it unexpanded !
+ \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
+ {\let \numbersuffix \empty}
+ {\edef\numbersuffix{\spr{\getvalue{#1\c!suffix}}}}%
+ \doifelsenothing{\executeifdefined{#1\c!stopper}\empty}
+ {\let \numberstopper \empty}
+ {\edef\numberstopper{\spr{\getvalue{#1\c!stopper}}}}%
+ \doifelsenothing{\executeifdefined{#1\c!separator}\empty}
+ {\let \numberseparator \empty}
+ {\edef\numberseparator{\spr{\getvalue{#1\c!separator}}}}%
+ \let\numberprefix\empty}
+
+\def\preparefullnumber#1#2#3% {\??id#1} \(precedingsection)number \result
+ {\analyzenumber{#1}#2#3%
+ \ifx\numberseparator\empty
+ \edef\numberprefix{#2}%
+ \else
+ \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
+ \fi
+ \ifx\numbersuffix\empty
+ \ifx\numberprefix\empty
+ \let #3\empty
+ \else
+ \edef#3{\numberprefix\numberstopper}%
+ \fi
+ \else
+ \ifx\numberprefix\empty
+ \edef#3{\numbersuffix\numberstopper}%
+ \else
+ \edef#3{\numberprefix\numberseparator\numbersuffix\numberstopper}%
+ \fi
+ \fi}
+
+\def\prepareprefixnumber#1#2#3% {\??id#1} \number \result
+ {\analyzenumber{#1}#2#3%
+ \ifx\numberseparator\empty
+ \edef\numberprefix{#2}%
+ \else
+ \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
+ \fi
+ \let#3\numberprefix}
+
+\def\sectionnumberonly[#1]%
+ {\makesectionnumber[#1]%
+ \composedsectionnumber}
+
+% sectioning
+
+\newcount\nofsections
+
+\let\zerosection \v!text
+\let\firstsection\empty
+\let\lastsection \empty
+\let\@@sectie \empty
+\let\@@koppeling \empty
+
+\makecounter{\??se\v!text}
+
+\letvalueempty{\??se\v!text\c!before}
+\letvalueempty{\??se\v!text\c!after }
+
+\setvalue {\v!text\c!number}{0}
+\letvalueempty{\v!text\s!format}
+
+\letvalueempty{\??sk\v!text}
+\letvalueempty{\??sk }
+
+\letvalue{\??by }\v!text
+\letvalue{\??by\v!text }\v!text
+\letvalue{\??by\v!all }\v!text
+\letvalue{\??by\v!by }\v!text
+\letvalue{\??by\v!by\v!text}\v!text
+\letvalue{\??by\v!by\v!all }\v!text
+\letvalue{\??by\v!by\v!page}\v!text % see footnotes
+
+\def\sectionofhead#1{\executeifdefined{\??ko#1\c!section}\s!unknown}
+
+\def\setupsection
+ {\dotripleempty\dosetupsection}
+
+\def\dosetupsection[#1]%
+ {\doifdefinedelse{\??se#1}
+ {\dodosetupsection[#1]}%
+ {\dodosetupsection[\sectionofhead{#1}]}}
+
+\def\dodosetupsection[#1][#2][#3]%
+ {\doifdefined{\??se#1}
+ {\ifthirdargument
+ \getparameters[\??se#1#2][#3]%
+ \else
+ \getparameters[\??se#1][#2]%
+ \fi
+ \doifelsevalue{\??se#1\c!previousnumber}\v!yes
+ {\setvalue{#1\c!number}{\@@longsectionnumber {#1}}}
+ {\setvalue{#1\c!number}{\@@shortsectionnumber{#1}}}}}
+
+\def\docouplemarking[#1][#2]%
+ {\doifdefinedelse{\??ko#2\c!section}
+ {\docouplemarking[#1][\getvalue{\??ko#2\c!section}]}
+ {\def\donexttrackcommando##1%
+ {\edef\coupledmarkings{\getvalue{\??se##1\c!marking}}%
+ \doifelse{##1}{#2}
+ {\addtocommalist{#1}\coupledmarkings}
+ {\removefromcommalist{#1}\coupledmarkings}%
+ \setevalue{\??se##1\c!marking}{\coupledmarkings}%
+ \donexttracklevel{##1}}%
+ \donexttracklevel{\zerosection}}} % \firstsection
+
+\def\couplemarking
+ {\dodoubleargument\docouplemarking}
+
+\def\decouplemarking[#1]%
+ {\couplemarking[#1][]}
+
+\def\definesection[#1]%
+ {\doifundefined{\??se#1}
+ {\doifelsenothing\firstsection
+ {\def\firstsection{#1}%
+ \setevalue{\??se#1\c!before}{\v!text}%
+ \setevalue{\??se\v!text\c!after}{#1}}
+ {\setevalue{\??se\commalistelement\c!after}{#1}% commalistelement ?
+ \setevalue{\??se#1\c!before}{\lastsection}%
+ \setevalue{\??se\lastsection\c!after}{#1}}%
+ \advance\nofsections \plusone
+ \setevalue{\??se#1\c!level}{\the\nofsections}%
+ \letvalue{\??se#1\c!after}\empty
+ \setvalue{\e!next#1}{\@@nextsectionnumber{#1}}%
+ \setvalue{#1\c!number}{\@@longsectionnumber{#1}}%
+ \setvalue{#1\s!format}{\@@longformatnumber{#1}}%
+ \setevalue{\??by#1}{#1}%
+ \setevalue{\??by\v!by#1}{#1}%
+ \makecounter{\??se#1}%
+ \makecounter{\??se\v!last#1}% GB
+ \edef\lastsection{#1}%
+ \setvalue{\??sk#1}{#1}%
+ \letvalue{\??se#1\c!marking}\empty
+ \setupsection[#1][\c!previousnumber=\v!yes]}}%
+
+\def\previoussection#1{\csname\??se#1\c!before\endcsname}
+\def\nextsection #1{\csname\??se#1\c!after \endcsname}
+
+\let\preservedsection\v!unknown % \def\preservedsection{\firstsection}
+
+\def\checkpreservevalueafter#1% GB
+ {\ifnum\getvalue{\??se#1\c!level}<\nofsections
+ \edef\preservedsection{\getvalue{\??se#1\c!after}}%
+ \ifconditional\@@resetsubheadnumbers
+ \setcounter{\??se\v!last\preservedsection}\zerocount % {0}%
+ \else
+ \setcounter{\??se\v!last\preservedsection}{\countervalue{\??se\preservedsection}}%
+ \fi
+ \fi}
+
+\def\@@setsectionnumber#1#2%
+ {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
+ \setcounter{\??se#1}{#2}%
+ \checkpreservevalueafter{#1}% GB
+ \resetsectioncounters{#1}%
+ \checkpagecounter}
+
+\def\@@nextsectionnumber#1% patched by GB
+ {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
+ \ifnum\countervalue{\??se\v!last#1}>\zerocount
+ \setcounter{\??se#1}{\countervalue{\??se\v!last#1}}%
+ \setcounter{\??se\v!last#1}\zerocount % {0}%
+ \fi
+ \pluscounter{\??se#1}%
+ \checkpreservevalueafter{#1}%
+ \resetsectioncounters{#1}%
+ \checkpagecounter}
+
+\def\@@sectionvalue#1% % nog niet overal doorgevoerd
+ {\countervalue{\??se#1}} % zoeken op \??se
+
+% suited for chinese too:
+
+\def\@@sectionconversion#1#2% a doublure with \@@shortsectionnumber
+ {\ifnum#2=0 0\else % else troubles with \uchar
+ \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
+ \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
+ #2%
+ \else
+ \convertnumber{\getvalue{\??se#1\c!conversion}}{#2}%
+ \fi
+ \else
+ \convertnumber{\getvalue{\??se#1\@@sectionblock\c!conversion}}{#2}%
+ \fi
+ \fi}
+
+% \def\@@sectionlevel#1%
+% {\ifundefined{\??se#1\c!level}0\else\getvalue{\??se#1\c!level}\fi}
+
+\def\@@sectionlevel#1%
+ {\executeifdefined{\??se#1\c!level}0}
+
+% Omdat een markering kan worden herdefinieerd moeten we
+% eerst testen of er wel een keten||afhankelijkheid is.
+
+\def\resetsectionmarks#1% can invoke a break
+ {\ifundefined{\??se#1}%
+ \fastresetmarker[\mainmarking{#1}]% % redundant \mainmarking
+ \else
+ \let\donexttrackcommando\doresetsectionmarks
+ \donexttracklevel{#1}%
+ \fi}
+
+\def\doresetsectionmarks#1%
+ {\ifundefined{\??se#1\c!marking}\else % skip zero level
+ \fastresetmarkerlist[\csname\??se#1\c!marking\endcsname]%
+ \fi
+ \donexttracklevel{#1}}
+
+% I'm not sure if the next one is better:
+%
+% \def\doresetsectionmarks#1%
+% {\ifundefined{\??se#1\c!markering}% skip zero level
+% \donexttracklevel{#1}%
+% \else
+% \fastresetmarkerlist[\csname\??se#1\c!markering\endcsname]%
+% \fi}
+%
+% and indeed, it isn't, actually, it does not work at all, so let's drop it.
+
+% packaged:
+%
+% \def\resetsectioncounters#1%
+% {\def\donexttrackcommando##1%
+% {\resetcounter{\??se##1}%
+% \donexttracklevel{##1}}%
+% \donexttracklevel{#1}}
+%
+% nicer
+%
+% \def\doresetsectioncounters#1%
+% {\resetcounter{\??se#1}%
+% \donexttracklevel{#1}}
+%
+% obey eigennummer
+
+\def\doresetsectioncounters#1%
+ {\resetcounter{\??se#1}%
+ \letgvalue{\??se#1\c!ownnumber}\relax
+ \donexttracklevel{#1}}
+
+\def\resetsectioncounters % #1
+ {\let\donexttrackcommando\doresetsectioncounters
+ \donexttracklevel} % #1
+
+% bij checken kan geen prefix worden bekeken, anders vallen
+% er titels buiten de inhoudsopgave
+
+% evt ook level gaan opslaan tbv snelle selectie
+
+% \def\makesectionformat
+% {\edef\sectionformat
+% {\@@sectiontype\sectionseparator
+% \csname\lastsection\s!format\endcsname}}
+
+\unprotected \def\makesectionformat % we don't want eigennummers here
+ {\pushmacro\@@shortsectionnumber
+ \let\@@shortsectionnumber\@@sectionvalue
+ \edef\sectionformat
+ {\@@sectiontype\sectionseparator
+ \csname\lastsection\s!format\endcsname}%
+ \popmacro\@@shortsectionnumber}
+
+\def\dobacktracklevel#1%
+ {\doifnot{\previoussection{#1}}\zerosection
+ {\dobacktrackcommando{\previoussection{#1}}}}
+
+\def\donexttracklevel#1%
+ {\doifnot{#1}\lastsection
+ {\donexttrackcommando{\nextsection{#1}}}}
+
+\chardef\alltoclevels\zerocount
+
+\let\currentlevel\empty
+
+\def\dosetcurrentlevel#1%
+ {\global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\lastsection\s!format}}}
+
+\def\dosetpreviouslevel#1%
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty
+ \def\dobacktrackcommando##1%
+ {\ifnum\countervalue{\??se##1}>\zerocount
+ \global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi}%
+ \dobacktrackcommando\lastsection}
+
+\def\dosettextlevel#1%
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty}
+
+\def\dosetotherlevel#1%
+ {\doifdefinedelse{\??ko#1\c!section} % beter alteratief: ook
+ {\edef\@@sectie{\getvalue{\??ko#1\c!section}}} % hoofdstuk\c!format
+ {\edef\@@sectie{#1}}%
+ \doifdefinedelse{\??se\@@sectie}
+ {\global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty
+ \def\dobacktrackcommando##1%
+ {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
+ \dobacktracklevel{##1}%
+ \else
+ \ifnum\countervalue{\??se##1}>\zerocount
+ \global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{##1\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi
+ \fi}%
+ \dobacktrackcommando\lastsection}}
+
+% \def\ignoresectionconversion % brrr
+% {\let\@@sectionconversion\secondoftwoarguments}
+
+% todo: criterium=appendix|frontmatter|....
+
+\def\dosetfilterlevel#1#2% beware: this one is \let
+ {\bgroup
+ \let\@@shortsectionnumber\@@sectionvalue
+% \ignoresectionconversion
+ \edef\askedlevel{#1}%
+ \edef\askedfilter{#2}%
+ \ifx\askedlevel\v!current
+ \dosetcurrentlevel\askedlevel
+ \else\ifx\askedlevel\v!previous
+ \dosetpreviouslevel\askedlevel
+ \else\ifx\askedlevel\v!all
+ \global\chardef\alltoclevels\plusone
+ \else\ifx\askedlevel\v!text
+ \global\chardef\alltoclevels\plusone
+ \else
+ \edef\byaskedlevel{\csname\??by\askedlevel\endcsname}%
+ \ifx\byaskedlevel\v!text
+ \dosettextlevel\askedlevel
+ \else
+ \dosetotherlevel\askedlevel
+ \fi
+ \fi\fi\fi\fi
+ % experiment
+ \ifx\askedfilter\empty \else
+ \xdef\currentlevel{\currentlevel\sectionseparator\askedfilter}%
+ \fi
+ \egroup}
+
+% \def\dontsetfilterlevel#1#2%
+% {\let\currentlevel\somesavedlevel
+% \chardef\alltoclevels\zerocount}
+
+\def\dontsetfilterlevel#1#2%
+ {\let\currentlevel\somesavedlevel
+ \let\@@sectiontype\@@tocsectiontype
+ \chardef\alltoclevels\zerocount}
+
+\def\honorlocalfilterlevel % local lists will be real local
+ {\let\dosetfilterlevel\dontsetfilterlevel}
+
+% cleaner
+%
+% \def\doifnextlevelelse[#1::#2]#3#4%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}{#4}{#3}}
+% {#4}}
+% {#4}%
+% \else
+% #3%
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]#3#4%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}{#3}{#4}}
+% {#4}%
+% \else
+% #3%
+% \fi}
+%
+% faster
+%
+% \def\doifnextlevelelse[#1::#2]%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% meaner
+%
+% \setuplist
+% [chapter]
+% [after={\startcolumns\placelist[section]\stopcolumns}]
+
+\def\somesavedlevel{0}
+
+% \def\dosavesomelevel[#1:0:0:0:#2]%
+% {\def\somesavedlevel{:#1}}
+
+% \def\doifnextlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% again faster:
+
+% \def\doifnextlevelelse[#1::#2]% beware: this one is \let
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=#1
+% \def\levelstring{=:#2:}%
+% \doifincsnameelse{=\currentlevel:}\levelstring
+% {\doifincsnameelse{=\currentlevel:0}\levelstring\donefalse\donetrue}
+% \donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+%\def\doifprevlevelelse[#1::#2]% beware: this one is \let
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=#1
+% \doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \let\doiftoclevelelse\doifnextlevelelse
+% \let\doifreglevelelse\doifprevlevelelse
+% \let\doifblklevelelse\doifprevlevelelse
+%
+% we want to be able to overload them globally
+
+% This will be reimplemented some day soon
+%
+% {nn}{xx}{yy}
+%
+% -> \scan{..}{..}{0} met 0 als sentinel
+
+% still not perfect
+%
+% \def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
+% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
+% \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
+% \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
+% {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
+% \donefalse
+% \donetrue}
+% \donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
+% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
+% \doifinstringelse
+% {=\currentlevel\sectionseparator}
+% {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
+% \donetrue\donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+
+\def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
+ {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+ \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
+ \ifcase\alltoclevels
+ \ifnum\@@sectiontype=\@@tocsectiontype\relax
+ \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
+ \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
+ {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
+ \donefalse
+ \donetrue}
+ \donefalse
+ \else
+ \donefalse
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
+ {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+ \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
+ \ifcase\alltoclevels
+ \ifnum\@@sectiontype=\@@tocsectiontype\relax
+ \doifinstringelse
+ {=\currentlevel\sectionseparator}
+ {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
+ \donetrue\donefalse
+ \else
+ \donefalse
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% we need to cover the special case of nested lists in section blocks
+%
+% \starttext
+%
+% \def\ChapterEntry#1#2#3%
+% {chapter : \hbox to \hsize{\strut\bf#2\hss#3}\endgraf\placelist[section]}
+%
+% \startfrontmatter % optional
+% \placelist[chapter][alternative=command,command=\ChapterEntry,criterium=text] \page
+% \stopfrontmatter % optional
+%
+% \startbodymatter % optional
+% \chapter{first} \section{one} test \section{two} test \page
+% \chapter{second} \section{alpha} test \section{beta} test \page
+% \stopbodymatter % optional
+%
+% \stoptext
+
+\def\doiftoclevelelse{\doifnextlevelelse}
+\def\doifreglevelelse{\doifprevlevelelse}
+\def\doifblklevelelse{\doifprevlevelelse}
+
+\def\@@longformatnumber#1%
+ {\csname\previoussection{#1}\s!format\endcsname
+ \sectionseparator
+ \@@shortsectionnumber{#1}}
+
+% \def\@@longsectionnumber#1%
+% {\ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+% \csname\previoussection{#1}\c!nummer\endcsname.%
+% \fi
+% \@@shortsectionnumber{#1}}
+
+\def\@@longsectionnumber#1%
+ {\ifreversesectionnumbers
+ \@@shortsectionnumber{#1}%
+ \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+ .\csname\previoussection{#1}\c!number\endcsname
+ \fi
+ \else
+ \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+ \csname\previoussection{#1}\c!number\endcsname.%
+ \fi
+ \@@shortsectionnumber{#1}%
+ \fi}
+
+% suited for chinese too:
+%
+% \def\@@shortsectionnumber#1%
+% {\@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
+% \@@sectionvalue{#1}%
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi}
+%
+% obey eigennummer
+%
+% \def\@@shortsectionnumber#1%
+% {\@EA\ifx\csname\??se#1\c!eigennummer\endcsname\relax
+% \@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
+% \@EA\ifx\csname\??se#1\c!conversie\endcsname\relax
+% \@@sectionvalue{#1}%
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi
+% \else
+% \csname\??se#1\c!eigennummer\endcsname
+% \fi}
+
+\def\@@shortsectionnumber#1%
+ {\@EA\ifx\csname\??se#1\c!ownnumber\endcsname\relax
+ \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
+ \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
+ \@@sectionvalue{#1}%
+ \else
+ \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+ \fi
+ \else
+ \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+ \fi
+ \else
+ \csname\??se#1\c!ownnumber\endcsname
+ \fi}
+
+\def\dosetlocalsectionblock#1#2#3% new \edef's
+ {\edef\@@sectiontype {#1}%
+ \edef\@@sectionblock {#2}%
+ \edef\@@sectionblocks{#3}}
+
+% beware, the \resetsectionmarks generates some nodes that
+% will result in an additional last page, which needs to be
+% captured at the end
+
+% \def\doaroundsectionblock#1%
+% {\doifvaluesomething{\??sb#1\c!page}
+% {\ExpandFirstAfter\page[\getvalue{\??sb#1\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection}
+
+% \def\dostartsectionblock#1#2%
+% {\begingroup
+% \doaroundsectionblock{#1}% % going to a new page or so
+% \getvalue{\??sb#1}% % set name of section block
+% \getsectionblockenvironment{#1}% % special settings, grouped
+% %\expandafter\csname#2true\endcsname % obsolete
+% \setsystemmode{#1}% % can be used in conditionals
+% \getvalue{\??sb\@@sectionblock\c!before}% this one is not to be moved!
+% \showmessage\m!structures1\@@sectionblocks}
+
+% \def\dostopsectionblock
+% {\showmessage\m!structures2\@@sectionblocks
+% \getvalue{\??sb\@@sectionblock\c!after}% don't move
+% \doaroundsectionblock\@@sectionblock
+% \endgroup}
+
+\def\doaroundsectionblock
+ {\doifvaluesomething{\??sb\@@sectionblock\c!page}
+ {\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+ \resetsectioncounters\zerosection % was firstsection
+ \resetsectionmarks\zerosection}
+
+\def\dostartsectionblock#1#2%
+ {\begingroup
+ \getvalue{\??sb#1}%
+ \doaroundsectionblock
+% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection
+ \getsectionblockenvironment\@@sectionblock
+ \setsystemmode\@@sectionblock
+ \getvalue{\??sb\@@sectionblock\c!before}%
+ \showmessage\m!structures1\@@sectionblocks}
+
+\def\dostopsectionblock
+ {\showmessage\m!structures2\@@sectionblocks
+ \getvalue{\??sb\@@sectionblock\c!after}% don't move
+ \doaroundsectionblock
+% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection
+ \endgroup}
+
+\def\dosetupsectionblock[#1]% [#2]
+ {\getparameters[\??sb#1]}
+
+\def\setupsectionblock
+ {\dodoubleargument\dosetupsectionblock}
+
+\long\def\setsectionblockenvironment#1#2%
+ {\long\setvalue{\??sb\s!do#1}{\do{#2}}}
+
+\def\getsectionblockenvironment#1%
+ {\let\do\firstofoneargument\getvalue{\??sb\s!do#1}}
+
+\setvalue{\e!start\v!sectionblockenvironment}%
+ {\dosingleargument\dostartsectionblockenvironment}
+
+\def\dostartsectionblockenvironment[#1]% evt \pushendofline \popendofline
+ {\long\def\do##1##2{\setsectionblockenvironment{#1}{##1##2}}%
+ \grabuntil{\e!stop\v!sectionblockenvironment}{\getvalue{\??sb\s!do#1}}}
+
+%D \starttyping
+%D \startsectionblockenvironment[frontpart]
+%D \setuppagenumbering[conversion=romannumerals]
+%D \stopsectionblockenvironment
+%D
+%D \startsectionblockenvironment[bodypart]
+%D \setuppagenumber[number=1]
+%D \stopsectionblockenvironment
+%D
+%D \startsectionblockenvironment[frontpart]
+%D \setuppagenumbering[conversion=character]
+%D \stopsectionblockenvironment
+%D
+%D \starttext
+%D \startfrontmatter \chapter{test} \stopfrontmatter
+%D \startbodymatter \chapter{test} \stopbodymatter
+%D \startappendices \chapter{test} \stopappendices
+%D \stoptext
+%D \stoptyping
+
+% We used to use the first char as id, but a counter is
+% better, because in english we get a name clash.
+
+\newcounter\currentsectionblock
+
+\def\currentsection{\@@sectionblock}
+
+\def\dodefinesectionblock[#1][#2][#3]%
+ {\getparameters
+ [\??sb#1]
+ [\c!number=\v!yes,
+ \c!page=\v!right, % anders worden marks te vroeg gereset !
+ %\c!before=,
+ %\c!after=,
+ #3]%
+ \expandafter\newif\csname if#2\endcsname % better a mode
+ \doglobal\increment\currentsectionblock
+ \setsectionblockenvironment{#1}{}%
+ \setevalue{\??sb #1}{\noexpand\dosetlocalsectionblock{\currentsectionblock}{#1}{#2}}%
+ \setvalue {\e!start#2}{\dostartsectionblock{#1}{#2}}%
+ \setvalue {\e!stop #2}{\dostopsectionblock}}
+
+\def\definesectionblock
+ {\dotripleargument\dodefinesectionblock}
+
+\def\sectionblocklabel#1#2%
+ {\@EA\ifx\csname\??ko#1\@@sectionblock\c!label\endcsname\relax
+ \labeltexts{#1}{#2}%
+ \else
+ \labeltexts{\getvalue{\??ko#1\@@sectionblock\c!label}}{#2}%
+ \fi}
+
+\dosetlocalsectionblock{2}{\v!bodypart}{\v!bodymatter} % hm, dirty
+
+\def\setsectiontype[#1]%
+ {\getvalue{\??sb#1}}
+
+\def\writesection#1#2#3% #3 -> \asciititle
+ {\bgroup
+ \edef\!!stringa{#1}%
+ \@EA\writestatus\@EA
+ {\!!stringa}
+ {\ifsectionnumber#2\else(#2)\fi\normalspace\asciititle}%
+ \egroup}
+
+\def\@@kolevel{1} \def\headlevel{\@@kolevel}
+
+\def\dohandlepagebreakAA#1%
+ {\ifnum\lastpenalty>0
+ \global\paginageblokkeerdtrue
+ \fi}
+
+% \setuphead[section][aligntitle=float] % permits title next to sidefloat
+%
+% \placefigure[left]{}{} \section{\dorecurse{10}{bagger }} \input tufte
+
+% \def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
+% {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
+% \getvalue{\??ko#1\c!before}%
+% % \whitespace vervangen door \noindent elders
+% \relax
+% \ifpaginageblokkeerd
+% \global\paginageblokkeerdfalse
+% \else
+% \!!countb\getvalue{\??se\@@sectie\c!level}\relax
+% \ifnum\!!countb>\@@kolevel\relax
+% \!!counta20000
+% \multiply\!!countb 500
+% \advance\!!counta \!!countb
+% \dosomebreak{\penalty\!!counta}%
+% \else
+% \dosomebreak\allowbreak
+% \fi
+% \fi
+% \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
+% \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
+
+\chardef\somebreakmethod\plusone
+
+\def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
+ {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
+ \getvalue{\??ko#1\c!before}%
+ % \whitespace vervangen door \noindent elders
+ \relax
+ \ifpaginageblokkeerd
+ \global\paginageblokkeerdfalse
+ \else
+ \ifcase\somebreakmethod
+ % 0 = nothing
+ \or
+ % 1 = old weighted version
+ \!!countb\getvalue{\??se\@@sectie\c!level}\relax
+ \ifnum\!!countb>\@@kolevel\relax
+ \!!counta20000
+ \multiply\!!countb 500
+ \advance\!!counta \!!countb
+ \dosomebreak{\penalty\!!counta}%
+ \else
+ \dosomebreak\allowbreak % brr
+ \fi
+ \or
+ % 2 = strict version
+ \dosomebreak{\penalty\maxdimen}%
+ \else
+ % nothing
+ \fi
+ \fi
+ \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
+ \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
+
+\def\dohandlepagebreakBB#1#2#3%
+ {%\doifinsetelse{\getvalue{\??tk#2\c!state}}{\v!normal,\v!start}
+ \doifelselayouttextline{#2}
+ {\doifvaluesomething{\??ko#1#3}
+ {\setuplayouttext[#2][\c!state=\getvalue{\??ko#1#3}]}}
+ \donothing}
+
+\def\dohandlepagebreakB#1%
+ {\doifvaluesomething{\??ko#1\c!page}
+ {\def\resetcurrentsectionmarks% toegevoegd, zie \page
+ {\resetsectionmarks{\previoussection\@@sectie}}%
+ \page[\getvalue{\??ko#1\c!page}]%
+ \dohandlepagebreakBB{#1}\v!header\c!header
+ \dohandlepagebreakBB{#1}\v!text \c!text
+ \dohandlepagebreakBB{#1}\v!footer\c!footer}}
+
+\def\dohandlepagebreakX#1% zie doordefinieren / boven
+ {\bgroup
+ \!!countb\@@kolevel
+ \advance\!!countb #1
+ \multiply\!!countb 500
+ \!!counta20000
+ \advance\!!counta \!!countb
+ \dosomebreak{\penalty\!!counta}%
+ \egroup}
+
+\newconditional\ignorehandlepagebreak
+
+\def\handlepagebreak#1%
+ {\ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \dohandlepagebreakAA{#1}%
+ \ifnum\countervalue{\??se\previoussection\@@sectie}>\zerocount\relax
+ \ifnum\countervalue{\??se\@@sectie}>\zerocount
+ \dohandlepagebreakB{#1}%
+ \else
+ \doifnotvalue{\??ko#1\c!continue}\v!yes{\dohandlepagebreakB{#1}}%
+ \fi
+ \else
+ \dohandlepagebreakB{#1}%
+ \fi
+ \dohandlepagebreakAB{#1}%
+ \fi}
+
+\def\handlenopagebreak#1%
+ {\ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}%
+ \nobreak
+ \fi}
+
+\def\localheadheight {\strutht}
+\def\localheaddepth {\strutdp}
+\def\localheadlineheight{\lineheight}
+
+\def\dolocalheadsetup#1% koppeling met standaard kopcommando / engels
+ {\forgetall % traag dus ...
+ \doifvaluesomething{\??ko#1\c!align} % wordt al expanded in spa
+ {\expanded{\setupalign[\getvalue{\??ko#1\c!align}]}}%
+ \doifvaluesomething{\??ko#1\c!tolerance} % wordt al expanded in spa
+ {\expanded{\setuptolerance[\getvalue{\??ko#1\c!tolerance}]}}%
+ \doifvalue{\??ko#1\c!strut}\v!no % wordt al expanded in spa
+ {\setnostrut}% new
+ \def\\{\crlf\strut\ignorespaces}}
+
+\def\localkopsetup{\localheadsetup} % kan tzt weg
+
+% todo: make them conditionals:
+
+\newif\ifincrementnumber
+\newif\ifreversesectionnumbers % todo: key/val
+\newif\ifsectionnumber \sectionnumbertrue
+\newif\ifdisplaysectionhead \displaysectionheadtrue
+\newif\ifplacehead
+\newif\ifemptyhead
+\newif\ifwritetolist
+\newif\ifheadnumber
+\newif\ifheadnumbercontent % niet meer wijzigen / wordt mode
+\newif\ifheadprefix
+\newif\ifsomeheadconversion
+
+% new
+
+\newconditional\@@resetsubheadnumbers
+
+\def\setsectieenkoppeling#1%
+ {\edef\@@koppeling{\getvalue{\??ko#1\c!coupling}}%
+ \edef\@@sectie{\getvalue{\??ko#1\c!section}}%
+ \doifnothing\@@koppeling
+ {\edef\@@koppeling{#1}}%
+ \doifnothing\@@sectie
+ {\edef\@@sectie{\getvalue{\??ko\@@koppeling\c!section}}}}
+
+% \handlepagebreak komt het eerst omdat eventueel
+% subpaginanummers moeten worden afgehandeld. Vervolgens
+% worden de nummers opgehoogd en referenties geset, dan
+% volgt de kop en tot slot de worden de marks en de prefix
+% geset.
+
+% \hoofdstuk {tekst}
+% \hoofdstuk tekst
+% \hoofdstuk
+
+\let\finalsectionnumber\empty
+
+\def\dofinalsectionnumber
+ {\ifundefined{\@@sectie\c!number}\else
+ \ifsomeheadconversion
+ \@@shortsectionnumber\@@sectie
+ \else
+ \getvalue{\@@sectie\c!number}%
+ \fi
+ \fi}
+
+\def\findsectionnumber#1#2#3% class file title / uti seperator --
+ {\begingroup
+ \setsectieenkoppeling{#1}%
+ \xdef\foundsectionnumber{1}%
+ \def\dolistelement##1##2##3##4##5##6%
+ {\doif{##1}{#1}
+ {\ConvertConstantAfter\doif{##4}{#3}
+ {\global\utilitydonetrue
+ \scratchcounter=0\getvalue{\??se\@@sectie\c!level}%
+ %
+ %\advance\scratchcounter 2
+ %\@EA\def\@EA\do\@EA####\@EA1\sectionseparator####2]%
+ % {\advance\scratchcounter -1
+ % \ifcase\scratchcounter
+ % \xdef\foundsectionnumber{####1}%
+ % \else
+ % \do####2]%
+ % \fi}%
+ %\do##5]}}}%
+ %
+ \def\do####1\relax % :/- clean
+ {\advance\scratchcounter \minusone
+ \ifcase\scratchcounter
+ \xdef\foundsectionnumber{\@@filterheadpart[####1]}%
+ \else
+ \@EAEAEA\do\@@filtertailpart[####1]\relax
+ \fi}%
+ \@EA\do\@@filternumberpart[##5]\relax}}}%
+ \setbox0\vbox
+ {\doutilities{#1}{#2}{#1}\relax\relax}%
+ \endgroup
+ \doifnumberelse\foundsectionnumber
+ {\doif\foundsectionnumber\!!zerocount
+ {\globallet\foundsectionnumber\!!plusone}}
+ {\globallet\foundsectionnumber\!!plusone}% an appendix or so
+ \setupheadnumber[#1][\foundsectionnumber]%
+ \setupheadnumber[#1][-1]}
+
+% deal with eigennummer
+
+\def\setsomeheadconversion#1#2%
+ {\someheadconversionfalse
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\setgvalue{\??se\@@sectie\c!ownnumber}{#2}%
+ \def\someheadconversion{#2}}
+ {\letgvalue{\??se\@@sectie\c!ownnumber}\relax
+ \determineheadnumber[#1]%
+ \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\relax
+ \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\relax
+ \def\someheadconversion{#2}%
+ \else
+ \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\empty
+ \def\someheadconversion{#2}%
+ \else
+ \someheadconversiontrue
+ \def\someheadconversion%
+ {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\c!headconversion}}{#2}}%
+ \fi
+ \fi
+ \else
+ \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\empty
+ \def\someheadconversion{#2}%
+ \else
+ \someheadconversiontrue
+ \def\someheadconversion%
+ {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\@@sectionblock\c!headconversion}}{#2}}%
+ \fi
+ \fi}}
+
+\def\writtenfullsectionnumber
+ {\string\fullsectionnumber}
+
+\def\ignoredfullsectionnumber#1#2#3%
+ {#3}
+
+\let\storedfullsectionnumber\relax
+
+\def\expandablefullsectionnumber#1#2#3%
+ {\convertnumber{#2}{#3}}
+
+\unexpanded\def\naturalfullsectionnumber#1#2#3%
+ {\sectionblocklabel{#1}{\convertnumber{#2}{#3}}}
+
+\unexpanded\def\limitedfullsectionnumber#1#2#3%
+ {\convertnumber{#2}{#3}}
+
+\def\setfullsectionnumber#1%
+ {\doifelsevalue{#1\c!headconversion}\v!yes
+ {\doifelsevalue{#1\c!headlabel}\v!yes
+ {\let\fullsectionnumber\naturalfullsectionnumber}
+ {\let\fullsectionnumber\limitedfullsectionnumber}}
+ {\let\fullsectionnumber\ignoredfullsectionnumber}}
+
+\let\fullsectionnumber\limitedfullsectionnumber
+
+% \dodododoconstructhead IS NON GROUPED, SO WE NEED TO RESTORE !!!!
+%
+% dit kan dus beter \everyaroundhead zijn
+
+\let\currentheadnumber\empty
+\let\currentheadtext \empty
+
+\def\dodoconstructhead#1[#2]#3% [ref] {title}
+ {\doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\doquadruplegroupempty\dododoconstructhead{#1}{#2}{#3}}
+ {\fourthargumentfalse \dododoconstructhead{#1}{#2}{#3}{}}}
+
+\def\dododoconstructhead#1#2#3#4% [ref] {own} {title}
+ {\iffourthargument
+ \def\next{\dodododoconstructhead{#1}[#2]{#3}{#4}}%
+ \else
+ \def\next{\dodododoconstructhead{#1}[#2]{\finalsectionnumber}{#3}}%
+ \fi
+ \next}
+
+% pas met \ExpandFirstAfter op bij twee||taligheid
+
+\ifx\dohandleheadnumber\undefined
+ \let\dohandleheadnumber\firstofoneargument
+\fi
+
+\unexpanded\def\\{\space}
+
+\def\emptyheadcorrection % experimental, should work
+ {\ifemptyhead % well with na=\blank
+ \vskip-\lineheight
+ \dosomebreak\nobreak
+ \kern\zeropoint
+ \prevdepth\strutdepth
+ \fi}
+
+\let\localkopprefix\empty
+
+\def\headparameter#1% to do: everywhere in core-sec
+ {\executeifdefined{\??ko\currenthead#1}\empty}
+
+% todo: write to list etc in both args or in enclosing h/vbox else it gets
+% lost when no #1 or #2 is typeset
+
+% we will use variables here
+
+\def\dodododoconstructhead#1[#2]#3#4% [ref] {number} {title}
+ {\def\currenthead{#1}% dus #1 overal vervangen
+ \let\finalsectionnumber\dofinalsectionnumber % overloaded ungrouped -)
+ \unexpanded\def\\{\space}%
+ \edef\numberseparator{\spr{\getvalue{\??ko\currenthead\c!separator}}}%
+ \flushingcolumnfloatsfalse % {number} can be \finalsectionnumber
+ \someheadconversionfalse
+ \let\fullsectionnumber\limitedfullsectionnumber
+ \setsectieenkoppeling{#1}%
+ \doifelsevaluenothing{\??ko#1\c!prefix}
+ \headprefixfalse\headprefixtrue
+ \ifheadprefix
+ \doifelsevalue{\??ko#1\c!prefix}{+}
+ {\doifelsenothing{#2}
+ {\def\localkopprefix{+}}
+ {\def\localkopprefix{#2}}} % eigenlijk alleen eerste
+ {\edef\localkoprefix{\getvalue{\??ko#1\c!prefix}}}%
+ \else
+ \let\localkoprefix\empty
+ \fi
+ \placeheadtrue
+ \processaction
+ [\getvalue{\??ko#1\c!placehead}]
+ [ \v!yes=>\emptyheadfalse,
+ \v!empty=>\emptyheadtrue,
+ \v!no=>\emptyheadtrue\placeheadfalse]%
+ \doifelsevalue{\??ko#1\c!resetnumber}\v!no
+ {\setfalse\@@resetsubheadnumbers}%
+ {\settrue \@@resetsubheadnumbers}%
+ \writetolistfalse
+ \processaction
+ [\getvalue{\??ko#1\c!incrementnumber}]
+ [ \v!yes=>\incrementnumbertrue,
+ \v!no=>\incrementnumberfalse,
+ \v!list=>\incrementnumberfalse
+ % beware, since no numbers are used, no nested lists are
+ % possible here
+ \writetolisttrue,
+ \s!unknown=>{\ifx\currentproduct\empty
+ \findsectionnumber{#1}\commalistelement{#4}%
+ \fi
+ \incrementnumbertrue}]%
+ \edef\numberheaddistance {\getvalue{\??ko#1\c!distance}}%
+ \edef\numberheadalternative{\getvalue{\??ko#1\c!alternative}}%
+ \doifelsevalue{\??ko:\numberheadalternative}\v!horizontal
+ \displaysectionheadfalse
+ \displaysectionheadtrue
+ \ifsectionnumber
+ \doifelsevalue{\??sb\@@sectionblock\c!number}\v!yes
+ {\doifelsevalue{\??ko#1\c!number}\v!yes
+ \headnumbertrue
+ \headnumberfalse}
+ {\headnumberfalse}%
+ \else
+ \headnumberfalse
+ \fi
+ \defconvertexpanded\asciititle{\getvalue{\??ko#1\c!expansion}}{#4}%
+ %
+ \gdef\currentheadtext{#4}% scheelt args
+ \globallet\currentheadnumber\empty
+ %
+ \ifincrementnumber
+ \ifplacehead
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifheadprefix
+ %\setupreferencing[\c!prefix=-]%
+ \setupreferenceprefix[-]%
+ \fi
+ \getvalue{\e!next\@@sectie}%
+ \ifheadnumber
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \getvalue{\??ko#1\c!inbetween}%
+ \ifsomeheadconversion
+ \let\fullsectionnumber\naturalfullsectionnumber
+ \doplaceheadnumbertext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \rawreference\s!sec{#2}{{\someheadconversion}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \dowritetolist\@@koppeling\someheadconversion{#4}\v!head}%
+ {\dohandleheadnumber\someheadconversion}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \let\fullsectionnumber\storedfullsectionnumber
+ \expanded{\marking[#1\v!number]{\someheadconversion}}}%
+ \let\fullsectionnumber\ignoredfullsectionnumber
+ \writesection{#1}{\someheadconversion}{#4}%
+ \else
+ \doplaceheadnumbertext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \dowritetolist\@@koppeling{#3}{#4}\v!head}
+ {\sectionblocklabel{#1}{\dohandleheadnumber{#3}}}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % rommelig omdat
+ {\edef\finalsectionnumber{#3}} % #3 al is toegekend
+ {\determineheadnumber[#1]}% migreert naar 3e argument
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
+ \writesection{#1}{#3}{#4}%
+ \fi
+ \else
+ \getvalue{\??ko#1\c!inbetween}%
+ \doplaceheadtext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr, new per 18/1/2005, sometimes we need
+ {\dowritetolist\@@koppeling{#3}{#4}\v!head} % entries in the list (special purpose) but
+ {\dowritetolist\@@koppeling {}{#4}\v!head}% not in the header, ok we could pop in a command
+ }% \dowritetolist\@@koppeling{}{#4}\v!head}
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr
+ {\edef\finalsectionnumber{#3}}
+ {\determineheadnumber[#1]}%
+ % todo : geen markering (leeg maken)
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
+ \writesection{#1}{-}{#4}%
+ \fi
+ \ifheadprefix
+ \setupreferenceprefix[\localkopprefix]%
+ \fi
+ \ifdisplaysectionhead
+ \dosomebreak\nobreak
+ \emptyheadcorrection
+ \getvalue{\??ko#1\c!after}%
+ \fi
+ \else
+ % Whatever future tex's will do with nodes,
+ % we assume a node here, because other \c!after=\blank
+ % will fail! See 'prikkels'
+ %
+ % so, maybe we need an explicit \kern
+ %
+ % do nothing / should be vbox to 0pt
+ %
+ \checknexthead\dohandlepagebreakB{#1}% toegevoegd ivm subpaginanr / tug sheets
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifheadprefix
+ \setupreferenceprefix[-]%
+ \fi
+ \getvalue{\e!next\@@sectie}%
+ \ifheadnumber
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \fi
+ \getvalue{\??ko#1\c!inbetween}% documenteren, is enige hook
+ \bgroup
+ \setsectionlistreference{\@@sectie}{#1}%
+ \resetsectionmarks\@@sectie
+ \marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\edef\finalsectionnumber{#3}}
+ {\determineheadnumber[#1]}%
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}%
+ \pagetype[\@@koppeling]%
+% \bgroup
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \ifheadnumber
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \dowritetolist\@@koppeling{#3}{#4}\v!head
+ \writesection{#1}{#3}{#4}%
+ \else % hm, also no own number
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \dowritetolist\@@koppeling{}{#4}\v!head
+ \writesection{#1}{-}{#4}%
+ \fi
+ \egroup
+ \ifheadprefix
+ \setupreferenceprefix[\localkopprefix]%
+ \fi
+ \fi
+ \else
+ % todo : ref prefix
+ \ifplacehead
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \getvalue{\??ko#1\c!inbetween}%
+ \doplaceheadtext
+ {#1}
+ {\forcesectiontolist{#1}{#4}%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}} % #3 ?
+ {#4}
+ %{}% new:
+ {\marking[#1]{#4}%
+ \marking[#1\v!number]{}}%
+ \writesection{#1}{-}{#4}%
+ \ifdisplaysectionhead
+ \dosomebreak\nobreak
+ \emptyheadcorrection
+ \getvalue{\??ko#1\c!after}%
+ \fi
+ \else
+ % do nothing / should be vbox to 0pt
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \getvalue{\??ko#1\c!inbetween}%
+ \forcesectiontolist{#1}{#4}%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}% #3 ?
+ \marking[#1]{#4}%
+ \marking[#1\v!number]{}%
+ \writesection{#1}{-}{#4}%
+ \fi
+ \fi
+ \flushingcolumnfloatstrue
+ \someheadconversionfalse
+ \setfalse\ignorehandlepagebreak
+ \let\fullsectionnumber\limitedfullsectionnumber
+ % ignorespaces prevents spaces creeping in when after=\dontleavehmode
+ \ifdisplaysectionhead\ignorespaces\else\expandafter\GotoPar\fi}
+
+\def\forcesectiontolist#1#2%
+ {\ifwritetolist
+ % we need to make sure that there is a number set (non
+ % zero) else the list mechanism cannot determine the
+ % level
+ \bgroup
+ \setupheadnumber[#1][+1]% traag, wordt \getvalue{\c!next...}
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \dowritetolist\@@koppeling{}{#2}\v!head
+ \setupheadnumber[#1][-1]% traag, wordt \getvalue{\c!previous...}
+ \egroup
+ \fi}
+
+\let\previoussectionformat\empty
+\let\currentsectionformat \empty
+
+\let\updatelistreferences \relax
+\let\updatedlistreferences\empty
+
+\def\setsectionlistreference#1#2%
+ {\ifnum\countervalue{\??se\previoussection{#1}}>0\relax
+ \xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}%
+ \else
+ \globallet\previoussectionformat\empty
+ \fi
+ \xdef\currentsectionformat{\@@longformatnumber{#1}}}
+
+\def\startlistreferences#1%
+ {\thisissomeinternal{\s!lst}{#1\currentsectionformat}%
+ \setxvalue{\s!lst:#1}{\realfolio}% to be sure
+ \setxvalue{\s!lst:#1\currentsectionformat}{\realfolio}%
+ \setxvalue{\e!previouslocal#1}{\s!lst:#1\previoussectionformat}%
+ \setxvalue{\e!currentlocal#1}{\s!lst:#1\currentsectionformat}%
+ \doifelse{\currentsectionformat}{}
+ {\setglobalcrossreference
+ {\e!previous#1}{}{\realfolio}{}}
+ {\setglobalsystemreference\rt!list
+ {\e!previous#1}{\getvalue{\e!previouslocal#1}}}%
+ \def\stoplistreferences{\dostoplistreferences{#1}}}
+
+\def\dostoplistreferences#1%
+ {\ifutilitydone
+ \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
+ \globallet\updatedlistreferences\updatedlistreferences % een noodverbandje
+ \gdef\updatelistreferences%
+ {\def\docommand####1%
+ {\setglobalsystemreference\rt!list
+ {\e!previous####1}{\getvalue{\e!currentlocal####1}}}%
+ \processcommacommand[\updatedlistreferences]\docommand
+ \globallet\updatelistreferences\relax
+ \globallet\updatedlistreferences\empty}%
+ \fi}
+
+\let\stoplistreferences\relax
+
+\appendtoks
+ \updatelistreferences
+\to\aftereverypage
+
+% \prevdepth\strutdp % is belangrijk, vergelijk naast elkaar:
+%
+% \subject{test} \input tufte
+% \subject{test} \strut \input tufte
+% \subject{test} \placelist[...]
+
+% todo: kap
+
+% to be documented: \placeheadtext \placeheadnumber
+
+\unexpanded\def\placeheadtext
+ {\doquintupleempty\doplaceheadtextornumber
+ [\c!textstyle][\c!textcolor][\empty]}
+
+\unexpanded\def\placeheadnumber
+ {\doquintupleempty\doplaceheadtextornumber
+ [\c!numberstyle][\c!numbercolor][\v!number]}
+
+\def\doplaceheadtextornumber[#1][#2][#3][#4][#5]%
+ {\bgroup
+ \edef\@@sectie{\??ko\iffifthargument#5\else#4\fi}%
+ \dostartattributes\@@sectie\c!style\c!color\empty
+ \dontconvertfont
+ \dostartattributes\@@sectie{#1}{#2}\empty
+ \setupinterlinespace
+ \begstrut\getmarking[\mainmarking{#4#3}]\endstrut
+ \endgraf
+ \dostopattributes
+ \dostopattributes
+ \egroup}
+
+\chardef\headtimingmode=0
+
+% \chardef\headtimingmode=1 % 0 also works ok now too
+%
+% Martin Kolarik's problem:
+%
+% \setuphead[section][command=\doTitle]
+%
+% \def\doTitle#1#2%
+% {\ruledvbox{\forgetall \hsize=4cm
+% \ruledhbox{\ruledvtop{#1}\ruledvtop{#2}}}}
+%
+% \section{test test test test test test test test test test
+% test test test test test test test}
+
+\newevery \everyheadstart \relax
+
+\def\placeheadmargintexts#1%
+ {\the\everyheadstart
+ \doifvalue{\??ko#1\c!margintext}\v!yes\placemargincontent}
+
+\def\doplaceheadtext#1#2#3#4%
+ {\beginheadplacement{#1}%
+ \ifemptyhead % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
+ {\headnumbercontentfalse
+ \resetsystemmode\v!sectionnumber
+ #2}%
+ \makestrutofbox0
+ \else % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
+ {\headnumbercontentfalse
+ \resetsystemmode\v!sectionnumber
+ % less interfering
+ \ifcase\headtimingmode\or#2\fi
+ % outerside font determines distance
+ \dosetfontattribute{\??ko#1}\c!style
+ % but we don't want color to influence user commands
+ % todo: get the if-else out of it
+ \getvalue{\??ko#1\c!command}
+ {} % no number
+ {\dostartattributes{\??ko#1}\c!style\c!color\empty
+ \dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
+ \dontconvertfont
+ \ifdisplaysectionhead
+ \setupinterlinespace
+ \else
+ \setupspacing
+ \fi
+ % \ifcase\headtimingmode#2\fi % can introduce cr
+ \getvalue{\??ko#1\c!commandbefore}%
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
+ {\setstrut
+ \begstrut
+ \ifcase\headtimingmode\hbox{#2}\fi
+ \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}%
+ \endstrut}% \hbox prevents break
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdepth
+ \else
+ \ifcase\headtimingmode#2\fi
+ \getvalue{\??ko#1\c!textcommand}%
+ {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}}%
+ \fi
+ \getvalue{\??ko#1\c!commandafter}%
+ \ifdisplaysectionhead\endgraf\fi
+ \dostopattributes
+ \dostopattributes}}%
+ \fi
+ \endheadplacement{#1}{#4}}
+
+\def\doplaceheadnumbertext#1#2#3#4#5% maybe move modes outside box
+ {\beginheadplacement{#1}%
+ \ifemptyhead % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
+ {\doiftextelse{#3}
+ {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
+ {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
+ #2}%
+ \makestrutofbox0
+ \else % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
+ {\doiftextelse{#3}
+ {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
+ {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
+ % less interfering
+ \ifcase\headtimingmode\or#2\fi
+ % outerside font determines distance
+ \dosetfontattribute{\??ko#1}\c!style
+ % but we don't want color to influence user commands
+ \getvalue{\??ko#1\c!command}%
+ {\dostartattributes{\??ko#1}\c!style\c!color\empty
+ \dostartattributes{\??ko#1}\c!numberstyle\c!numbercolor\empty
+ % \getvalue{\??ko#1\c!commandbefore}% strange, why here? moved 21/11/2005
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ % can be nilled with \setnostrut
+ \getvalue{\??ko#1\c!numbercommand}%
+ {\setstrut
+ \begstrut
+ \executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}%
+ \endstrut}%
+ \else
+ \getvalue{\??ko#1\c!numbercommand}%
+ {\executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}}%
+ \fi
+ \dostopattributes
+ \dostopattributes}
+ {\dostartattributes{\??ko#1}\c!style\c!color\empty
+ \dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
+ \dontconvertfont
+ \ifdisplaysectionhead
+ \setupinterlinespace
+ \else
+ \setupspacing
+ \fi
+ % \ifcase\headtimingmode#2\fi % can introduce cr
+ \getvalue{\??ko#1\c!commandbefore}% makes more sense here
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
+ {\setstrut
+ \begstrut
+ \ifcase\headtimingmode\hbox{#2}\fi
+ \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}%
+ \endstrut}% \hbox prevents break
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdepth
+ \else
+ \ifcase\headtimingmode#2\fi % inside textcommand ?
+ \getvalue{\??ko#1\c!textcommand}%
+ {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}}%
+ \fi
+ \getvalue{\??ko#1\c!commandafter}%
+ \ifdisplaysectionhead\endgraf\fi
+ \dostopattributes
+ \dostopattributes}}%
+ \fi
+ \endheadplacement{#1}{#5}}
+
+%D \starttyping
+%D \def\StretchedBox#1%
+%D {\framed
+%D [frame=off,offset=.5em,align=middle,width=broad]
+%D {\sc\def\stretchedspaceamount{.3em}\stretchednormalcase{#1}}}
+%D
+%D \definehead[MySubject][subject]
+%D \setuphead [MySubject][deeptextcommand=\StretchedBox]
+%D
+%D \MySubject{feeling stretched feeling stretched feeling stretched feeling stretched}
+%D \stoptyping
+
+\newsignal\headsignal
+\let\headlastlinewidth\!!zeropoint
+
+\def\beginheadplacement#1%
+ {\bgroup
+ \setsystemmode{#1}% to be documented
+ \ifgridsnapping\iftracegridsnapping\showstruts\fi\fi
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdp
+ \everypar\emptytoks % needed indeed
+ \noindent % ipv \whitespace elders, na \forgetall !
+ \bgroup
+ \doifinsetelse{\getvalue{\??ko#1\c!aligntitle}}{\v!yes,\v!float}% new
+ {\skip0 1\leftskip
+ \skip2 1\rightskip
+ \xdef\localheadskip{\the\skip0}%
+ \forgetall
+ \leftskip\skip0
+ \rightskip\skip2
+ \setlocalhsize\hsize\localhsize
+ \forgetbothskips}
+ {\globallet\localheadskip\!!zeropoint
+ \forgetall}%
+ \dontcomplain
+ \postponefootnotes
+ \iflocation\ifdisplaysectionhead\else\noninterferingmarks\fi\fi
+ \resetinteractionparameter\c!style
+ \resetinteractionparameter\c!color
+ \resetinteractionparameter\c!contrastcolor
+ \strictouterreferencestrue % tzt instelling
+ \def\localheadsetup{\dolocalheadsetup{#1}}%
+ \startsynchronization}
+
+% \setuphead[chapter] [style=\bfd,after=,hang=line] % fit broad 2
+% \setuphead[section] [style=\bfc,after=,hang=line]
+% \setuphead[subsection] [style=\bfb,after=,hang=line]
+% \setuphead[subsubsection] [style=\bfa,after=,hang=line]
+% \setuphead[subsubsubsection][style=\bf ,after=,hang=line]
+%
+% \chapter {Test} \input tufte \page
+% \section {Test} \input tufte \page
+% \subsection {Test} \input tufte \page
+% \subsubsection {Test} \input tufte \page
+% \subsubsubsection{Test} \input tufte \page
+%
+% \chapter {Test\\Test} \input tufte \page
+% \section {Test\\Test} \input tufte \page
+% \subsection {Test\\Test} \input tufte \page
+% \subsubsection {Test\\Test} \input tufte \page
+% \subsubsubsection{Test\\Test} \input tufte \page
+
+\def\hangheadplacement
+ {\scratchdimen\localheadlineheight
+ \bgroup
+ \openlineheight\scratchdimen
+ \scratchdimen\ht0
+ \advance\scratchdimen\dp0
+ \getnoflines\scratchdimen
+ \advance\noflines\minusone
+ \expanded{\egroup\noflines\the\noflines}% brrr
+ \setbox0\hbox{\lower\noflines\scratchdimen\box0}%
+ \scratchdimen\ht0
+ \advance\scratchdimen\dp0
+ \advance\scratchdimen-\localheadheight
+ \advance\scratchdimen+\strutdp
+ \ht0 \strutht
+ \dp0 \strutdp
+ \edef\localheaddepth{\the\strutdp}}
+
+\newconditional\continuoussectionhead % oeps, \newif\ifcontinuoushead got lost
+
+\def\endheadplacement#1#2%
+ {\doifelsevalue{\??rf#1\c!state}\v!start
+ {\doifvaluenothing{\??ko#1\c!file}{\autocrossdocumentfalse}}
+ {\autocrossdocumentfalse}%
+ % no message needed here, should be a proper switch
+ \noflines\zerocount
+ \ifdisplaysectionhead
+ % new (tod tight == one following line up)
+ \processaction
+ [\getvalue{\??ko#1\c!hang}]
+ [ \v!line=>\hangheadplacement\noflines\zerocount,
+ \v!broad=>\hangheadplacement\getnoflines\scratchdimen,
+ \v!fit=>\hangheadplacement\getrawnoflines\scratchdimen,
+ \v!none=>\noflines\zerocount,
+ \v!default=>\noflines\zerocount,
+ \v!unknown=>\hangheadplacement\noflines0\commalistelement\advance\noflines\minusone]%
+ % so far
+ \let\headlastlinewidth\!!zeropoint
+ \snaptogrid[\getvalue{\??ko#1\c!grid}]\hbox
+ {\hskip\localheadskip
+ \hskip\getvalue{\??ko#1\c!margin}\relax
+ \iflocation
+ \ifautocrossdocument
+ \doifreferencefoundelse{\getvalue{\??ko#1\c!file}::#1}
+ {\edef\currentinnerreference{\s!aut:\currenttextreference}% stored in
+ \gotoouterlocation{}{\box0}} % text slot
+ {\hbox{\box0}}%
+ \else
+ \hbox{\box0}%
+ \fi
+ \else
+ \hbox{\box0}%
+ \fi}%
+ \doflushnotes % new, not really needed
+ \endgraf
+ \ifvmode
+ \ifnum\noflines>\zerocount
+ \dorecurse\noflines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}%
+ \fi
+ \nointerlineskip
+ \dosomebreak\nobreak
+ \fi
+ #2%
+ \else
+ \strut
+ \doflushnotes % new, here since we're in par mode
+ \iflocation
+ \ifautocrossdocument
+ \hhboxindent=\ifconditional\continuoussectionhead\headlastlinewidth\else\zeropoint\fi
+ \unhhbox0\with{\gotobox{\box\hhbox}[\getvalue{\??ko#1\c!file}::#1]}%
+ \advance\lasthhboxwidth by \numberheaddistance
+ \xdef\headlastlinewidth{\the\lasthhboxwidth}%
+ \else
+ \unhbox0
+ \globallet\headlastlinewidth\!!zeropoint
+ \fi
+ \else
+ \unhbox0
+ \globallet\headlastlinewidth\!!zeropoint
+ \fi
+ #2%
+ \dimen0=\numberheaddistance
+ \hskip\dimen0 \!!plus \dimen0 \!!minus .25\dimen0
+ \hskip\headsignal\ignorespaces
+ \fi
+ \ifdisplaysectionhead \ifvmode
+ \ifgridsnapping % important, font related depth, see comment
+ \prevdepth\strutdp
+ \else
+ \prevdepth\localheaddepth
+ \fi
+ \fi \fi
+ \stopsynchronization
+ \egroup
+ \egroup
+ \ifdisplaysectionhead
+ \dochecknextindentation{\??ko#1}%
+ \else
+ \nonoindentation % recently added, was a bug
+ \fi}
+
+\def\checknexthead#1#2% nog optioneel
+ {\ifhmode
+ \scratchcounter=\lastpenalty\unpenalty % no beauty in this
+ \ifdim\lastskip=\headsignal
+ \handlenopagebreak{#1}%
+ \global\settrue\continuoussectionhead
+ \else
+ \penalty\scratchcounter
+ \global\setfalse\continuoussectionhead
+ #1{#2}%
+ \fi
+ \else
+ \global\setfalse\continuoussectionhead
+ #1{#2}%
+ \fi}
+
+\def\dosetupheadnumber[#1][#2#3]% todo: = (don't reset)
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \doifinstringelse{#2}{+-}
+ {\doifelsenothing{#3}
+ {\@@nextsectionnumber\@@sectie}
+ {\!!counta=#2#3\relax
+ \advance\!!counta \@@sectionvalue\@@sectie
+ \@@setsectionnumber\@@sectie\!!counta}}
+ {\@@setsectionnumber\@@sectie{#2#3}}%
+ \egroup}
+
+\def\setupheadnumber
+ {\dodoubleargument\dosetupheadnumber}
+
+\def\currentheadnumber{0}
+
+\def\determineheadnumber[#1]%
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
+ \egroup}
+
+\def\complexheadnumber[#1]%
+ {\bgroup
+ \edef\currentheadnumber{#1}%
+ \doifinsetelse{-}{#1} % br undocumented
+ {\removefromcommalist{-}\currentheadnumber % br
+ \setsectieenkoppeling\currentheadnumber
+ \setupsection[\@@sectie][\c!previousnumber=\v!no]}%
+ {\setsectieenkoppeling\currentheadnumber}%
+ \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
+ \doifnot{\currentheadnumber}{0}{\finalsectionnumber}%
+ \egroup}
+
+\def\simpleheadnumber
+ {\currentheadnumber}
+
+\definecomplexorsimple\headnumber
+
+\def\alinea
+ {\par}
+
+% nice testcase
+%
+% \setupheads[aligntitle=yes]
+%
+% \startnarrower
+% \subject{\dorecurse{100}{x }}
+% \section{\dorecurse{100}{x }}
+% \input tufte \par
+% \setupheads[alternative=inmargin]
+% \subject{\dorecurse{100}{x }}
+% \section{\dorecurse{100}{x }}
+% \input tufte \par
+% \stopnarrower
+
+\let\numberheadalternative\v!normal
+
+\def\defineheadplacement
+ {\dodoubleargument\dodefineheadplacement}
+
+\def\dodefineheadplacement[#1][#2]% #3#4
+ {\setvalue{\??ko:#1}{#2}%
+ \setvalue{\??ko::#1}}
+
+\def\normalplacehead
+ {\executeifdefined
+ {\??ko::\numberheadalternative}
+ {\getvalue{\??ko::\v!normal}}}
+
+\defineheadplacement[\v!paragraph][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut\ifheadnumbercontent#1\hskip\numberheaddistance\fi#2}}
+
+% \defineheadplacement[\v!normal][\v!vertical]#1#2%
+% {\ifheadnumbercontent
+% \setbox0\hbox{{#1}\hskip\numberheaddistance}%
+% \vbox
+% {\localheadsetup
+% \hangindent 1\wd0
+% \hangafter 1
+% \noindent
+% \unhbox0 % don't use \strut's here!
+% #2}%
+% \else
+% \vbox
+% {\localheadsetup\noindent#2}%
+% \fi}
+%
+% enhanced version:
+
+% \setuphead
+% [chapter]
+% [numberwidth=2cm,hang=line,after={\blank[3*line]}]
+%
+% \chapter{Oeps oeps oeps} \input tufte \section{Oeps}
+% \chapter{Oeps oeps oeps} \section{Oeps} \input tufte
+
+\defineheadplacement[\v!normal][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \edef\headwidth {\headparameter\c!width }%
+ \edef\headnumberwidth{\headparameter\c!numberwidth}%
+ \edef\headtextwidth {\headparameter\c!textwidth }%
+ \ifheadnumbercontent
+ \ifx\headwidth\empty
+ \else
+ \ifx\headnumberwidth\empty
+ \ifx\headtextwidth\empty\else
+ \edef\headnumberwidth{\the\dimexpr\headwidth-\headtextwidth\relax}%
+ \fi
+ \else
+ \ifx\headtextwidth\empty
+ \edef\headtextwidth{\the\dimexpr\headwidth-\headnumberwidth\relax}%
+ \fi
+ \fi
+ \hsize\headwidth
+ \fi
+ \ifx\headnumberwidth\empty\else
+ \let\numberheaddistance\!!zeropoint
+ \fi
+ \setbox\scratchbox\hbox \ifx\headnumberwidth\empty\else to \headnumberwidth\fi{{#1}}%
+ \scratchdimen\dimexpr\wd\scratchbox+\numberheaddistance\relax
+ \ifx\headtextwidth\empty\else
+ \hsize\dimexpr\scratchdimen+\headparameter\c!textwidth\relax
+ \fi
+ \hangindent\scratchdimen
+ \hangafter \plusone
+ \noindent
+ \box\scratchbox\hskip\numberheaddistance
+ \else
+ \ifx\headtextwidth\empty
+ \ifx\headwidth\empty
+ \else
+ \hsize\headwidth
+ \fi
+ \else
+ \hsize\headtextwidth
+ \fi
+ \noindent
+ \fi
+ #2}}
+
+\def\placeheadmargin#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut % use one \strut here!
+ \dontleavehmode % in case there is no strut, else side effects with llap
+ \ifheadnumbercontent
+ \llap{\hbox to 5em{\hfill{#1}\hskip\localheadskip\hskip\leftmargindistance}}% introduces whitespace
+ % maybe better:
+ % \inleftmargin{\hbox{\hss{#1}\hskip\localheadskip}}%
+ \fi
+ {#2}}}
+
+\defineheadplacement[\v!inmargin][\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
+\defineheadplacement[\v!margin] [\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
+
+\defineheadplacement[\v!middle][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \veryraggedcenter
+ \let\\\endgraf
+ \let\crlf\endgraf
+ \ifheadnumbercontent\strut#1\par\fi\begstrut#2}}
+
+\defineheadplacement[\v!text][\v!horizontal]#1#2%
+ {\bgroup
+ \localheadsetup % no stretch in distance
+ \ifheadnumbercontent{#1}\kern\numberheaddistance\fi{\begstrut#2}%
+ \egroup}
+
+\def\placeheadlohi#1#2#3%
+ {\ifheadnumbercontent
+ \setbox0\hbox{#2}
+ \setbox2=#1{\localheadsetup\advance\hsize-\wd0\relax#3}%
+ \hbox{\box0\hskip\numberheaddistance\box2}%
+ \else
+ #1{\localheadsetup\noindent#3}%
+ \fi}
+
+% onder/boven lijnt het nummer op de onderste/bovenste regel
+% uit van een meerregelige kop
+
+\defineheadplacement[\v!bottom][\v!vertical]#1#2{\placeheadlohi\vbox{#1}{#2}}
+\defineheadplacement[\v!top] [\v!vertical]#1#2{\placeheadlohi\vtop{#1}{#2}}
+
+% default == instellingen
+% koppeling == koppen, breaks, marks, enz.
+% sectie == nummering
+
+\let\@@kolist=\empty
+
+\def\dododefinehead#1#2% % don't preset prefix to much
+ {\presetlabeltext[#1=]%
+ \getparameters
+ [\??ko#1]
+ [\c!numberstyle=\getvalue{\??ko#1\c!style},
+ \c!textstyle=\getvalue{\??ko#1\c!style},
+ \c!numbercolor=\getvalue{\??ko#1\c!color},
+ \c!textcolor=\getvalue{\??ko#1\c!color}]%
+ % deeptextcommand and deepnumbercommand are left undefined !
+ \doifassignmentelse{#2}
+ {\getparameters
+ [\??ko#1]
+ [\c!section=\getvalue{\??ko\getvalue{\??ko#1\c!coupling}\c!section},
+ \c!default=,
+ \c!coupling=,
+ \c!prefix=,
+ \c!before=,
+ \c!after=,
+ \c!distance=\!!zeropoint,
+ \c!page=,
+ \c!header=,
+ \c!text=,
+ \c!footer=,
+ \c!style=,
+ \c!numbercommand=,
+ \c!textcommand=,
+ \c!ownnumber=\v!no,
+ \c!number=\v!yes,
+ \c!color=,
+ \c!continue=\v!yes,
+ \c!placehead=\v!yes,
+ \c!resetnumber=\v!yes,
+ \c!incrementnumber=\v!yes,
+ \c!alternative=\@@koalternative,
+ \c!command=\normalplacehead,
+ \c!separator=\@@koseparator,
+ \c!stopper=\@@kostopper,
+ \c!align=\@@koalign,
+ \c!aligntitle=\@@koaligntitle,
+ \c!tolerance=\@@kotolerance,
+ \c!indentnext=\@@koindentnext,
+ \c!strut=\@@kostrut,
+ \c!hang=\@@kohang,
+ \c!file=,
+ \c!expansion=,
+ \c!grid=,
+ \c!margintext=,
+ \c!margin=\@@komargin,
+ #2]%
+ \ConvertToConstant\doifnot{#1}{\getvalue{\??ko#1\c!default}}
+ {\doifsomething{\getvalue{\??ko#1\c!default}}
+ {\copyparameters
+ [\??ko#1][\??ko\getvalue{\??ko#1\c!default}]
+ [\c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
+ \c!header,\c!text,\c!footer,\c!separator,\c!stopper,\c!resetnumber,
+ \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
+ \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
+ % new per 20/03/3002 (o-pbu-l) / was too confusing
+ % \c!numberstyle,\c!textstyle,\c!expansion,
+ % again too confusing
+ \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
+ \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]}}%
+ \getparameters[\??ko#1][#2]%
+ \doifsomething{\getvalue{\??ko#1\c!section}}
+ {\doifelsemarking{#1}% \doifundefined{\??mk#1}
+ {}% marking #1 already defined
+ {\definemarking[#1]%
+ \couplemarking[#1][\getvalue{\??ko#1\c!section}]%
+ \definemarking[#1\v!number]%
+ \couplemarking[#1\v!number][\getvalue{\??ko#1\c!section}]}}%
+ \doifundefined{\??li#1}{\definelist[#1]}}
+ {\ConvertToConstant\doifelse{#1}{#2}
+ {\doifundefined{\??li#1}{\definelist[#1]}}
+ {\copyparameters
+ [\??ko#1][\??ko#2]
+ [\c!level,\c!section,\c!coupling,\c!prefix,
+ \c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
+ \c!separator,\c!stopper,
+ \c!header,\c!text,\c!footer,\c!resetnumber,
+ \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
+ \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
+ % new per 20/03/3002 (o-pbu-l) / was too confusing
+ % \c!numberstyle,\c!textstyle,\c!expansion,
+ % again too confusing
+ \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
+ \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]%
+ \getparameters[\??ko#1][\c!expansion=]% iig een value, rather fuzzy
+ \definemarking[#1][#2]%
+ \definemarking[#1\v!number][#2\v!number]%
+ \doifundefined{\??li#1}{\definelist[#1][#2]}}}%
+ \addtocommalist{#1}\@@kolist
+ \setevalue{\??sk#1}{\getvalue{\??ko#1\c!coupling}}%
+ \setevalue{\??by#1}{\getvalue{\??ko#1\c!section}}%
+ \setevalue{\??by\v!by#1}{\getvalue{\??ko#1\c!section}}%
+ \setvalue{#1}{\dodoubleempty\doconstructhead[#1]}}
+
+\def\dodefinehead[#1][#2]%
+ {\doifelsenothing{#2}
+ {% todo: message that it's an invalid definition
+ \setvalue{#1}{\endgraf[#1]\kern.5em}}
+ {\doifassignmentelse{#2}
+ {\dododefinehead{#1}{#2}}
+ {\doifdefined{\??ko#2\c!section}
+ {\dododefinehead{#1}{#2}}}}}
+
+\def\definehead
+ {\dodoubleemptywithset\dodefinehead}
+
+\def\doconstructhead[#1][#2]%
+ {\dowithpargument{\dodoconstructhead{#1}[#2]}}
+
+\def\dosetuphead[#1][#2]%
+ {\getparameters[\??ko#1][#2]%
+ % The next check prevents hard to trace problems. I once
+ % set \c!command to nothing and (quite natural) got the
+ % wrong references etc. The whole bunch should be boxed!
+ \expandafter\defconvertedcommand\expandafter\ascii\csname\??ko#1\c!command\endcsname
+ \doifnothing\ascii{\setvalue{\??ko#1\c!command}{\normalplacehead}}}
+
+\def\setuphead
+ {\dodoubleargumentwithset\dosetuphead}
+
+\def\dosetupheads[#1]%
+ {\getparameters[\??ko][#1]%
+ \doifelse{\@@kosectionnumber}\v!yes\sectionnumbertrue\sectionnumberfalse}
+
+\def\setupheads
+ {\dosingleargument\dosetupheads}
+
+\def\systemsuppliedchapter {\getvalue{\v!chapter}}
+\def\systemsuppliedtitle {\getvalue{\v!title}}
+
+% a left over
+
+\def\complexbijlage[#1]#2%
+ {\page[\v!right]
+ \setuppagenumbering[\c!state=\v!stop]
+ \systemsuppliedchapter[#1]{#2}
+ \page[\v!right]
+ \setuppagenumbering[\c!state=\v!start]
+ \setuppagenumbering[\c!number=1]}
+
+\setvalue{\v!appendix}%
+ {\complexorsimpleempty\bijlage}
+
+\setupheads
+ [\c!alternative=\v!normal,
+ \c!sectionnumber=\v!yes,
+ \c!separator=.,
+ \c!stopper=,
+ \c!limittext=\v!yes,
+ \c!align=,
+ \c!aligntitle=,
+ \c!tolerance=,
+ \c!strut=,
+ \c!indentnext=\v!no,
+ \c!margin=\zeropoint,
+ \c!hang=\v!none,
+ \c!command=]
+
+\definesectionblock [\v!frontpart] [\v!frontmatter] [\c!number=\v!no]
+\definesectionblock [\v!bodypart] [\v!bodymatter] [\c!number=\v!yes]
+\definesectionblock [\v!appendix] [\v!appendices] [\c!number=\v!yes]
+\definesectionblock [\v!backpart] [\v!backmatter] [\c!number=\v!no]
+
+\definesection[\s!section-1] % part
+\definesection[\s!section-2] % chapter
+\definesection[\s!section-3] % section
+\definesection[\s!section-4] % subsection
+\definesection[\s!section-5] % subsubsection
+\definesection[\s!section-6] % subsubsubsection
+\definesection[\s!section-7] % subsubsubsubsection
+
+% \c!eigennummer ook hier?
+
+\definehead
+ [\v!part]
+ [\c!section=\s!section-1,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!chapter]
+ [\c!section=\s!section-2,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!section]
+ [\c!section=\s!section-3,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsection]
+ [\c!section=\s!section-4,
+ \c!default=\v!section,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsection]
+ [\c!section=\s!section-5,
+ \c!default=\v!subsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsection]
+ [\c!section=\s!section-6,
+ \c!default=\v!subsubsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsection]
+ [\c!section=\s!section-7,
+ \c!default=\v!subsubsubsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!title]
+ [\c!coupling=\v!chapter,
+ \c!default=\v!chapter,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subject]
+ [\c!coupling=\v!section,
+ \c!default=\v!section,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubject]
+ [\c!coupling=\v!subsection,
+ \c!default=\v!subsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubject]
+ [\c!coupling=\v!subsubsection,
+ \c!default=\v!subsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubject]
+ [\c!coupling=\v!subsubsubsection,
+ \c!default=\v!subsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsection,
+ \c!default=\v!subsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\setupsection
+ [\s!section-2]
+ [\v!appendix\c!conversion=\v!Character,
+ \c!previousnumber=\v!no]
+
+\setuphead
+ [\v!part]
+ [\c!placehead=\v!no]
+
+\setuphead
+ [\v!chapter]
+ [\v!appendix\c!label=\v!appendix,
+ \v!bodypart\c!label=\v!chapter] % bijlageconversie=\Character
+
+\setuphead
+ [\v!section]
+ [\v!appendix\c!label=\v!section,
+ \v!bodypart\c!label=\v!section] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsection]
+ [\v!appendix\c!label=\v!subsection,
+ \v!bodypart\c!label=\v!subsection] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsubsection]
+ [\v!appendix\c!label=\v!subsubsection,
+ \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character
+
+\setuphead
+ [\v!part,\v!chapter]
+ [%\c!align=,
+ %\c!indentnext=\v!no,
+ \c!continue=\v!no,
+ \c!page=\v!right,
+ \c!header=,
+ \c!style=\tfc,
+ \c!distance=.75em,
+ \c!before={\blank[2*\v!big]},
+ \c!after={\blank[2*\v!big]}]
+
+\setuphead
+ [\v!section]
+ [%\c!align=,
+ %\c!indentnext=\v!no,
+ \c!style=\tfa,
+ \c!distance=.75em,
+ \c!before={\blank[2*\v!big]},
+ \c!after=\blank]
+
+\setuphead % nieuw
+ [\v!subsection]
+ [\c!page=]
+
+\definecombinedlist
+ [\v!content]
+ [\v!part,
+ \v!chapter,
+ \v!section,
+ \v!subsection,
+ \v!subsubsection,
+ \v!subsubsubsection,
+ \v!subsubsubsubsection]
+ [\c!level=\v!subsubsubsubsection,
+ \c!criterium=\v!local]
+
+\setuplist
+ [\v!part]
+ [\c!before={\blank\page[\v!preference]},
+ \c!after=\blank,
+ \c!label=\v!yes,
+ \c!separator=:,
+ \c!distance=1em]
+
+\setuplist
+ [\v!chapter]
+ [\c!before={\blank\page[\v!preference]},
+ \c!after=]
+
+\setuplist [\v!part] [\c!width=0em]
+\setuplist [\v!chapter] [\c!width=2em]
+\setuplist [\v!section] [\c!width=3em]
+\setuplist [\v!subsection] [\c!width=4em]
+\setuplist [\v!subsubsection] [\c!width=5em]
+\setuplist [\v!subsubsubsection] [\c!width=6em]
+\setuplist [\v!subsubsubsubsection] [\c!width=7em]
+
+% hm
+
+\setuppagenumbering % na instellen hoofdteksten !
+ [\c!alternative=\v!singlesided,
+ \c!location={\v!header,\v!middle},
+ \c!conversion=\v!numbers,
+ \c!width=, % in geval van \v!marginedge
+ \c!left=,
+ \c!right=,
+ \c!way=\v!by\v!part,
+ \c!text=,
+ \v!chapter\v!number=\v!no, % v
+ \v!part\v!number=\v!yes, % v
+ \c!numberseparator=--,
+ \c!textseparator=\tfskip,
+ \c!state=\v!start,
+ \c!command=,
+ \c!strut=\v!yes, % nieuw
+ \c!style=, % \v!normal, % empty, otherwise conflict
+ \c!color=]
+
+\protect \endinput
diff --git a/tex/context/base/core-sec.mkiv b/tex/context/base/core-sec.mkiv
new file mode 100644
index 000000000..fdab75bc8
--- /dev/null
+++ b/tex/context/base/core-sec.mkiv
@@ -0,0 +1,2621 @@
+%D \module
+%D [ file=core-sec,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Sectioning,
+%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.
+
+% start-stop per section en dan combineren met sectieblok; in dat geval
+% eenvoudiger per-* acties
+
+% nummeren per sectieblok implementeren
+
+% this module needs a clean up, currently some manipulations
+% take place multiple times; also, some clever recursive level
+% thing makes more sense
+
+% in manual (zie prikkels) : tussen=\blanko is enige hook om
+% met kop-in-hoofd een spatiering af te dwingen
+
+\writestatus{loading}{Context Core Macros / Sectioning}
+
+\startmessages dutch library: structures
+ title: structuur
+ 1: begin van sectieblok --
+ 2: eind van sectieblok --
+\stopmessages
+
+\startmessages english library: structures
+ title: structure
+ 1: begin of sectionblock --
+ 2: end of sectionblock --
+\stopmessages
+
+\startmessages german library: structures
+ title: struktur
+ 1: Begin des Abschnittsblocks --
+ 2: Ende des Abschnittsblocks --
+\stopmessages
+
+\startmessages czech library: structures
+ title: struktury
+ 1: zacatek oddilu (sekce) --
+ 2: konec oddilu (sekce) --
+\stopmessages
+
+\startmessages italian library: structures
+ title: struttura
+ 1: inizio del blocco (sezione) --
+ 2: fine del blocco (sezione) --
+\stopmessages
+
+\startmessages norwegian library: structures
+ title: struktur
+ 1: starten av blokk -- (seksjon)
+ 2: slutten av blokk -- (seksjon)
+\stopmessages
+
+\startmessages romanian library: structures
+ title: structuri
+ 1: inceput de bloc sectiune --
+ 2: sfarsit de bloc sectiune --
+\stopmessages
+
+\startmessages french library: structures
+ title: structure
+ 1: début de blocsection --
+ 2: fin de blocsection --
+\stopmessages
+
+\unprotect
+
+% new and to be tested
+
+\unexpanded\def\separatorlist#1%
+ {\ifx\sepnumber\undefined\def\sepnumber{0}\fi
+ \increment\sepnumber
+ \getfromcommacommand[#1][\sepnumber]%
+ \ifx\commalistelement\empty
+ \getcommalistsize[#1]%
+ \def\sepnumber{\number\commalistsize}%
+ \getfromcommacommand[#1][\sepnumber]%
+ \fi
+ \commalistelement}
+
+% \setuphead[section] [separator=\separatorlist{?,!,*}]
+% \setuphead[subsection][separator=\separatorlist{??,!!,**}]
+%
+% \let\spr\separatorlist % this will enable this feature
+%
+% \setuphead[section] [separator={?,!,*}]
+% \setuphead[subsection][separator={??,!!,**}]
+%
+% \setupheads[separator={A,B,C,D,E,F}]
+% \chapter{test}
+% \section{test} \subsection{test} \subsection{test}
+% \section{test} \subsection{test} \subsection{test}
+
+% from now on, internaly numbers are separated by a period
+% and postprocessed on demand; this will change to {} {} {}
+
+\def\numberseparator {.} % reasonable default
+\def\sectionseparator{-} % was : but is now -
+
+\def\@@filterfirstpart [#1--#2]{#1}
+\def\@@filtersecondpart [#1--#2]{#2}
+
+\def\@@filterblockpart [#1--#2--#3]{#1}
+\def\@@filternumberpart [#1--#2--#3]{#2}
+\def\@@filterpagepart [#1--#2--#3]{#3}
+\def\@@filterblocknumberpart[#1--#2--#3]{#1--#2}
+
+\def\@@filterheadpart[#1]{\@EA\@@dofilterheadpart\@EA[#1-0]}
+\def\@@filtertailpart[#1]{\@EA\@@dofiltertailpart\@EA[#1-0]}
+
+\def\@@dofilterheadpart[#1-#2]{#1}
+\def\@@dofiltertailpart[#1-#2]{#2}
+
+\def\@@filterlevelpart[#1--#2--#3]{\@@dofilterlevelpart[#2-0-0-0-0]}
+
+\def\@@dofilterlevelpart[#1-0-0-0-#2]{#1}
+
+\def\gobbleuntilrelax#1\relax{}
+
+\def\separatednumber #1{\doseparatednumber #1.\empty\relax}
+\def\removefirstprefix#1{\doremovefirstprefix#1.\empty\relax}
+\def\removeallprefixes#1{\doremoveallprefixes#1.\empty\relax}
+
+\def\doseparatednumber#1.#2%
+ {#1%
+ \ifx#2\empty
+ \@EA\gobbleuntilrelax
+ \else \numberseparator
+ \@EA\doseparatednumber
+ \fi#2}
+
+\def\doremoveallprefixes#1.#2%
+ {\ifx#2\empty
+ #1\@EA\gobbleuntilrelax
+ \else
+ \@EA\doremoveallprefixes
+ \fi#2}
+
+\def\doremovefirstprefix#1.#2%
+ {\ifx#2\empty
+ #1\@EA\gobbleuntilrelax
+ \else
+ \@EA\noremovefirstprefix
+ \fi#2}
+
+\def\noremovefirstprefix#1.\empty\relax
+ {#1}
+
+% we need to expand in order to get something separatable
+
+\def\dohandleheadnumber#1%
+ {\expanded{\separatednumber{#1}}}
+
+\def\dodochecknumber#1#2#3% will become ugly after speed up
+ {\bgroup
+ \doifinstringelse{.0}{.#2}
+ {\doifnot{#3}\v!by
+ {%\debuggerinfo\m!systems{number #1 #3 becomes \getnumbervariable{#1\c!way}}%
+ \setevalue{\@@thenumber{#1}\c!way}{#3}% geen \xdef, gaat mis met \subpage
+ \dochecknumber{#1}}} % tricky and ugly
+ {\doifnotvalue{\@@thenumber{#1}\s!check}{#2}
+ {% new, calculate accumulated number
+ \scratchcounter\getvalue{\@@thenumber{#1}\c!n}\relax
+ \advance\scratchcounter\countervalue{\@@thenumber{#1}}\relax
+ \setxvalue{\@@thenumber{#1}\c!n}{\the\scratchcounter}%
+ %
+ \setcounter{\@@thenumber{#1}}{0\getvalue{\@@thenumber{#1}\c!start}}%
+ \setxvalue{\@@thenumber{#1}\c!way\c!local}{\getvalue{\@@thenumber{#1}\c!way}}%
+ \setxvalue{\@@thenumber{#1}\s!check}{#2}}}%
+ \egroup}
+
+\def\dochecknumber#1%
+ {\edef\currentsection{\csname\??by\csname\@@thenumber{#1}\c!way\endcsname\endcsname}%
+ \ifx\currentsection\empty\else
+ \dodochecknumber
+ {#1}%
+ {\csname\currentsection\c!number\endcsname}%
+ {\v!by\previoussection\currentsection}%
+ \fi}
+
+\def\checknumber[#1]%
+ {\bgroup
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
+ \fi
+ \dochecknumber{#1}%
+ \egroup}
+
+\def\rawsectionnumber#1%
+ {\countervalue{\??se#1}}
+
+\def\precedingseparator{\@@koseparator} % brrr
+
+\def\domakeprecedingsectionnumber[#1]% will become ugly after speed up
+ {\bgroup % added
+ \globallet\precedingsectionnumber\empty
+ \ifsectionnumber
+ \doifvalue{\??sb\@@sectionblock\c!number}\v!yes % added
+ {\doifelsevalue{\@@thenumber{#1}\c!sectionnumber}\v!yes
+ \donetrue\donefalse
+ \doifvalue{\@@thenumber{#1}\c!sectionnumber}\v!number
+ {\donetrue\let\@@sectionconversion\gobbleoneargument}%
+ \ifdone
+ \edef\currentsection
+ {\getvalue{\??by\getvalue{\@@thenumber{#1}\c!way\c!local}}}%
+ \doifnot\currentsection\zerosection
+ {\doifnot{\@@sectionvalue\currentsection}{0}
+ {\xdef\precedingsectionnumber
+ {\getvalue{\currentsection\c!number}%
+ \spr{\precedingseparator}}}}%
+ \fi}%
+ \fi
+ \egroup}
+
+\def\makeprecedingsectionnumber[#1]%
+ {\bgroup
+ %\ifnum\blocklevel>0
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
+ \fi
+ \domakeprecedingsectionnumber[#1]%
+ \egroup}
+
+% \def\makesectionnumber[#1]%
+% {\makeprecedingsectionnumber[#1]%
+% \xdef\composedsectionnumber%
+% {\precedingsectionnumber\convertednumber[#1]}}%
+%
+% hack needed for chinese and oldstyle in normal tex, will change
+
+\def\makesectionnumber[#1]%
+ {\bgroup
+ \forceunexpanded % i don't like this hack
+ \makeprecedingsectionnumber[#1]%
+ \xdef\composedsectionnumber% was \xdef maar dat gaat fout met font switches
+ {\precedingsectionnumber\convertednumber[#1]}%
+ \egroup}
+
+% \def\preparethenumber#1#2#3% {\??id#1} \number \result
+% {\doifelsevaluenothing{#1\c!separator}
+% {\let\numberseparator\empty
+% \let#3#2}
+% {% was \unexpanded \edef, but we need it unexpanded !
+% \edef\numberseparator{\spr{\getvalue{#1\c!separator}}}%
+% \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
+% {\edef#3%
+% {\@EA\separatednumber\@EA{#2}%
+% }}%\stp{\getvalue{#1\c!stopper}}}}
+% {\edef#3%
+% {\@EA\separatednumber\@EA{#2}%
+% \spr{\getvalue{#1\c!separator}}%
+% \getvalue{#1\c!suffix}%
+% \stp{\getvalue{#1\c!stopper}}}}}}
+%
+% some day we do a real cleanup
+
+\def\analyzenumber#1#2#3% {\??id#1} \(precedingsection)number \result
+ {% was \unexpanded \edef, but we need it unexpanded !
+ \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
+ {\let \numbersuffix \empty}
+ {\edef\numbersuffix{\spr{\getvalue{#1\c!suffix}}}}%
+ \doifelsenothing{\executeifdefined{#1\c!stopper}\empty}
+ {\let \numberstopper \empty}
+ {\edef\numberstopper{\spr{\getvalue{#1\c!stopper}}}}%
+ \doifelsenothing{\executeifdefined{#1\c!separator}\empty}
+ {\let \numberseparator \empty}
+ {\edef\numberseparator{\spr{\getvalue{#1\c!separator}}}}%
+ \let\numberprefix\empty}
+
+\def\preparefullnumber#1#2#3% {\??id#1} \(precedingsection)number \result
+ {\analyzenumber{#1}#2#3%
+ \ifx\numberseparator\empty
+ \edef\numberprefix{#2}%
+ \else
+ \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
+ \fi
+ \ifx\numbersuffix\empty
+ \ifx\numberprefix\empty
+ \let #3\empty
+ \else
+ \edef#3{\numberprefix\numberstopper}%
+ \fi
+ \else
+ \ifx\numberprefix\empty
+ \edef#3{\numbersuffix\numberstopper}%
+ \else
+ \edef#3{\numberprefix\numberseparator\numbersuffix\numberstopper}%
+ \fi
+ \fi}
+
+\def\prepareprefixnumber#1#2#3% {\??id#1} \number \result
+ {\analyzenumber{#1}#2#3%
+ \ifx\numberseparator\empty
+ \edef\numberprefix{#2}%
+ \else
+ \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
+ \fi
+ \let#3\numberprefix}
+
+\def\sectionnumberonly[#1]%
+ {\makesectionnumber[#1]%
+ \composedsectionnumber}
+
+% sectioning
+
+\newcount\nofsections
+
+\let\zerosection \v!text
+\let\firstsection\empty
+\let\lastsection \empty
+\let\@@sectie \empty
+\let\@@koppeling \empty
+
+\makecounter{\??se\v!text}
+
+\letvalueempty{\??se\v!text\c!before}
+\letvalueempty{\??se\v!text\c!after }
+
+\setvalue {\v!text\c!number}{0}
+\letvalueempty{\v!text\s!format}
+
+\letvalueempty{\??sk\v!text}
+\letvalueempty{\??sk }
+
+\letvalue{\??by }\v!text
+\letvalue{\??by\v!text }\v!text
+\letvalue{\??by\v!all }\v!text
+\letvalue{\??by\v!by }\v!text
+\letvalue{\??by\v!by\v!text}\v!text
+\letvalue{\??by\v!by\v!all }\v!text
+\letvalue{\??by\v!by\v!page}\v!text % see footnotes
+
+\def\sectionofhead#1{\executeifdefined{\??ko#1\c!section}\s!unknown}
+
+\def\setupsection
+ {\dotripleempty\dosetupsection}
+
+\def\dosetupsection[#1]%
+ {\doifdefinedelse{\??se#1}
+ {\dodosetupsection[#1]}%
+ {\dodosetupsection[\sectionofhead{#1}]}}
+
+\def\dodosetupsection[#1][#2][#3]%
+ {\doifdefined{\??se#1}
+ {\ifthirdargument
+ \getparameters[\??se#1#2][#3]%
+ \else
+ \getparameters[\??se#1][#2]%
+ \fi
+ \doifelsevalue{\??se#1\c!previousnumber}\v!yes
+ {\setvalue{#1\c!number}{\@@longsectionnumber {#1}}}
+ {\setvalue{#1\c!number}{\@@shortsectionnumber{#1}}}}}
+
+\def\docouplemarking[#1][#2]%
+ {\doifdefinedelse{\??ko#2\c!section}
+ {\docouplemarking[#1][\getvalue{\??ko#2\c!section}]}
+ {\def\donexttrackcommando##1%
+ {\edef\coupledmarkings{\getvalue{\??se##1\c!marking}}%
+ \doifelse{##1}{#2}
+ {\addtocommalist{#1}\coupledmarkings}
+ {\removefromcommalist{#1}\coupledmarkings}%
+ \setevalue{\??se##1\c!marking}{\coupledmarkings}%
+ \donexttracklevel{##1}}%
+ \donexttracklevel{\zerosection}}} % \firstsection
+
+\def\couplemarking
+ {\dodoubleargument\docouplemarking}
+
+\def\decouplemarking[#1]%
+ {\couplemarking[#1][]}
+
+\def\definesection[#1]%
+ {\doifundefined{\??se#1}
+ {\doifelsenothing\firstsection
+ {\def\firstsection{#1}%
+ \setevalue{\??se#1\c!before}{\v!text}%
+ \setevalue{\??se\v!text\c!after}{#1}}
+ {\setevalue{\??se\commalistelement\c!after}{#1}% commalistelement ?
+ \setevalue{\??se#1\c!before}{\lastsection}%
+ \setevalue{\??se\lastsection\c!after}{#1}}%
+ \advance\nofsections \plusone
+ \setevalue{\??se#1\c!level}{\the\nofsections}%
+ \letvalue{\??se#1\c!after}\empty
+ \setvalue{\e!next#1}{\@@nextsectionnumber{#1}}%
+ \setvalue{#1\c!number}{\@@longsectionnumber{#1}}%
+ \setvalue{#1\s!format}{\@@longformatnumber{#1}}%
+ \setevalue{\??by#1}{#1}%
+ \setevalue{\??by\v!by#1}{#1}%
+ \makecounter{\??se#1}%
+ \makecounter{\??se\v!last#1}% GB
+ \edef\lastsection{#1}%
+ \setvalue{\??sk#1}{#1}%
+ \letvalue{\??se#1\c!marking}\empty
+ \setupsection[#1][\c!previousnumber=\v!yes]}}%
+
+\def\previoussection#1{\csname\??se#1\c!before\endcsname}
+\def\nextsection #1{\csname\??se#1\c!after \endcsname}
+
+\let\preservedsection\v!unknown % \def\preservedsection{\firstsection}
+
+\def\checkpreservevalueafter#1% GB
+ {\ifnum\getvalue{\??se#1\c!level}<\nofsections
+ \edef\preservedsection{\getvalue{\??se#1\c!after}}%
+ \ifconditional\@@resetsubheadnumbers
+ \setcounter{\??se\v!last\preservedsection}\zerocount % {0}%
+ \else
+ \setcounter{\??se\v!last\preservedsection}{\countervalue{\??se\preservedsection}}%
+ \fi
+ \fi}
+
+\def\@@setsectionnumber#1#2%
+ {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
+ \setcounter{\??se#1}{#2}%
+ \checkpreservevalueafter{#1}% GB
+ \resetsectioncounters{#1}%
+ \checkpagecounter}
+
+\def\@@nextsectionnumber#1% patched by GB
+ {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
+ \ifnum\countervalue{\??se\v!last#1}>\zerocount
+ \setcounter{\??se#1}{\countervalue{\??se\v!last#1}}%
+ \setcounter{\??se\v!last#1}\zerocount % {0}%
+ \fi
+ \pluscounter{\??se#1}%
+ \checkpreservevalueafter{#1}%
+ \resetsectioncounters{#1}%
+ \checkpagecounter}
+
+\def\@@sectionvalue#1% % nog niet overal doorgevoerd
+ {\countervalue{\??se#1}} % zoeken op \??se
+
+% suited for chinese too:
+
+\def\@@sectionconversion#1#2% a doublure with \@@shortsectionnumber
+ {\ifnum#2=0 0\else % else troubles with \uchar
+ \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
+ \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
+ #2%
+ \else
+ \convertnumber{\getvalue{\??se#1\c!conversion}}{#2}%
+ \fi
+ \else
+ \convertnumber{\getvalue{\??se#1\@@sectionblock\c!conversion}}{#2}%
+ \fi
+ \fi}
+
+% \def\@@sectionlevel#1%
+% {\ifundefined{\??se#1\c!level}0\else\getvalue{\??se#1\c!level}\fi}
+
+\def\@@sectionlevel#1%
+ {\executeifdefined{\??se#1\c!level}0}
+
+% Omdat een markering kan worden herdefinieerd moeten we
+% eerst testen of er wel een keten||afhankelijkheid is.
+
+\def\resetsectionmarks#1% can invoke a break
+ {\ifundefined{\??se#1}%
+ \fastresetmarker[\mainmarking{#1}]% % redundant \mainmarking
+ \else
+ \let\donexttrackcommando\doresetsectionmarks
+ \donexttracklevel{#1}%
+ \fi}
+
+\def\doresetsectionmarks#1%
+ {\ifundefined{\??se#1\c!marking}\else % skip zero level
+ \fastresetmarkerlist[\csname\??se#1\c!marking\endcsname]%
+ \fi
+ \donexttracklevel{#1}}
+
+% I'm not sure if the next one is better:
+%
+% \def\doresetsectionmarks#1%
+% {\ifundefined{\??se#1\c!markering}% skip zero level
+% \donexttracklevel{#1}%
+% \else
+% \fastresetmarkerlist[\csname\??se#1\c!markering\endcsname]%
+% \fi}
+%
+% and indeed, it isn't, actually, it does not work at all, so let's drop it.
+
+% packaged:
+%
+% \def\resetsectioncounters#1%
+% {\def\donexttrackcommando##1%
+% {\resetcounter{\??se##1}%
+% \donexttracklevel{##1}}%
+% \donexttracklevel{#1}}
+%
+% nicer
+%
+% \def\doresetsectioncounters#1%
+% {\resetcounter{\??se#1}%
+% \donexttracklevel{#1}}
+%
+% obey eigennummer
+
+\def\doresetsectioncounters#1%
+ {\resetcounter{\??se#1}%
+ \letgvalue{\??se#1\c!ownnumber}\relax
+ \donexttracklevel{#1}}
+
+\def\resetsectioncounters % #1
+ {\let\donexttrackcommando\doresetsectioncounters
+ \donexttracklevel} % #1
+
+% bij checken kan geen prefix worden bekeken, anders vallen
+% er titels buiten de inhoudsopgave
+
+% evt ook level gaan opslaan tbv snelle selectie
+
+% \def\makesectionformat
+% {\edef\sectionformat
+% {\@@sectiontype\sectionseparator
+% \csname\lastsection\s!format\endcsname}}
+
+\unprotected \def\makesectionformat % we don't want eigennummers here
+ {\pushmacro\@@shortsectionnumber
+ \let\@@shortsectionnumber\@@sectionvalue
+ \edef\sectionformat
+ {\@@sectiontype\sectionseparator
+ \csname\lastsection\s!format\endcsname}%
+ \popmacro\@@shortsectionnumber}
+
+\def\dobacktracklevel#1%
+ {\doifnot{\previoussection{#1}}\zerosection
+ {\dobacktrackcommando{\previoussection{#1}}}}
+
+\def\donexttracklevel#1%
+ {\doifnot{#1}\lastsection
+ {\donexttrackcommando{\nextsection{#1}}}}
+
+\chardef\alltoclevels\zerocount
+
+\let\currentlevel\empty
+
+\def\dosetcurrentlevel#1%
+ {\global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\lastsection\s!format}}}
+
+\def\dosetpreviouslevel#1%
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty
+ \def\dobacktrackcommando##1%
+ {\ifnum\countervalue{\??se##1}>\zerocount
+ \global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi}%
+ \dobacktrackcommando\lastsection}
+
+\def\dosettextlevel#1%
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty}
+
+\def\dosetotherlevel#1%
+ {\doifdefinedelse{\??ko#1\c!section} % beter alteratief: ook
+ {\edef\@@sectie{\getvalue{\??ko#1\c!section}}} % hoofdstuk\c!format
+ {\edef\@@sectie{#1}}%
+ \doifdefinedelse{\??se\@@sectie}
+ {\global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty
+ \def\dobacktrackcommando##1%
+ {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
+ \dobacktracklevel{##1}%
+ \else
+ \ifnum\countervalue{\??se##1}>\zerocount
+ \global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{##1\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi
+ \fi}%
+ \dobacktrackcommando\lastsection}}
+
+% \def\ignoresectionconversion % brrr
+% {\let\@@sectionconversion\secondoftwoarguments}
+
+% todo: criterium=appendix|frontmatter|....
+
+\def\dosetfilterlevel#1#2% beware: this one is \let
+ {\bgroup
+ \let\@@shortsectionnumber\@@sectionvalue
+% \ignoresectionconversion
+ \edef\askedlevel{#1}%
+ \edef\askedfilter{#2}%
+ \ifx\askedlevel\v!current
+ \dosetcurrentlevel\askedlevel
+ \else\ifx\askedlevel\v!previous
+ \dosetpreviouslevel\askedlevel
+ \else\ifx\askedlevel\v!all
+ \global\chardef\alltoclevels\plusone
+ \else\ifx\askedlevel\v!text
+ \global\chardef\alltoclevels\plusone
+ \else
+ \edef\byaskedlevel{\csname\??by\askedlevel\endcsname}%
+ \ifx\byaskedlevel\v!text
+ \dosettextlevel\askedlevel
+ \else
+ \dosetotherlevel\askedlevel
+ \fi
+ \fi\fi\fi\fi
+ % experiment
+ \ifx\askedfilter\empty \else
+ \xdef\currentlevel{\currentlevel\sectionseparator\askedfilter}%
+ \fi
+ \egroup}
+
+% \def\dontsetfilterlevel#1#2%
+% {\let\currentlevel\somesavedlevel
+% \chardef\alltoclevels\zerocount}
+
+\def\dontsetfilterlevel#1#2%
+ {\let\currentlevel\somesavedlevel
+ \let\@@sectiontype\@@tocsectiontype
+ \chardef\alltoclevels\zerocount}
+
+\def\honorlocalfilterlevel % local lists will be real local
+ {\let\dosetfilterlevel\dontsetfilterlevel}
+
+% cleaner
+%
+% \def\doifnextlevelelse[#1::#2]#3#4%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}{#4}{#3}}
+% {#4}}
+% {#4}%
+% \else
+% #3%
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]#3#4%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}{#3}{#4}}
+% {#4}%
+% \else
+% #3%
+% \fi}
+%
+% faster
+%
+% \def\doifnextlevelelse[#1::#2]%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% meaner
+%
+% \setuplist
+% [chapter]
+% [after={\startcolumns\placelist[section]\stopcolumns}]
+
+\def\somesavedlevel{0}
+
+% \def\dosavesomelevel[#1:0:0:0:#2]%
+% {\def\somesavedlevel{:#1}}
+
+% \def\doifnextlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% again faster:
+
+% \def\doifnextlevelelse[#1::#2]% beware: this one is \let
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=#1
+% \def\levelstring{=:#2:}%
+% \doifincsnameelse{=\currentlevel:}\levelstring
+% {\doifincsnameelse{=\currentlevel:0}\levelstring\donefalse\donetrue}
+% \donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+%\def\doifprevlevelelse[#1::#2]% beware: this one is \let
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=#1
+% \doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \let\doiftoclevelelse\doifnextlevelelse
+% \let\doifreglevelelse\doifprevlevelelse
+% \let\doifblklevelelse\doifprevlevelelse
+%
+% we want to be able to overload them globally
+
+% This will be reimplemented some day soon
+%
+% {nn}{xx}{yy}
+%
+% -> \scan{..}{..}{0} met 0 als sentinel
+
+% still not perfect
+%
+% \def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
+% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
+% \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
+% \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
+% {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
+% \donefalse
+% \donetrue}
+% \donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
+% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
+% \doifinstringelse
+% {=\currentlevel\sectionseparator}
+% {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
+% \donetrue\donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+
+\def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
+ {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+ \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
+ \ifcase\alltoclevels
+ \ifnum\@@sectiontype=\@@tocsectiontype\relax
+ \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
+ \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
+ {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
+ \donefalse
+ \donetrue}
+ \donefalse
+ \else
+ \donefalse
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
+ {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+ \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
+ \ifcase\alltoclevels
+ \ifnum\@@sectiontype=\@@tocsectiontype\relax
+ \doifinstringelse
+ {=\currentlevel\sectionseparator}
+ {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
+ \donetrue\donefalse
+ \else
+ \donefalse
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% we need to cover the special case of nested lists in section blocks
+%
+% \starttext
+%
+% \def\ChapterEntry#1#2#3%
+% {chapter : \hbox to \hsize{\strut\bf#2\hss#3}\endgraf\placelist[section]}
+%
+% \startfrontmatter % optional
+% \placelist[chapter][alternative=command,command=\ChapterEntry,criterium=text] \page
+% \stopfrontmatter % optional
+%
+% \startbodymatter % optional
+% \chapter{first} \section{one} test \section{two} test \page
+% \chapter{second} \section{alpha} test \section{beta} test \page
+% \stopbodymatter % optional
+%
+% \stoptext
+
+\def\doiftoclevelelse{\doifnextlevelelse}
+\def\doifreglevelelse{\doifprevlevelelse}
+\def\doifblklevelelse{\doifprevlevelelse}
+
+\def\@@longformatnumber#1%
+ {\csname\previoussection{#1}\s!format\endcsname
+ \sectionseparator
+ \@@shortsectionnumber{#1}}
+
+% \def\@@longsectionnumber#1%
+% {\ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+% \csname\previoussection{#1}\c!nummer\endcsname.%
+% \fi
+% \@@shortsectionnumber{#1}}
+
+\def\@@longsectionnumber#1%
+ {\ifreversesectionnumbers
+ \@@shortsectionnumber{#1}%
+ \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+ .\csname\previoussection{#1}\c!number\endcsname
+ \fi
+ \else
+ \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+ \csname\previoussection{#1}\c!number\endcsname.%
+ \fi
+ \@@shortsectionnumber{#1}%
+ \fi}
+
+% suited for chinese too:
+%
+% \def\@@shortsectionnumber#1%
+% {\@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
+% \@@sectionvalue{#1}%
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi}
+%
+% obey eigennummer
+%
+% \def\@@shortsectionnumber#1%
+% {\@EA\ifx\csname\??se#1\c!eigennummer\endcsname\relax
+% \@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
+% \@EA\ifx\csname\??se#1\c!conversie\endcsname\relax
+% \@@sectionvalue{#1}%
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi
+% \else
+% \csname\??se#1\c!eigennummer\endcsname
+% \fi}
+
+\def\@@shortsectionnumber#1%
+ {\@EA\ifx\csname\??se#1\c!ownnumber\endcsname\relax
+ \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
+ \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
+ \@@sectionvalue{#1}%
+ \else
+ \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+ \fi
+ \else
+ \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+ \fi
+ \else
+ \csname\??se#1\c!ownnumber\endcsname
+ \fi}
+
+\def\dosetlocalsectionblock#1#2#3% new \edef's
+ {\edef\@@sectiontype {#1}%
+ \edef\@@sectionblock {#2}%
+ \edef\@@sectionblocks{#3}}
+
+% beware, the \resetsectionmarks generates some nodes that
+% will result in an additional last page, which needs to be
+% captured at the end
+
+% \def\doaroundsectionblock#1%
+% {\doifvaluesomething{\??sb#1\c!page}
+% {\ExpandFirstAfter\page[\getvalue{\??sb#1\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection}
+
+% \def\dostartsectionblock#1#2%
+% {\begingroup
+% \doaroundsectionblock{#1}% % going to a new page or so
+% \getvalue{\??sb#1}% % set name of section block
+% \getsectionblockenvironment{#1}% % special settings, grouped
+% %\expandafter\csname#2true\endcsname % obsolete
+% \setsystemmode{#1}% % can be used in conditionals
+% \getvalue{\??sb\@@sectionblock\c!before}% this one is not to be moved!
+% \showmessage\m!structures1\@@sectionblocks}
+
+% \def\dostopsectionblock
+% {\showmessage\m!structures2\@@sectionblocks
+% \getvalue{\??sb\@@sectionblock\c!after}% don't move
+% \doaroundsectionblock\@@sectionblock
+% \endgroup}
+
+\def\doaroundsectionblock
+ {\doifvaluesomething{\??sb\@@sectionblock\c!page}
+ {\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+ \resetsectioncounters\zerosection % was firstsection
+ \resetsectionmarks\zerosection}
+
+\def\dostartsectionblock#1#2%
+ {\begingroup
+ \getvalue{\??sb#1}%
+ \doaroundsectionblock
+% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection
+ \getsectionblockenvironment\@@sectionblock
+ \setsystemmode\@@sectionblock
+ \getvalue{\??sb\@@sectionblock\c!before}%
+ \showmessage\m!structures1\@@sectionblocks}
+
+\def\dostopsectionblock
+ {\showmessage\m!structures2\@@sectionblocks
+ \getvalue{\??sb\@@sectionblock\c!after}% don't move
+ \doaroundsectionblock
+% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection
+ \endgroup}
+
+\def\dosetupsectionblock[#1]% [#2]
+ {\getparameters[\??sb#1]}
+
+\def\setupsectionblock
+ {\dodoubleargument\dosetupsectionblock}
+
+\long\def\setsectionblockenvironment#1#2%
+ {\long\setvalue{\??sb\s!do#1}{\do{#2}}}
+
+\def\getsectionblockenvironment#1%
+ {\let\do\firstofoneargument\getvalue{\??sb\s!do#1}}
+
+\setvalue{\e!start\v!sectionblockenvironment}%
+ {\dosingleargument\dostartsectionblockenvironment}
+
+\def\dostartsectionblockenvironment[#1]% evt \pushendofline \popendofline
+ {\long\def\do##1##2{\setsectionblockenvironment{#1}{##1##2}}%
+ \grabuntil{\e!stop\v!sectionblockenvironment}{\getvalue{\??sb\s!do#1}}}
+
+%D \starttyping
+%D \startsectionblockenvironment[frontpart]
+%D \setuppagenumbering[conversion=romannumerals]
+%D \stopsectionblockenvironment
+%D
+%D \startsectionblockenvironment[bodypart]
+%D \setuppagenumber[number=1]
+%D \stopsectionblockenvironment
+%D
+%D \startsectionblockenvironment[frontpart]
+%D \setuppagenumbering[conversion=character]
+%D \stopsectionblockenvironment
+%D
+%D \starttext
+%D \startfrontmatter \chapter{test} \stopfrontmatter
+%D \startbodymatter \chapter{test} \stopbodymatter
+%D \startappendices \chapter{test} \stopappendices
+%D \stoptext
+%D \stoptyping
+
+% We used to use the first char as id, but a counter is
+% better, because in english we get a name clash.
+
+\newcounter\currentsectionblock
+
+\def\currentsection{\@@sectionblock}
+
+\def\dodefinesectionblock[#1][#2][#3]%
+ {\getparameters
+ [\??sb#1]
+ [\c!number=\v!yes,
+ \c!page=\v!right, % anders worden marks te vroeg gereset !
+ %\c!before=,
+ %\c!after=,
+ #3]%
+ \expandafter\newif\csname if#2\endcsname % better a mode
+ \doglobal\increment\currentsectionblock
+ \setsectionblockenvironment{#1}{}%
+ \setevalue{\??sb #1}{\noexpand\dosetlocalsectionblock{\currentsectionblock}{#1}{#2}}%
+ \setvalue {\e!start#2}{\dostartsectionblock{#1}{#2}}%
+ \setvalue {\e!stop #2}{\dostopsectionblock}}
+
+\def\definesectionblock
+ {\dotripleargument\dodefinesectionblock}
+
+\def\sectionblocklabel#1#2%
+ {\@EA\ifx\csname\??ko#1\@@sectionblock\c!label\endcsname\relax
+ \labeltexts{#1}{#2}%
+ \else
+ \labeltexts{\getvalue{\??ko#1\@@sectionblock\c!label}}{#2}%
+ \fi}
+
+\dosetlocalsectionblock{2}{\v!bodypart}{\v!bodymatter} % hm, dirty
+
+\def\setsectiontype[#1]%
+ {\getvalue{\??sb#1}}
+
+\def\writesection#1#2#3% #3 -> \asciititle
+ {\bgroup
+ \edef\!!stringa{#1}%
+ \@EA\writestatus\@EA
+ {\!!stringa}
+ {\ifsectionnumber#2\else(#2)\fi\normalspace\asciititle}%
+ \egroup}
+
+\def\@@kolevel{1} \def\headlevel{\@@kolevel}
+
+\def\dohandlepagebreakAA#1%
+ {\ifnum\lastpenalty>0
+ \global\paginageblokkeerdtrue
+ \fi}
+
+% \setuphead[section][aligntitle=float] % permits title next to sidefloat
+%
+% \placefigure[left]{}{} \section{\dorecurse{10}{bagger }} \input tufte
+
+% \def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
+% {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
+% \getvalue{\??ko#1\c!before}%
+% % \whitespace vervangen door \noindent elders
+% \relax
+% \ifpaginageblokkeerd
+% \global\paginageblokkeerdfalse
+% \else
+% \!!countb\getvalue{\??se\@@sectie\c!level}\relax
+% \ifnum\!!countb>\@@kolevel\relax
+% \!!counta20000
+% \multiply\!!countb 500
+% \advance\!!counta \!!countb
+% \dosomebreak{\penalty\!!counta}%
+% \else
+% \dosomebreak\allowbreak
+% \fi
+% \fi
+% \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
+% \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
+
+\chardef\somebreakmethod\plusone
+
+\def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
+ {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
+ \getvalue{\??ko#1\c!before}%
+ % \whitespace vervangen door \noindent elders
+ \relax
+ \ifpaginageblokkeerd
+ \global\paginageblokkeerdfalse
+ \else
+ \ifcase\somebreakmethod
+ % 0 = nothing
+ \or
+ % 1 = old weighted version
+ \!!countb\getvalue{\??se\@@sectie\c!level}\relax
+ \ifnum\!!countb>\@@kolevel\relax
+ \!!counta20000
+ \multiply\!!countb 500
+ \advance\!!counta \!!countb
+ \dosomebreak{\penalty\!!counta}%
+ \else
+ \dosomebreak\allowbreak % brr
+ \fi
+ \or
+ % 2 = strict version
+ \dosomebreak{\penalty\maxdimen}%
+ \else
+ % nothing
+ \fi
+ \fi
+ \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
+ \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
+
+\def\dohandlepagebreakBB#1#2#3%
+ {%\doifinsetelse{\getvalue{\??tk#2\c!state}}{\v!normal,\v!start}
+ \doifelselayouttextline{#2}
+ {\doifvaluesomething{\??ko#1#3}
+ {\setuplayouttext[#2][\c!state=\getvalue{\??ko#1#3}]}}
+ \donothing}
+
+\def\dohandlepagebreakB#1%
+ {\doifvaluesomething{\??ko#1\c!page}
+ {\def\resetcurrentsectionmarks% toegevoegd, zie \page
+ {\resetsectionmarks{\previoussection\@@sectie}}%
+ \page[\getvalue{\??ko#1\c!page}]%
+ \dohandlepagebreakBB{#1}\v!header\c!header
+ \dohandlepagebreakBB{#1}\v!text \c!text
+ \dohandlepagebreakBB{#1}\v!footer\c!footer}}
+
+\def\dohandlepagebreakX#1% zie doordefinieren / boven
+ {\bgroup
+ \!!countb\@@kolevel
+ \advance\!!countb #1
+ \multiply\!!countb 500
+ \!!counta20000
+ \advance\!!counta \!!countb
+ \dosomebreak{\penalty\!!counta}%
+ \egroup}
+
+\newconditional\ignorehandlepagebreak
+
+\def\handlepagebreak#1%
+ {\ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \dohandlepagebreakAA{#1}%
+ \ifnum\countervalue{\??se\previoussection\@@sectie}>\zerocount\relax
+ \ifnum\countervalue{\??se\@@sectie}>\zerocount
+ \dohandlepagebreakB{#1}%
+ \else
+ \doifnotvalue{\??ko#1\c!continue}\v!yes{\dohandlepagebreakB{#1}}%
+ \fi
+ \else
+ \dohandlepagebreakB{#1}%
+ \fi
+ \dohandlepagebreakAB{#1}%
+ \fi}
+
+\def\handlenopagebreak#1%
+ {\ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}%
+ \nobreak
+ \fi}
+
+\def\localheadheight {\strutht}
+\def\localheaddepth {\strutdp}
+\def\localheadlineheight{\lineheight}
+
+\def\dolocalheadsetup#1% koppeling met standaard kopcommando / engels
+ {\forgetall % traag dus ...
+ \doifvaluesomething{\??ko#1\c!align} % wordt al expanded in spa
+ {\expanded{\setupalign[\getvalue{\??ko#1\c!align}]}}%
+ \doifvaluesomething{\??ko#1\c!tolerance} % wordt al expanded in spa
+ {\expanded{\setuptolerance[\getvalue{\??ko#1\c!tolerance}]}}%
+ \doifvalue{\??ko#1\c!strut}\v!no % wordt al expanded in spa
+ {\setnostrut}% new
+ \def\\{\crlf\strut\ignorespaces}}
+
+\def\localkopsetup{\localheadsetup} % kan tzt weg
+
+% todo: make them conditionals:
+
+\newif\ifincrementnumber
+\newif\ifreversesectionnumbers % todo: key/val
+\newif\ifsectionnumber \sectionnumbertrue
+\newif\ifdisplaysectionhead \displaysectionheadtrue
+\newif\ifplacehead
+\newif\ifemptyhead
+\newif\ifwritetolist
+\newif\ifheadnumber
+\newif\ifheadnumbercontent % niet meer wijzigen / wordt mode
+\newif\ifheadprefix
+\newif\ifsomeheadconversion
+
+% new
+
+\newconditional\@@resetsubheadnumbers
+
+\def\setsectieenkoppeling#1%
+ {\edef\@@koppeling{\getvalue{\??ko#1\c!coupling}}%
+ \edef\@@sectie{\getvalue{\??ko#1\c!section}}%
+ \doifnothing\@@koppeling
+ {\edef\@@koppeling{#1}}%
+ \doifnothing\@@sectie
+ {\edef\@@sectie{\getvalue{\??ko\@@koppeling\c!section}}}}
+
+% \handlepagebreak komt het eerst omdat eventueel
+% subpaginanummers moeten worden afgehandeld. Vervolgens
+% worden de nummers opgehoogd en referenties geset, dan
+% volgt de kop en tot slot de worden de marks en de prefix
+% geset.
+
+% \hoofdstuk {tekst}
+% \hoofdstuk tekst
+% \hoofdstuk
+
+\let\finalsectionnumber\empty
+
+\def\dofinalsectionnumber
+ {\ifundefined{\@@sectie\c!number}\else
+ \ifsomeheadconversion
+ \@@shortsectionnumber\@@sectie
+ \else
+ \getvalue{\@@sectie\c!number}%
+ \fi
+ \fi}
+
+\def\findsectionnumber#1#2#3% class file title / uti seperator --
+ {\begingroup
+ \setsectieenkoppeling{#1}%
+ \xdef\foundsectionnumber{1}%
+ \def\dolistelement##1##2##3##4##5##6%
+ {\doif{##1}{#1}
+ {\ConvertConstantAfter\doif{##4}{#3}
+ {\global\utilitydonetrue
+ \scratchcounter=0\getvalue{\??se\@@sectie\c!level}%
+ %
+ %\advance\scratchcounter 2
+ %\@EA\def\@EA\do\@EA####\@EA1\sectionseparator####2]%
+ % {\advance\scratchcounter -1
+ % \ifcase\scratchcounter
+ % \xdef\foundsectionnumber{####1}%
+ % \else
+ % \do####2]%
+ % \fi}%
+ %\do##5]}}}%
+ %
+ \def\do####1\relax % :/- clean
+ {\advance\scratchcounter \minusone
+ \ifcase\scratchcounter
+ \xdef\foundsectionnumber{\@@filterheadpart[####1]}%
+ \else
+ \@EAEAEA\do\@@filtertailpart[####1]\relax
+ \fi}%
+ \@EA\do\@@filternumberpart[##5]\relax}}}%
+ \setbox0\vbox
+ {\doutilities{#1}{#2}{#1}\relax\relax}%
+ \endgroup
+ \doifnumberelse\foundsectionnumber
+ {\doif\foundsectionnumber\!!zerocount
+ {\globallet\foundsectionnumber\!!plusone}}
+ {\globallet\foundsectionnumber\!!plusone}% an appendix or so
+ \setupheadnumber[#1][\foundsectionnumber]%
+ \setupheadnumber[#1][-1]}
+
+% deal with eigennummer
+
+\def\setsomeheadconversion#1#2%
+ {\someheadconversionfalse
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\setgvalue{\??se\@@sectie\c!ownnumber}{#2}%
+ \def\someheadconversion{#2}}
+ {\letgvalue{\??se\@@sectie\c!ownnumber}\relax
+ \determineheadnumber[#1]%
+ \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\relax
+ \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\relax
+ \def\someheadconversion{#2}%
+ \else
+ \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\empty
+ \def\someheadconversion{#2}%
+ \else
+ \someheadconversiontrue
+ \def\someheadconversion%
+ {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\c!headconversion}}{#2}}%
+ \fi
+ \fi
+ \else
+ \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\empty
+ \def\someheadconversion{#2}%
+ \else
+ \someheadconversiontrue
+ \def\someheadconversion%
+ {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\@@sectionblock\c!headconversion}}{#2}}%
+ \fi
+ \fi}}
+
+\def\writtenfullsectionnumber
+ {\string\fullsectionnumber}
+
+\def\ignoredfullsectionnumber#1#2#3%
+ {#3}
+
+\let\storedfullsectionnumber\relax
+
+\def\expandablefullsectionnumber#1#2#3%
+ {\convertnumber{#2}{#3}}
+
+\unexpanded\def\naturalfullsectionnumber#1#2#3%
+ {\sectionblocklabel{#1}{\convertnumber{#2}{#3}}}
+
+\unexpanded\def\limitedfullsectionnumber#1#2#3%
+ {\convertnumber{#2}{#3}}
+
+\def\setfullsectionnumber#1%
+ {\doifelsevalue{#1\c!headconversion}\v!yes
+ {\doifelsevalue{#1\c!headlabel}\v!yes
+ {\let\fullsectionnumber\naturalfullsectionnumber}
+ {\let\fullsectionnumber\limitedfullsectionnumber}}
+ {\let\fullsectionnumber\ignoredfullsectionnumber}}
+
+\let\fullsectionnumber\limitedfullsectionnumber
+
+% \dodododoconstructhead IS NON GROUPED, SO WE NEED TO RESTORE !!!!
+%
+% dit kan dus beter \everyaroundhead zijn
+
+\let\currentheadnumber\empty
+\let\currentheadtext \empty
+
+\def\dodoconstructhead#1[#2]#3% [ref] {title}
+ {\doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\doquadruplegroupempty\dododoconstructhead{#1}{#2}{#3}}
+ {\fourthargumentfalse \dododoconstructhead{#1}{#2}{#3}{}}}
+
+\def\dododoconstructhead#1#2#3#4% [ref] {own} {title}
+ {\iffourthargument
+ \def\next{\dodododoconstructhead{#1}[#2]{#3}{#4}}%
+ \else
+ \def\next{\dodododoconstructhead{#1}[#2]{\finalsectionnumber}{#3}}%
+ \fi
+ \next}
+
+% pas met \ExpandFirstAfter op bij twee||taligheid
+
+\ifx\dohandleheadnumber\undefined
+ \let\dohandleheadnumber\firstofoneargument
+\fi
+
+\unexpanded\def\\{\space}
+
+\def\emptyheadcorrection % experimental, should work
+ {\ifemptyhead % well with na=\blank
+ \vskip-\lineheight
+ \dosomebreak\nobreak
+ \kern\zeropoint
+ \prevdepth\strutdepth
+ \fi}
+
+\let\localkopprefix\empty
+
+\def\headparameter#1% to do: everywhere in core-sec
+ {\executeifdefined{\??ko\currenthead#1}\empty}
+
+% todo: write to list etc in both args or in enclosing h/vbox else it gets
+% lost when no #1 or #2 is typeset
+
+% we will use variables here
+
+\def\dodododoconstructhead#1[#2]#3#4% [ref] {number} {title}
+ {\def\currenthead{#1}% dus #1 overal vervangen
+ \let\finalsectionnumber\dofinalsectionnumber % overloaded ungrouped -)
+ \unexpanded\def\\{\space}%
+ \edef\numberseparator{\spr{\getvalue{\??ko\currenthead\c!separator}}}%
+ \flushingcolumnfloatsfalse % {number} can be \finalsectionnumber
+ \someheadconversionfalse
+ \let\fullsectionnumber\limitedfullsectionnumber
+ \setsectieenkoppeling{#1}%
+ \doifelsevaluenothing{\??ko#1\c!prefix}
+ \headprefixfalse\headprefixtrue
+ \ifheadprefix
+ \doifelsevalue{\??ko#1\c!prefix}{+}
+ {\doifelsenothing{#2}
+ {\def\localkopprefix{+}}
+ {\def\localkopprefix{#2}}} % eigenlijk alleen eerste
+ {\edef\localkoprefix{\getvalue{\??ko#1\c!prefix}}}%
+ \else
+ \let\localkoprefix\empty
+ \fi
+ \placeheadtrue
+ \processaction
+ [\getvalue{\??ko#1\c!placehead}]
+ [ \v!yes=>\emptyheadfalse,
+ \v!empty=>\emptyheadtrue,
+ \v!no=>\emptyheadtrue\placeheadfalse]%
+ \doifelsevalue{\??ko#1\c!resetnumber}\v!no
+ {\setfalse\@@resetsubheadnumbers}%
+ {\settrue \@@resetsubheadnumbers}%
+ \writetolistfalse
+ \processaction
+ [\getvalue{\??ko#1\c!incrementnumber}]
+ [ \v!yes=>\incrementnumbertrue,
+ \v!no=>\incrementnumberfalse,
+ \v!list=>\incrementnumberfalse
+ % beware, since no numbers are used, no nested lists are
+ % possible here
+ \writetolisttrue,
+ \s!unknown=>{\ifx\currentproduct\empty
+ \findsectionnumber{#1}\commalistelement{#4}%
+ \fi
+ \incrementnumbertrue}]%
+ \edef\numberheaddistance {\getvalue{\??ko#1\c!distance}}%
+ \edef\numberheadalternative{\getvalue{\??ko#1\c!alternative}}%
+ \doifelsevalue{\??ko:\numberheadalternative}\v!horizontal
+ \displaysectionheadfalse
+ \displaysectionheadtrue
+ \ifsectionnumber
+ \doifelsevalue{\??sb\@@sectionblock\c!number}\v!yes
+ {\doifelsevalue{\??ko#1\c!number}\v!yes
+ \headnumbertrue
+ \headnumberfalse}
+ {\headnumberfalse}%
+ \else
+ \headnumberfalse
+ \fi
+ \defconvertexpanded\asciititle{\getvalue{\??ko#1\c!expansion}}{#4}%
+ %
+ \gdef\currentheadtext{#4}% scheelt args
+ \globallet\currentheadnumber\empty
+ %
+ \ifincrementnumber
+ \ifplacehead
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifheadprefix
+ %\setupreferencing[\c!prefix=-]%
+ \setupreferenceprefix[-]%
+ \fi
+ \getvalue{\e!next\@@sectie}%
+ \ifheadnumber
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \getvalue{\??ko#1\c!inbetween}%
+ \ifsomeheadconversion
+ \let\fullsectionnumber\naturalfullsectionnumber
+ \doplaceheadnumbertext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \rawreference\s!sec{#2}{{\someheadconversion}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \dowritetolist\@@koppeling\someheadconversion{#4}\v!head}%
+ {\dohandleheadnumber\someheadconversion}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \let\fullsectionnumber\storedfullsectionnumber
+ \expanded{\marking[#1\v!number]{\someheadconversion}}}%
+ \let\fullsectionnumber\ignoredfullsectionnumber
+ \writesection{#1}{\someheadconversion}{#4}%
+ \else
+ \doplaceheadnumbertext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \dowritetolist\@@koppeling{#3}{#4}\v!head}
+ {\sectionblocklabel{#1}{\dohandleheadnumber{#3}}}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % rommelig omdat
+ {\edef\finalsectionnumber{#3}} % #3 al is toegekend
+ {\determineheadnumber[#1]}% migreert naar 3e argument
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
+ \writesection{#1}{#3}{#4}%
+ \fi
+ \else
+ \getvalue{\??ko#1\c!inbetween}%
+ \doplaceheadtext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr, new per 18/1/2005, sometimes we need
+ {\dowritetolist\@@koppeling{#3}{#4}\v!head} % entries in the list (special purpose) but
+ {\dowritetolist\@@koppeling {}{#4}\v!head}% not in the header, ok we could pop in a command
+ }% \dowritetolist\@@koppeling{}{#4}\v!head}
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr
+ {\edef\finalsectionnumber{#3}}
+ {\determineheadnumber[#1]}%
+ % todo : geen markering (leeg maken)
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
+ \writesection{#1}{-}{#4}%
+ \fi
+ \ifheadprefix
+ \setupreferenceprefix[\localkopprefix]%
+ \fi
+ \ifdisplaysectionhead
+ \dosomebreak\nobreak
+ \emptyheadcorrection
+ \getvalue{\??ko#1\c!after}%
+ \fi
+ \else
+ % Whatever future tex's will do with nodes,
+ % we assume a node here, because other \c!after=\blank
+ % will fail! See 'prikkels'
+ %
+ % so, maybe we need an explicit \kern
+ %
+ % do nothing / should be vbox to 0pt
+ %
+ \checknexthead\dohandlepagebreakB{#1}% toegevoegd ivm subpaginanr / tug sheets
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifheadprefix
+ \setupreferenceprefix[-]%
+ \fi
+ \getvalue{\e!next\@@sectie}%
+ \ifheadnumber
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \fi
+ \getvalue{\??ko#1\c!inbetween}% documenteren, is enige hook
+ \bgroup
+ \setsectionlistreference{\@@sectie}{#1}%
+ \resetsectionmarks\@@sectie
+ \marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\edef\finalsectionnumber{#3}}
+ {\determineheadnumber[#1]}%
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}%
+ \pagetype[\@@koppeling]%
+% \bgroup
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \ifheadnumber
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \dowritetolist\@@koppeling{#3}{#4}\v!head
+ \writesection{#1}{#3}{#4}%
+ \else % hm, also no own number
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \dowritetolist\@@koppeling{}{#4}\v!head
+ \writesection{#1}{-}{#4}%
+ \fi
+ \egroup
+ \ifheadprefix
+ \setupreferenceprefix[\localkopprefix]%
+ \fi
+ \fi
+ \else
+ % todo : ref prefix
+ \ifplacehead
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \getvalue{\??ko#1\c!inbetween}%
+ \doplaceheadtext
+ {#1}
+ {\forcesectiontolist{#1}{#4}%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}} % #3 ?
+ {#4}
+ %{}% new:
+ {\marking[#1]{#4}%
+ \marking[#1\v!number]{}}%
+ \writesection{#1}{-}{#4}%
+ \ifdisplaysectionhead
+ \dosomebreak\nobreak
+ \emptyheadcorrection
+ \getvalue{\??ko#1\c!after}%
+ \fi
+ \else
+ % do nothing / should be vbox to 0pt
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \getvalue{\??ko#1\c!inbetween}%
+ \forcesectiontolist{#1}{#4}%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}% #3 ?
+ \marking[#1]{#4}%
+ \marking[#1\v!number]{}%
+ \writesection{#1}{-}{#4}%
+ \fi
+ \fi
+ \flushingcolumnfloatstrue
+ \someheadconversionfalse
+ \setfalse\ignorehandlepagebreak
+ \let\fullsectionnumber\limitedfullsectionnumber
+ % ignorespaces prevents spaces creeping in when after=\dontleavehmode
+ \ifdisplaysectionhead\ignorespaces\else\expandafter\GotoPar\fi}
+
+\def\forcesectiontolist#1#2%
+ {\ifwritetolist
+ % we need to make sure that there is a number set (non
+ % zero) else the list mechanism cannot determine the
+ % level
+ \bgroup
+ \setupheadnumber[#1][+1]% traag, wordt \getvalue{\c!next...}
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \dowritetolist\@@koppeling{}{#2}\v!head
+ \setupheadnumber[#1][-1]% traag, wordt \getvalue{\c!previous...}
+ \egroup
+ \fi}
+
+\let\previoussectionformat\empty
+\let\currentsectionformat \empty
+
+\let\updatelistreferences \relax
+\let\updatedlistreferences\empty
+
+\def\setsectionlistreference#1#2%
+ {\ifnum\countervalue{\??se\previoussection{#1}}>0\relax
+ \xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}%
+ \else
+ \globallet\previoussectionformat\empty
+ \fi
+ \xdef\currentsectionformat{\@@longformatnumber{#1}}}
+
+\def\startlistreferences#1%
+ {\thisissomeinternal{\s!lst}{#1\currentsectionformat}%
+ \setxvalue{\s!lst:#1}{\realfolio}% to be sure
+ \setxvalue{\s!lst:#1\currentsectionformat}{\realfolio}%
+ \setxvalue{\e!previouslocal#1}{\s!lst:#1\previoussectionformat}%
+ \setxvalue{\e!currentlocal#1}{\s!lst:#1\currentsectionformat}%
+ \doifelse{\currentsectionformat}{}
+ {\setglobalcrossreference
+ {\e!previous#1}{}{\realfolio}{}}
+ {\setglobalsystemreference\rt!list
+ {\e!previous#1}{\getvalue{\e!previouslocal#1}}}%
+ \def\stoplistreferences{\dostoplistreferences{#1}}}
+
+\def\dostoplistreferences#1%
+ {\ifutilitydone
+ \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
+ \globallet\updatedlistreferences\updatedlistreferences % een noodverbandje
+ \gdef\updatelistreferences%
+ {\def\docommand####1%
+ {\setglobalsystemreference\rt!list
+ {\e!previous####1}{\getvalue{\e!currentlocal####1}}}%
+ \processcommacommand[\updatedlistreferences]\docommand
+ \globallet\updatelistreferences\relax
+ \globallet\updatedlistreferences\empty}%
+ \fi}
+
+\let\stoplistreferences\relax
+
+\appendtoks
+ \updatelistreferences
+\to\aftereverypage
+
+% \prevdepth\strutdp % is belangrijk, vergelijk naast elkaar:
+%
+% \subject{test} \input tufte
+% \subject{test} \strut \input tufte
+% \subject{test} \placelist[...]
+
+% todo: kap
+
+% to be documented: \placeheadtext \placeheadnumber
+
+\unexpanded\def\placeheadtext
+ {\doquintupleempty\doplaceheadtextornumber
+ [\c!textstyle][\c!textcolor][\empty]}
+
+\unexpanded\def\placeheadnumber
+ {\doquintupleempty\doplaceheadtextornumber
+ [\c!numberstyle][\c!numbercolor][\v!number]}
+
+\def\doplaceheadtextornumber[#1][#2][#3][#4][#5]%
+ {\bgroup
+ \edef\@@sectie{\??ko\iffifthargument#5\else#4\fi}%
+ \dostartattributes\@@sectie\c!style\c!color\empty
+ \dontconvertfont
+ \dostartattributes\@@sectie{#1}{#2}\empty
+ \setupinterlinespace
+ \begstrut\getmarking[\mainmarking{#4#3}]\endstrut
+ \endgraf
+ \dostopattributes
+ \dostopattributes
+ \egroup}
+
+\chardef\headtimingmode=0
+
+% \chardef\headtimingmode=1 % 0 also works ok now too
+%
+% Martin Kolarik's problem:
+%
+% \setuphead[section][command=\doTitle]
+%
+% \def\doTitle#1#2%
+% {\ruledvbox{\forgetall \hsize=4cm
+% \ruledhbox{\ruledvtop{#1}\ruledvtop{#2}}}}
+%
+% \section{test test test test test test test test test test
+% test test test test test test test}
+
+\newevery \everyheadstart \relax
+
+\def\placeheadmargintexts#1%
+ {\the\everyheadstart
+ \doifvalue{\??ko#1\c!margintext}\v!yes\placemargincontent}
+
+\def\doplaceheadtext#1#2#3#4%
+ {\beginheadplacement{#1}%
+ \ifemptyhead % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
+ {\headnumbercontentfalse
+ \resetsystemmode\v!sectionnumber
+ #2}%
+ \makestrutofbox0
+ \else % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
+ {\headnumbercontentfalse
+ \resetsystemmode\v!sectionnumber
+ % less interfering
+ \ifcase\headtimingmode\or#2\fi
+ % outerside font determines distance
+ \dosetfontattribute{\??ko#1}\c!style
+ \dosetcolorattribute{\??ko#1}\c!color
+ % todo: get the if-else out of it
+ \getvalue{\??ko#1\c!command}
+ {} % no number
+ {\dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
+ \dontconvertfont
+ \ifdisplaysectionhead
+ \setupinterlinespace
+ \else
+ \setupspacing
+ \fi
+ % \ifcase\headtimingmode#2\fi % can introduce cr
+ \getvalue{\??ko#1\c!commandbefore}%
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
+ {\setstrut
+ \begstrut
+ \ifcase\headtimingmode\hbox{#2}\fi
+ \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}%
+ \endstrut}% \hbox prevents break
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdepth
+ \else
+ \ifcase\headtimingmode#2\fi
+ \getvalue{\??ko#1\c!textcommand}%
+ {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}}%
+ \fi
+ \getvalue{\??ko#1\c!commandafter}%
+ \ifdisplaysectionhead\endgraf\fi
+ \dostopattributes}}%
+ \fi
+ \endheadplacement{#1}{#4}}
+
+\def\doplaceheadnumbertext#1#2#3#4#5% maybe move modes outside box
+ {\beginheadplacement{#1}%
+ \ifemptyhead % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
+ {\doiftextelse{#3}
+ {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
+ {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
+ #2}%
+ \makestrutofbox0
+ \else % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
+ {\doiftextelse{#3}
+ {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
+ {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
+ % less interfering
+ \ifcase\headtimingmode\or#2\fi
+ % outerside font determines distance
+ \dosetfontattribute{\??ko#1}\c!style
+ \dosetcolorattribute{\??ko#1}\c!color
+ % but we don't want color to influence user commands
+ \getvalue{\??ko#1\c!command}%
+ {\dostartattributes{\??ko#1}\c!numberstyle\c!numbercolor\empty
+ % \getvalue{\??ko#1\c!commandbefore}% strange, why here? moved 21/11/2005
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ % can be nilled with \setnostrut
+ \getvalue{\??ko#1\c!numbercommand}%
+ {\setstrut
+ \begstrut
+ \executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}%
+ \endstrut}%
+ \else
+ \getvalue{\??ko#1\c!numbercommand}%
+ {\executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}}%
+ \fi
+ \dostopattributes}
+ {\dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
+ \dontconvertfont
+ \ifdisplaysectionhead
+ \setupinterlinespace
+ \else
+ \setupspacing
+ \fi
+ % \ifcase\headtimingmode#2\fi % can introduce cr
+ \getvalue{\??ko#1\c!commandbefore}% makes more sense here
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
+ {\setstrut
+ \begstrut
+ \ifcase\headtimingmode\hbox{#2}\fi
+ \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}%
+ \endstrut}% \hbox prevents break
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdepth
+ \else
+ \ifcase\headtimingmode#2\fi % inside textcommand ?
+ \getvalue{\??ko#1\c!textcommand}%
+ {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}}%
+ \fi
+ \getvalue{\??ko#1\c!commandafter}%
+ \ifdisplaysectionhead\endgraf\fi
+ \dostopattributes}}%
+ \fi
+ \endheadplacement{#1}{#5}}
+
+
+
+%D \starttyping
+%D \def\StretchedBox#1%
+%D {\framed
+%D [frame=off,offset=.5em,align=middle,width=broad]
+%D {\sc\def\stretchedspaceamount{.3em}\stretchednormalcase{#1}}}
+%D
+%D \definehead[MySubject][subject]
+%D \setuphead [MySubject][deeptextcommand=\StretchedBox]
+%D
+%D \MySubject{feeling stretched feeling stretched feeling stretched feeling stretched}
+%D \stoptyping
+
+\newsignal\headsignal
+\let\headlastlinewidth\!!zeropoint
+
+\def\beginheadplacement#1%
+ {\bgroup
+ \setsystemmode{#1}% to be documented
+ \ifgridsnapping\iftracegridsnapping\showstruts\fi\fi
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdp
+ \everypar\emptytoks % needed indeed
+ \noindent % ipv \whitespace elders, na \forgetall !
+ \bgroup
+ \doifinsetelse{\getvalue{\??ko#1\c!aligntitle}}{\v!yes,\v!float}% new
+ {\skip0 1\leftskip
+ \skip2 1\rightskip
+ \xdef\localheadskip{\the\skip0}%
+ \forgetall
+ \leftskip\skip0
+ \rightskip\skip2
+ \setlocalhsize\hsize\localhsize
+ \forgetbothskips}
+ {\globallet\localheadskip\!!zeropoint
+ \forgetall}%
+ \dontcomplain
+ \postponefootnotes
+ \iflocation\ifdisplaysectionhead\else\noninterferingmarks\fi\fi
+ \resetinteractionparameter\c!style
+ \resetinteractionparameter\c!color
+ \resetinteractionparameter\c!contrastcolor
+ \strictouterreferencestrue % tzt instelling
+ \def\localheadsetup{\dolocalheadsetup{#1}}%
+ \startsynchronization}
+
+% \setuphead[chapter] [style=\bfd,after=,hang=line] % fit broad 2
+% \setuphead[section] [style=\bfc,after=,hang=line]
+% \setuphead[subsection] [style=\bfb,after=,hang=line]
+% \setuphead[subsubsection] [style=\bfa,after=,hang=line]
+% \setuphead[subsubsubsection][style=\bf ,after=,hang=line]
+%
+% \chapter {Test} \input tufte \page
+% \section {Test} \input tufte \page
+% \subsection {Test} \input tufte \page
+% \subsubsection {Test} \input tufte \page
+% \subsubsubsection{Test} \input tufte \page
+%
+% \chapter {Test\\Test} \input tufte \page
+% \section {Test\\Test} \input tufte \page
+% \subsection {Test\\Test} \input tufte \page
+% \subsubsection {Test\\Test} \input tufte \page
+% \subsubsubsection{Test\\Test} \input tufte \page
+
+\def\hangheadplacement
+ {\scratchdimen\localheadlineheight
+ \bgroup
+ \openlineheight\scratchdimen
+ \scratchdimen\ht0
+ \advance\scratchdimen\dp0
+ \getnoflines\scratchdimen
+ \advance\noflines\minusone
+ \expanded{\egroup\noflines\the\noflines}% brrr
+ \setbox0\hbox{\lower\noflines\scratchdimen\box0}%
+ \scratchdimen\ht0
+ \advance\scratchdimen\dp0
+ \advance\scratchdimen-\localheadheight
+ \advance\scratchdimen+\strutdp
+ \ht0 \strutht
+ \dp0 \strutdp
+ \edef\localheaddepth{\the\strutdp}}
+
+\newconditional\continuoussectionhead % oeps, \newif\ifcontinuoushead got lost
+
+\def\endheadplacement#1#2%
+ {\doifelsevalue{\??rf#1\c!state}\v!start
+ {\doifvaluenothing{\??ko#1\c!file}{\autocrossdocumentfalse}}
+ {\autocrossdocumentfalse}%
+ % no message needed here, should be a proper switch
+ \noflines\zerocount
+ \ifdisplaysectionhead
+ % new (tod tight == one following line up)
+ \processaction
+ [\getvalue{\??ko#1\c!hang}]
+ [ \v!line=>\hangheadplacement\noflines\zerocount,
+ \v!broad=>\hangheadplacement\getnoflines\scratchdimen,
+ \v!fit=>\hangheadplacement\getrawnoflines\scratchdimen,
+ \v!none=>\noflines\zerocount,
+ \v!default=>\noflines\zerocount,
+ \v!unknown=>\hangheadplacement\noflines0\commalistelement\advance\noflines\minusone]%
+ % so far
+ \let\headlastlinewidth\!!zeropoint
+ \snaptogrid[\getvalue{\??ko#1\c!grid}]\hbox
+ {\hskip\localheadskip
+ \hskip\getvalue{\??ko#1\c!margin}\relax
+ \iflocation
+ \ifautocrossdocument
+ \doifreferencefoundelse{\getvalue{\??ko#1\c!file}::#1}
+ {\edef\currentinnerreference{\s!aut:\currenttextreference}% stored in
+ \gotoouterlocation{}{\box0}} % text slot
+ {\hbox{\box0}}%
+ \else
+ \hbox{\box0}%
+ \fi
+ \else
+ \hbox{\box0}%
+ \fi}%
+ \doflushnotes % new, not really needed
+ \endgraf
+ \ifvmode
+ \ifnum\noflines>\zerocount
+ \dorecurse\noflines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}%
+ \fi
+ \nointerlineskip
+ \dosomebreak\nobreak
+ \fi
+ #2%
+ \else
+ \strut
+ \doflushnotes % new, here since we're in par mode
+ \iflocation
+ \ifautocrossdocument
+ \hhboxindent=\ifconditional\continuoussectionhead\headlastlinewidth\else\zeropoint\fi
+ \unhhbox0\with{\gotobox{\box\hhbox}[\getvalue{\??ko#1\c!file}::#1]}%
+ \advance\lasthhboxwidth by \numberheaddistance
+ \xdef\headlastlinewidth{\the\lasthhboxwidth}%
+ \else
+ \unhbox0
+ \globallet\headlastlinewidth\!!zeropoint
+ \fi
+ \else
+ \unhbox0
+ \globallet\headlastlinewidth\!!zeropoint
+ \fi
+ #2%
+ \dimen0=\numberheaddistance
+ \hskip\dimen0 \!!plus \dimen0 \!!minus .25\dimen0
+ \hskip\headsignal\ignorespaces
+ \fi
+ \ifdisplaysectionhead \ifvmode
+ \ifgridsnapping % important, font related depth, see comment
+ \prevdepth\strutdp
+ \else
+ \prevdepth\localheaddepth
+ \fi
+ \fi \fi
+ \stopsynchronization
+ \egroup
+ \egroup
+ \ifdisplaysectionhead
+ \dochecknextindentation{\??ko#1}%
+ \else
+ \nonoindentation % recently added, was a bug
+ \fi}
+
+\def\checknexthead#1#2% nog optioneel
+ {\ifhmode
+ \scratchcounter=\lastpenalty\unpenalty % no beauty in this
+ \ifdim\lastskip=\headsignal
+ \handlenopagebreak{#1}%
+ \global\settrue\continuoussectionhead
+ \else
+ \penalty\scratchcounter
+ \global\setfalse\continuoussectionhead
+ #1{#2}%
+ \fi
+ \else
+ \global\setfalse\continuoussectionhead
+ #1{#2}%
+ \fi}
+
+\def\dosetupheadnumber[#1][#2#3]% todo: = (don't reset)
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \doifinstringelse{#2}{+-}
+ {\doifelsenothing{#3}
+ {\@@nextsectionnumber\@@sectie}
+ {\!!counta=#2#3\relax
+ \advance\!!counta \@@sectionvalue\@@sectie
+ \@@setsectionnumber\@@sectie\!!counta}}
+ {\@@setsectionnumber\@@sectie{#2#3}}%
+ \egroup}
+
+\def\setupheadnumber
+ {\dodoubleargument\dosetupheadnumber}
+
+\def\currentheadnumber{0}
+
+\def\determineheadnumber[#1]%
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
+ \egroup}
+
+\def\complexheadnumber[#1]%
+ {\bgroup
+ \edef\currentheadnumber{#1}%
+ \doifinsetelse{-}{#1} % br undocumented
+ {\removefromcommalist{-}\currentheadnumber % br
+ \setsectieenkoppeling\currentheadnumber
+ \setupsection[\@@sectie][\c!previousnumber=\v!no]}%
+ {\setsectieenkoppeling\currentheadnumber}%
+ \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
+ \doifnot{\currentheadnumber}{0}{\finalsectionnumber}%
+ \egroup}
+
+\def\simpleheadnumber
+ {\currentheadnumber}
+
+\definecomplexorsimple\headnumber
+
+\def\alinea
+ {\par}
+
+% nice testcase
+%
+% \setupheads[aligntitle=yes]
+%
+% \startnarrower
+% \subject{\dorecurse{100}{x }}
+% \section{\dorecurse{100}{x }}
+% \input tufte \par
+% \setupheads[alternative=inmargin]
+% \subject{\dorecurse{100}{x }}
+% \section{\dorecurse{100}{x }}
+% \input tufte \par
+% \stopnarrower
+
+\let\numberheadalternative\v!normal
+
+\def\defineheadplacement
+ {\dodoubleargument\dodefineheadplacement}
+
+\def\dodefineheadplacement[#1][#2]% #3#4
+ {\setvalue{\??ko:#1}{#2}%
+ \setvalue{\??ko::#1}}
+
+\def\normalplacehead
+ {\executeifdefined
+ {\??ko::\numberheadalternative}
+ {\getvalue{\??ko::\v!normal}}}
+
+\defineheadplacement[\v!paragraph][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut\ifheadnumbercontent#1\hskip\numberheaddistance\fi#2}}
+
+% \defineheadplacement[\v!normal][\v!vertical]#1#2%
+% {\ifheadnumbercontent
+% \setbox0\hbox{{#1}\hskip\numberheaddistance}%
+% \vbox
+% {\localheadsetup
+% \hangindent 1\wd0
+% \hangafter 1
+% \noindent
+% \unhbox0 % don't use \strut's here!
+% #2}%
+% \else
+% \vbox
+% {\localheadsetup\noindent#2}%
+% \fi}
+%
+% enhanced version:
+
+% \setuphead
+% [chapter]
+% [numberwidth=2cm,hang=line,after={\blank[3*line]}]
+%
+% \chapter{Oeps oeps oeps} \input tufte \section{Oeps}
+% \chapter{Oeps oeps oeps} \section{Oeps} \input tufte
+
+\defineheadplacement[\v!normal][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \edef\headwidth {\headparameter\c!width }%
+ \edef\headnumberwidth{\headparameter\c!numberwidth}%
+ \edef\headtextwidth {\headparameter\c!textwidth }%
+ \ifheadnumbercontent
+ \ifx\headwidth\empty
+ \else
+ \ifx\headnumberwidth\empty
+ \ifx\headtextwidth\empty\else
+ \edef\headnumberwidth{\the\dimexpr\headwidth-\headtextwidth\relax}%
+ \fi
+ \else
+ \ifx\headtextwidth\empty
+ \edef\headtextwidth{\the\dimexpr\headwidth-\headnumberwidth\relax}%
+ \fi
+ \fi
+ \hsize\headwidth
+ \fi
+ \ifx\headnumberwidth\empty\else
+ \let\numberheaddistance\!!zeropoint
+ \fi
+ \setbox\scratchbox\hbox \ifx\headnumberwidth\empty\else to \headnumberwidth\fi{{#1}}%
+ \scratchdimen\dimexpr\wd\scratchbox+\numberheaddistance\relax
+ \ifx\headtextwidth\empty\else
+ \hsize\dimexpr\scratchdimen+\headparameter\c!textwidth\relax
+ \fi
+ \hangindent\scratchdimen
+ \hangafter \plusone
+ \noindent
+ \box\scratchbox\hskip\numberheaddistance
+ \else
+ \ifx\headtextwidth\empty
+ \ifx\headwidth\empty
+ \else
+ \hsize\headwidth
+ \fi
+ \else
+ \hsize\headtextwidth
+ \fi
+ \noindent
+ \fi
+ #2}}
+
+\def\placeheadmargin#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut % use one \strut here!
+ \dontleavehmode % in case there is no strut, else side effects with llap
+ \ifheadnumbercontent
+ \llap{\hbox to 5em{\hfill{#1}\hskip\localheadskip\hskip\leftmargindistance}}% introduces whitespace
+ % maybe better:
+ % \inleftmargin{\hbox{\hss{#1}\hskip\localheadskip}}%
+ \fi
+ {#2}}}
+
+\defineheadplacement[\v!inmargin][\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
+\defineheadplacement[\v!margin] [\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
+
+\defineheadplacement[\v!middle][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \veryraggedcenter
+ \let\\\endgraf
+ \let\crlf\endgraf
+ \ifheadnumbercontent\strut#1\par\fi\begstrut#2}}
+
+\defineheadplacement[\v!text][\v!horizontal]#1#2%
+ {\bgroup
+ \localheadsetup % no stretch in distance
+ \ifheadnumbercontent{#1}\kern\numberheaddistance\fi{\begstrut#2}%
+ \egroup}
+
+\def\placeheadlohi#1#2#3%
+ {\ifheadnumbercontent
+ \setbox0\hbox{#2}
+ \setbox2=#1{\localheadsetup\advance\hsize-\wd0\relax#3}%
+ \hbox{\box0\hskip\numberheaddistance\box2}%
+ \else
+ #1{\localheadsetup\noindent#3}%
+ \fi}
+
+% onder/boven lijnt het nummer op de onderste/bovenste regel
+% uit van een meerregelige kop
+
+\defineheadplacement[\v!bottom][\v!vertical]#1#2{\placeheadlohi\vbox{#1}{#2}}
+\defineheadplacement[\v!top] [\v!vertical]#1#2{\placeheadlohi\vtop{#1}{#2}}
+
+% default == instellingen
+% koppeling == koppen, breaks, marks, enz.
+% sectie == nummering
+
+\let\@@kolist=\empty
+
+\def\dododefinehead#1#2% % don't preset prefix to much
+ {\presetlabeltext[#1=]%
+% \getparameters
+% [\??ko#1]
+% [\c!numberstyle=\getvalue{\??ko#1\c!style},
+% \c!textstyle=\getvalue{\??ko#1\c!style},
+% \c!numbercolor=\getvalue{\??ko#1\c!color},
+% \c!textcolor=\getvalue{\??ko#1\c!color}]%
+ % deeptextcommand and deepnumbercommand are left undefined !
+ \doifassignmentelse{#2}
+ {\getparameters
+ [\??ko#1]
+ [\c!section=\getvalue{\??ko\getvalue{\??ko#1\c!coupling}\c!section},
+\c!numberstyle=,
+\c!textstyle=,
+\c!numbercolor=,
+\c!textcolor=,
+ \c!default=,
+ \c!coupling=,
+ \c!prefix=,
+ \c!before=,
+ \c!after=,
+ \c!distance=\!!zeropoint,
+ \c!page=,
+ \c!header=,
+ \c!text=,
+ \c!footer=,
+ \c!style=,
+ \c!numbercommand=,
+ \c!textcommand=,
+ \c!ownnumber=\v!no,
+ \c!number=\v!yes,
+ \c!color=,
+ \c!continue=\v!yes,
+ \c!placehead=\v!yes,
+ \c!resetnumber=\v!yes,
+ \c!incrementnumber=\v!yes,
+ \c!alternative=\@@koalternative,
+ \c!command=\normalplacehead,
+ \c!separator=\@@koseparator,
+ \c!stopper=\@@kostopper,
+ \c!align=\@@koalign,
+ \c!aligntitle=\@@koaligntitle,
+ \c!tolerance=\@@kotolerance,
+ \c!indentnext=\@@koindentnext,
+ \c!strut=\@@kostrut,
+ \c!hang=\@@kohang,
+ \c!file=,
+ \c!expansion=,
+ \c!grid=,
+ \c!margintext=,
+ \c!margin=\@@komargin,
+ #2]%
+ \ConvertToConstant\doifnot{#1}{\getvalue{\??ko#1\c!default}}
+ {\doifsomething{\getvalue{\??ko#1\c!default}}
+ {\copyparameters
+ [\??ko#1][\??ko\getvalue{\??ko#1\c!default}]
+ [\c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
+ \c!header,\c!text,\c!footer,\c!separator,\c!stopper,\c!resetnumber,
+ \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
+ \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
+ % new per 20/03/3002 (o-pbu-l) / was too confusing
+ % \c!numberstyle,\c!textstyle,\c!expansion,
+ % again too confusing
+ \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
+ \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]}}%
+ \getparameters[\??ko#1][#2]%
+ \doifsomething{\getvalue{\??ko#1\c!section}}
+ {\doifelsemarking{#1}% \doifundefined{\??mk#1}
+ {}% marking #1 already defined
+ {\definemarking[#1]%
+ \couplemarking[#1][\getvalue{\??ko#1\c!section}]%
+ \definemarking[#1\v!number]%
+ \couplemarking[#1\v!number][\getvalue{\??ko#1\c!section}]}}%
+ \doifundefined{\??li#1}{\definelist[#1]}}
+ {\ConvertToConstant\doifelse{#1}{#2}
+ {\doifundefined{\??li#1}{\definelist[#1]}}
+ {\copyparameters
+ [\??ko#1][\??ko#2]
+ [\c!level,\c!section,\c!coupling,\c!prefix,
+ \c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
+ \c!separator,\c!stopper,
+ \c!header,\c!text,\c!footer,\c!resetnumber,
+ \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
+ \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
+ % new per 20/03/3002 (o-pbu-l) / was too confusing
+ % \c!numberstyle,\c!textstyle,\c!expansion,
+ % again too confusing
+ \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
+ \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]%
+ \getparameters[\??ko#1][\c!expansion=]% iig een value, rather fuzzy
+ \definemarking[#1][#2]%
+ \definemarking[#1\v!number][#2\v!number]%
+ \doifundefined{\??li#1}{\definelist[#1][#2]}}}%
+ \addtocommalist{#1}\@@kolist
+ \setevalue{\??sk#1}{\getvalue{\??ko#1\c!coupling}}%
+ \setevalue{\??by#1}{\getvalue{\??ko#1\c!section}}%
+ \setevalue{\??by\v!by#1}{\getvalue{\??ko#1\c!section}}%
+ \setvalue{#1}{\dodoubleempty\doconstructhead[#1]}}
+
+\def\dodefinehead[#1][#2]%
+ {\doifelsenothing{#2}
+ {% todo: message that it's an invalid definition
+ \setvalue{#1}{\endgraf[#1]\kern.5em}}
+ {\doifassignmentelse{#2}
+ {\dododefinehead{#1}{#2}}
+ {\doifdefined{\??ko#2\c!section}
+ {\dododefinehead{#1}{#2}}}}}
+
+\def\definehead
+ {\dodoubleemptywithset\dodefinehead}
+
+\def\doconstructhead[#1][#2]%
+ {\dowithpargument{\dodoconstructhead{#1}[#2]}}
+
+\def\dosetuphead[#1][#2]%
+ {\getparameters[\??ko#1][#2]%
+ % The next check prevents hard to trace problems. I once
+ % set \c!command to nothing and (quite natural) got the
+ % wrong references etc. The whole bunch should be boxed!
+ \expandafter\defconvertedcommand\expandafter\ascii\csname\??ko#1\c!command\endcsname
+ \doifnothing\ascii{\setvalue{\??ko#1\c!command}{\normalplacehead}}}
+
+\def\setuphead
+ {\dodoubleargumentwithset\dosetuphead}
+
+\def\dosetupheads[#1]%
+ {\getparameters[\??ko][#1]%
+ \doifelse{\@@kosectionnumber}\v!yes\sectionnumbertrue\sectionnumberfalse}
+
+\def\setupheads
+ {\dosingleargument\dosetupheads}
+
+\def\systemsuppliedchapter {\getvalue{\v!chapter}}
+\def\systemsuppliedtitle {\getvalue{\v!title}}
+
+% a left over
+
+\def\complexbijlage[#1]#2%
+ {\page[\v!right]
+ \setuppagenumbering[\c!state=\v!stop]
+ \systemsuppliedchapter[#1]{#2}
+ \page[\v!right]
+ \setuppagenumbering[\c!state=\v!start]
+ \setuppagenumbering[\c!number=1]}
+
+\setvalue{\v!appendix}%
+ {\complexorsimpleempty\bijlage}
+
+\setupheads
+ [\c!alternative=\v!normal,
+ \c!sectionnumber=\v!yes,
+ \c!separator=.,
+ \c!stopper=,
+ \c!limittext=\v!yes,
+ \c!align=,
+ \c!aligntitle=,
+ \c!tolerance=,
+ \c!strut=,
+ \c!indentnext=\v!no,
+ \c!margin=\zeropoint,
+ \c!hang=\v!none,
+ \c!command=]
+
+\definesectionblock [\v!frontpart] [\v!frontmatter] [\c!number=\v!no]
+\definesectionblock [\v!bodypart] [\v!bodymatter] [\c!number=\v!yes]
+\definesectionblock [\v!appendix] [\v!appendices] [\c!number=\v!yes]
+\definesectionblock [\v!backpart] [\v!backmatter] [\c!number=\v!no]
+
+\definesection[\s!section-1] % part
+\definesection[\s!section-2] % chapter
+\definesection[\s!section-3] % section
+\definesection[\s!section-4] % subsection
+\definesection[\s!section-5] % subsubsection
+\definesection[\s!section-6] % subsubsubsection
+\definesection[\s!section-7] % subsubsubsubsection
+
+% \c!eigennummer ook hier?
+
+\definehead
+ [\v!part]
+ [\c!section=\s!section-1,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!chapter]
+ [\c!section=\s!section-2,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!section]
+ [\c!section=\s!section-3,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsection]
+ [\c!section=\s!section-4,
+ \c!default=\v!section,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsection]
+ [\c!section=\s!section-5,
+ \c!default=\v!subsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsection]
+ [\c!section=\s!section-6,
+ \c!default=\v!subsubsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsection]
+ [\c!section=\s!section-7,
+ \c!default=\v!subsubsubsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!title]
+ [\c!coupling=\v!chapter,
+ \c!default=\v!chapter,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subject]
+ [\c!coupling=\v!section,
+ \c!default=\v!section,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubject]
+ [\c!coupling=\v!subsection,
+ \c!default=\v!subsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubject]
+ [\c!coupling=\v!subsubsection,
+ \c!default=\v!subsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubject]
+ [\c!coupling=\v!subsubsubsection,
+ \c!default=\v!subsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsection,
+ \c!default=\v!subsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\setupsection
+ [\s!section-2]
+ [\v!appendix\c!conversion=\v!Character,
+ \c!previousnumber=\v!no]
+
+\setuphead
+ [\v!part]
+ [\c!placehead=\v!no]
+
+\setuphead
+ [\v!chapter]
+ [\v!appendix\c!label=\v!appendix,
+ \v!bodypart\c!label=\v!chapter] % bijlageconversie=\Character
+
+\setuphead
+ [\v!section]
+ [\v!appendix\c!label=\v!section,
+ \v!bodypart\c!label=\v!section] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsection]
+ [\v!appendix\c!label=\v!subsection,
+ \v!bodypart\c!label=\v!subsection] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsubsection]
+ [\v!appendix\c!label=\v!subsubsection,
+ \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character
+
+\setuphead
+ [\v!part,\v!chapter]
+ [%\c!align=,
+ %\c!indentnext=\v!no,
+ \c!continue=\v!no,
+ \c!page=\v!right,
+ \c!header=,
+ \c!style=\tfc,
+ \c!distance=.75em,
+ \c!before={\blank[2*\v!big]},
+ \c!after={\blank[2*\v!big]}]
+
+\setuphead
+ [\v!section]
+ [%\c!align=,
+ %\c!indentnext=\v!no,
+ \c!style=\tfa,
+ \c!distance=.75em,
+ \c!before={\blank[2*\v!big]},
+ \c!after=\blank]
+
+\setuphead % nieuw
+ [\v!subsection]
+ [\c!page=]
+
+\definecombinedlist
+ [\v!content]
+ [\v!part,
+ \v!chapter,
+ \v!section,
+ \v!subsection,
+ \v!subsubsection,
+ \v!subsubsubsection,
+ \v!subsubsubsubsection]
+ [\c!level=\v!subsubsubsubsection,
+ \c!criterium=\v!local]
+
+\setuplist
+ [\v!part]
+ [\c!before={\blank\page[\v!preference]},
+ \c!after=\blank,
+ \c!label=\v!yes,
+ \c!separator=:,
+ \c!distance=1em]
+
+\setuplist
+ [\v!chapter]
+ [\c!before={\blank\page[\v!preference]},
+ \c!after=]
+
+\setuplist [\v!part] [\c!width=0em]
+\setuplist [\v!chapter] [\c!width=2em]
+\setuplist [\v!section] [\c!width=3em]
+\setuplist [\v!subsection] [\c!width=4em]
+\setuplist [\v!subsubsection] [\c!width=5em]
+\setuplist [\v!subsubsubsection] [\c!width=6em]
+\setuplist [\v!subsubsubsubsection] [\c!width=7em]
+
+% hm
+
+\setuppagenumbering % na instellen hoofdteksten !
+ [\c!alternative=\v!singlesided,
+ \c!location={\v!header,\v!middle},
+ \c!conversion=\v!numbers,
+ \c!width=, % in geval van \v!marginedge
+ \c!left=,
+ \c!right=,
+ \c!way=\v!by\v!part,
+ \c!text=,
+ \v!chapter\v!number=\v!no, % v
+ \v!part\v!number=\v!yes, % v
+ \c!numberseparator=--,
+ \c!textseparator=\tfskip,
+ \c!state=\v!start,
+ \c!command=,
+ \c!strut=\v!yes, % nieuw
+ \c!style=, % \v!normal, % empty, otherwise conflict
+ \c!color=]
+
+\protect \endinput
diff --git a/tex/context/base/core-sec.tex b/tex/context/base/core-sec.tex
deleted file mode 100644
index 391c04a40..000000000
--- a/tex/context/base/core-sec.tex
+++ /dev/null
@@ -1,2629 +0,0 @@
-%D \module
-%D [ file=core-sec,
-%D version=1997.03.31,
-%D title=\CONTEXT\ Core Macros,
-%D subtitle=Sectioning,
-%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.
-
-% start-stop per section en dan combineren met sectieblok; in dat geval
-% eenvoudiger per-* acties
-
-% nummeren per sectieblok implementeren
-
-% this module needs a clean up, currently some manipulations
-% take place multiple times; also, some clever recursive level
-% thing makes more sense
-
-% in manual (zie prikkels) : tussen=\blanko is enige hook om
-% met kop-in-hoofd een spatiering af te dwingen
-
-\writestatus{loading}{Context Core Macros / Sectioning}
-
-\startmessages dutch library: structures
- title: structuur
- 1: begin van sectieblok --
- 2: eind van sectieblok --
-\stopmessages
-
-\startmessages english library: structures
- title: structure
- 1: begin of sectionblock --
- 2: end of sectionblock --
-\stopmessages
-
-\startmessages german library: structures
- title: struktur
- 1: Begin des Abschnittsblocks --
- 2: Ende des Abschnittsblocks --
-\stopmessages
-
-\startmessages czech library: structures
- title: struktury
- 1: zacatek oddilu (sekce) --
- 2: konec oddilu (sekce) --
-\stopmessages
-
-\startmessages italian library: structures
- title: struttura
- 1: inizio del blocco (sezione) --
- 2: fine del blocco (sezione) --
-\stopmessages
-
-\startmessages norwegian library: structures
- title: struktur
- 1: starten av blokk -- (seksjon)
- 2: slutten av blokk -- (seksjon)
-\stopmessages
-
-\startmessages romanian library: structures
- title: structuri
- 1: inceput de bloc sectiune --
- 2: sfarsit de bloc sectiune --
-\stopmessages
-
-\startmessages french library: structures
- title: structure
- 1: début de blocsection --
- 2: fin de blocsection --
-\stopmessages
-
-\unprotect
-
-% new and to be tested
-
-\unexpanded\def\separatorlist#1%
- {\ifx\sepnumber\undefined\def\sepnumber{0}\fi
- \increment\sepnumber
- \getfromcommacommand[#1][\sepnumber]%
- \ifx\commalistelement\empty
- \getcommalistsize[#1]%
- \def\sepnumber{\number\commalistsize}%
- \getfromcommacommand[#1][\sepnumber]%
- \fi
- \commalistelement}
-
-% \setuphead[section] [separator=\separatorlist{?,!,*}]
-% \setuphead[subsection][separator=\separatorlist{??,!!,**}]
-%
-% \let\spr\separatorlist % this will enable this feature
-%
-% \setuphead[section] [separator={?,!,*}]
-% \setuphead[subsection][separator={??,!!,**}]
-%
-% \setupheads[separator={A,B,C,D,E,F}]
-% \chapter{test}
-% \section{test} \subsection{test} \subsection{test}
-% \section{test} \subsection{test} \subsection{test}
-
-% from now on, internaly numbers are separated by a period
-% and postprocessed on demand; this will change to {} {} {}
-
-\def\numberseparator {.} % reasonable default
-\def\sectionseparator{-} % was : but is now -
-
-\def\@@filterfirstpart [#1--#2]{#1}
-\def\@@filtersecondpart [#1--#2]{#2}
-
-\def\@@filterblockpart [#1--#2--#3]{#1}
-\def\@@filternumberpart [#1--#2--#3]{#2}
-\def\@@filterpagepart [#1--#2--#3]{#3}
-\def\@@filterblocknumberpart[#1--#2--#3]{#1--#2}
-
-\def\@@filterheadpart[#1]{\@EA\@@dofilterheadpart\@EA[#1-0]}
-\def\@@filtertailpart[#1]{\@EA\@@dofiltertailpart\@EA[#1-0]}
-
-\def\@@dofilterheadpart[#1-#2]{#1}
-\def\@@dofiltertailpart[#1-#2]{#2}
-
-\def\@@filterlevelpart[#1--#2--#3]{\@@dofilterlevelpart[#2-0-0-0-0]}
-
-\def\@@dofilterlevelpart[#1-0-0-0-#2]{#1}
-
-\def\gobbleuntilrelax#1\relax{}
-
-\def\separatednumber #1{\doseparatednumber #1.\empty\relax}
-\def\removefirstprefix#1{\doremovefirstprefix#1.\empty\relax}
-\def\removeallprefixes#1{\doremoveallprefixes#1.\empty\relax}
-
-\def\doseparatednumber#1.#2%
- {#1%
- \ifx#2\empty
- \@EA\gobbleuntilrelax
- \else \numberseparator
- \@EA\doseparatednumber
- \fi#2}
-
-\def\doremoveallprefixes#1.#2%
- {\ifx#2\empty
- #1\@EA\gobbleuntilrelax
- \else
- \@EA\doremoveallprefixes
- \fi#2}
-
-\def\doremovefirstprefix#1.#2%
- {\ifx#2\empty
- #1\@EA\gobbleuntilrelax
- \else
- \@EA\noremovefirstprefix
- \fi#2}
-
-\def\noremovefirstprefix#1.\empty\relax
- {#1}
-
-% we need to expand in order to get something separatable
-
-\def\dohandleheadnumber#1%
- {\expanded{\separatednumber{#1}}}
-
-\def\dodochecknumber#1#2#3% will become ugly after speed up
- {\bgroup
- \doifinstringelse{.0}{.#2}
- {\doifnot{#3}\v!by
- {%\debuggerinfo\m!systems{number #1 #3 becomes \getnumbervariable{#1\c!way}}%
- \setevalue{\@@thenumber{#1}\c!way}{#3}% geen \xdef, gaat mis met \subpage
- \dochecknumber{#1}}} % tricky and ugly
- {\doifnotvalue{\@@thenumber{#1}\s!check}{#2}
- {% new, calculate accumulated number
- \scratchcounter\getvalue{\@@thenumber{#1}\c!n}\relax
- \advance\scratchcounter\countervalue{\@@thenumber{#1}}\relax
- \setxvalue{\@@thenumber{#1}\c!n}{\the\scratchcounter}%
- %
- \setcounter{\@@thenumber{#1}}{0\getvalue{\@@thenumber{#1}\c!start}}%
- \setxvalue{\@@thenumber{#1}\c!way\c!local}{\getvalue{\@@thenumber{#1}\c!way}}%
- \setxvalue{\@@thenumber{#1}\s!check}{#2}}}%
- \egroup}
-
-\def\dochecknumber#1%
- {\edef\currentsection{\csname\??by\csname\@@thenumber{#1}\c!way\endcsname\endcsname}%
- \ifx\currentsection\empty\else
- \dodochecknumber
- {#1}%
- {\csname\currentsection\c!number\endcsname}%
- {\v!by\previoussection\currentsection}%
- \fi}
-
-\def\checknumber[#1]%
- {\bgroup
- %\ifcase\blocklevel\else
- \ifdoingblocks
- \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
- \fi
- \dochecknumber{#1}%
- \egroup}
-
-\def\rawsectionnumber#1%
- {\countervalue{\??se#1}}
-
-\def\precedingseparator{\@@koseparator} % brrr
-
-\def\domakeprecedingsectionnumber[#1]% will become ugly after speed up
- {\bgroup % added
- \globallet\precedingsectionnumber\empty
- \ifsectionnumber
- \doifvalue{\??sb\@@sectionblock\c!number}\v!yes % added
- {\doifelsevalue{\@@thenumber{#1}\c!sectionnumber}\v!yes
- \donetrue\donefalse
- \doifvalue{\@@thenumber{#1}\c!sectionnumber}\v!number
- {\donetrue\let\@@sectionconversion\gobbleoneargument}%
- \ifdone
- \edef\currentsection
- {\getvalue{\??by\getvalue{\@@thenumber{#1}\c!way\c!local}}}%
- \doifnot\currentsection\zerosection
- {\doifnot{\@@sectionvalue\currentsection}{0}
- {\xdef\precedingsectionnumber
- {\getvalue{\currentsection\c!number}%
- \spr{\precedingseparator}}}}%
- \fi}%
- \fi
- \egroup}
-
-\def\makeprecedingsectionnumber[#1]%
- {\bgroup
- %\ifnum\blocklevel>0
- %\ifcase\blocklevel\else
- \ifdoingblocks
- \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
- \fi
- \domakeprecedingsectionnumber[#1]%
- \egroup}
-
-% \def\makesectionnumber[#1]%
-% {\makeprecedingsectionnumber[#1]%
-% \xdef\composedsectionnumber%
-% {\precedingsectionnumber\convertednumber[#1]}}%
-%
-% hack needed for chinese and oldstyle in normal tex, will change
-
-\def\makesectionnumber[#1]%
- {\bgroup
- \forceunexpanded % i don't like this hack
- \makeprecedingsectionnumber[#1]%
- \xdef\composedsectionnumber% was \xdef maar dat gaat fout met font switches
- {\precedingsectionnumber\convertednumber[#1]}%
- \egroup}
-
-% \def\preparethenumber#1#2#3% {\??id#1} \number \result
-% {\doifelsevaluenothing{#1\c!separator}
-% {\let\numberseparator\empty
-% \let#3#2}
-% {% was \unexpanded \edef, but we need it unexpanded !
-% \edef\numberseparator{\spr{\getvalue{#1\c!separator}}}%
-% \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
-% {\edef#3%
-% {\@EA\separatednumber\@EA{#2}%
-% }}%\stp{\getvalue{#1\c!stopper}}}}
-% {\edef#3%
-% {\@EA\separatednumber\@EA{#2}%
-% \spr{\getvalue{#1\c!separator}}%
-% \getvalue{#1\c!suffix}%
-% \stp{\getvalue{#1\c!stopper}}}}}}
-%
-% some day we do a real cleanup
-
-\def\analyzenumber#1#2#3% {\??id#1} \(precedingsection)number \result
- {% was \unexpanded \edef, but we need it unexpanded !
- \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
- {\let \numbersuffix \empty}
- {\edef\numbersuffix{\spr{\getvalue{#1\c!suffix}}}}%
- \doifelsenothing{\executeifdefined{#1\c!stopper}\empty}
- {\let \numberstopper \empty}
- {\edef\numberstopper{\spr{\getvalue{#1\c!stopper}}}}%
- \doifelsenothing{\executeifdefined{#1\c!separator}\empty}
- {\let \numberseparator \empty}
- {\edef\numberseparator{\spr{\getvalue{#1\c!separator}}}}%
- \let\numberprefix\empty}
-
-\def\preparefullnumber#1#2#3% {\??id#1} \(precedingsection)number \result
- {\analyzenumber{#1}#2#3%
- \ifx\numberseparator\empty
- \edef\numberprefix{#2}%
- \else
- \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
- \fi
- \ifx\numbersuffix\empty
- \ifx\numberprefix\empty
- \let #3\empty
- \else
- \edef#3{\numberprefix\numberstopper}%
- \fi
- \else
- \ifx\numberprefix\empty
- \edef#3{\numbersuffix\numberstopper}%
- \else
- \edef#3{\numberprefix\numberseparator\numbersuffix\numberstopper}%
- \fi
- \fi}
-
-\def\prepareprefixnumber#1#2#3% {\??id#1} \number \result
- {\analyzenumber{#1}#2#3%
- \ifx\numberseparator\empty
- \edef\numberprefix{#2}%
- \else
- \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
- \fi
- \let#3\numberprefix}
-
-\def\sectionnumberonly[#1]%
- {\makesectionnumber[#1]%
- \composedsectionnumber}
-
-\def\currentnumber[#1]% kan tekst hier weg ?
- {\dotextprefix{\numberparameter{#1}\c!text}\sectionnumberonly[#1]}
-
-\def\nextnumber[#1][#2][#3]%
- {\incrementnumber[#1]%
- \currentnumber[#1]%
- \rawreference{#2}{#3}{\composedsectionnumber}}
-
-% sectioning
-
-\newcount\nofsections
-
-\let\zerosection \v!text
-\let\firstsection\empty
-\let\lastsection \empty
-\let\@@sectie \empty
-\let\@@koppeling \empty
-
-\makecounter{\??se\v!text}
-
-\letvalueempty{\??se\v!text\c!before}
-\letvalueempty{\??se\v!text\c!after }
-
-\setvalue {\v!text\c!number}{0}
-\letvalueempty{\v!text\s!format}
-
-\letvalueempty{\??sk\v!text}
-\letvalueempty{\??sk }
-
-\letvalue{\??by }\v!text
-\letvalue{\??by\v!text }\v!text
-\letvalue{\??by\v!all }\v!text
-\letvalue{\??by\v!by }\v!text
-\letvalue{\??by\v!by\v!text}\v!text
-\letvalue{\??by\v!by\v!all }\v!text
-\letvalue{\??by\v!by\v!page}\v!text % see footnotes
-
-\def\sectionofhead#1{\executeifdefined{\??ko#1\c!section}\s!unknown}
-
-\def\setupsection
- {\dotripleempty\dosetupsection}
-
-\def\dosetupsection[#1]%
- {\doifdefinedelse{\??se#1}
- {\dodosetupsection[#1]}%
- {\dodosetupsection[\sectionofhead{#1}]}}
-
-\def\dodosetupsection[#1][#2][#3]%
- {\doifdefined{\??se#1}
- {\ifthirdargument
- \getparameters[\??se#1#2][#3]%
- \else
- \getparameters[\??se#1][#2]%
- \fi
- \doifelsevalue{\??se#1\c!previousnumber}\v!yes
- {\setvalue{#1\c!number}{\@@longsectionnumber {#1}}}
- {\setvalue{#1\c!number}{\@@shortsectionnumber{#1}}}}}
-
-\def\docouplemarking[#1][#2]%
- {\doifdefinedelse{\??ko#2\c!section}
- {\docouplemarking[#1][\getvalue{\??ko#2\c!section}]}
- {\def\donexttrackcommando##1%
- {\edef\coupledmarkings{\getvalue{\??se##1\c!marking}}%
- \doifelse{##1}{#2}
- {\addtocommalist{#1}\coupledmarkings}
- {\removefromcommalist{#1}\coupledmarkings}%
- \setevalue{\??se##1\c!marking}{\coupledmarkings}%
- \donexttracklevel{##1}}%
- \donexttracklevel{\zerosection}}} % \firstsection
-
-\def\couplemarking
- {\dodoubleargument\docouplemarking}
-
-\def\decouplemarking[#1]%
- {\couplemarking[#1][]}
-
-\def\definesection[#1]%
- {\doifundefined{\??se#1}
- {\doifelsenothing\firstsection
- {\def\firstsection{#1}%
- \setevalue{\??se#1\c!before}{\v!text}%
- \setevalue{\??se\v!text\c!after}{#1}}
- {\setevalue{\??se\commalistelement\c!after}{#1}% commalistelement ?
- \setevalue{\??se#1\c!before}{\lastsection}%
- \setevalue{\??se\lastsection\c!after}{#1}}%
- \advance\nofsections \plusone
- \setevalue{\??se#1\c!level}{\the\nofsections}%
- \letvalue{\??se#1\c!after}\empty
- \setvalue{\e!next#1}{\@@nextsectionnumber{#1}}%
- \setvalue{#1\c!number}{\@@longsectionnumber{#1}}%
- \setvalue{#1\s!format}{\@@longformatnumber{#1}}%
- \setevalue{\??by#1}{#1}%
- \setevalue{\??by\v!by#1}{#1}%
- \makecounter{\??se#1}%
- \makecounter{\??se\v!last#1}% GB
- \edef\lastsection{#1}%
- \setvalue{\??sk#1}{#1}%
- \letvalue{\??se#1\c!marking}\empty
- \setupsection[#1][\c!previousnumber=\v!yes]}}%
-
-\def\previoussection#1{\csname\??se#1\c!before\endcsname}
-\def\nextsection #1{\csname\??se#1\c!after \endcsname}
-
-\let\preservedsection\v!unknown % \def\preservedsection{\firstsection}
-
-\def\checkpreservevalueafter#1% GB
- {\ifnum\getvalue{\??se#1\c!level}<\nofsections
- \edef\preservedsection{\getvalue{\??se#1\c!after}}%
- \ifconditional\@@resetsubheadnumbers
- \setcounter{\??se\v!last\preservedsection}\zerocount % {0}%
- \else
- \setcounter{\??se\v!last\preservedsection}{\countervalue{\??se\preservedsection}}%
- \fi
- \fi}
-
-\def\@@setsectionnumber#1#2%
- {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
- \setcounter{\??se#1}{#2}%
- \checkpreservevalueafter{#1}% GB
- \resetsectioncounters{#1}%
- \checkpagecounter}
-
-\def\@@nextsectionnumber#1% patched by GB
- {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
- \ifnum\countervalue{\??se\v!last#1}>\zerocount
- \setcounter{\??se#1}{\countervalue{\??se\v!last#1}}%
- \setcounter{\??se\v!last#1}\zerocount % {0}%
- \fi
- \pluscounter{\??se#1}%
- \checkpreservevalueafter{#1}%
- \resetsectioncounters{#1}%
- \checkpagecounter}
-
-\def\@@sectionvalue#1% % nog niet overal doorgevoerd
- {\countervalue{\??se#1}} % zoeken op \??se
-
-% suited for chinese too:
-
-\def\@@sectionconversion#1#2% a doublure with \@@shortsectionnumber
- {\ifnum#2=0 0\else % else troubles with \uchar
- \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
- \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
- #2%
- \else
- \convertnumber{\getvalue{\??se#1\c!conversion}}{#2}%
- \fi
- \else
- \convertnumber{\getvalue{\??se#1\@@sectionblock\c!conversion}}{#2}%
- \fi
- \fi}
-
-% \def\@@sectionlevel#1%
-% {\ifundefined{\??se#1\c!level}0\else\getvalue{\??se#1\c!level}\fi}
-
-\def\@@sectionlevel#1%
- {\executeifdefined{\??se#1\c!level}0}
-
-% Omdat een markering kan worden herdefinieerd moeten we
-% eerst testen of er wel een keten||afhankelijkheid is.
-
-\def\resetsectionmarks#1% can invoke a break
- {\ifundefined{\??se#1}%
- \fastresetmarker[\mainmarking{#1}]% % redundant \mainmarking
- \else
- \let\donexttrackcommando\doresetsectionmarks
- \donexttracklevel{#1}%
- \fi}
-
-\def\doresetsectionmarks#1%
- {\ifundefined{\??se#1\c!marking}\else % skip zero level
- \fastresetmarkerlist[\csname\??se#1\c!marking\endcsname]%
- \fi
- \donexttracklevel{#1}}
-
-% I'm not sure if the next one is better:
-%
-% \def\doresetsectionmarks#1%
-% {\ifundefined{\??se#1\c!markering}% skip zero level
-% \donexttracklevel{#1}%
-% \else
-% \fastresetmarkerlist[\csname\??se#1\c!markering\endcsname]%
-% \fi}
-%
-% and indeed, it isn't, actually, it does not work at all, so let's drop it.
-
-% packaged:
-%
-% \def\resetsectioncounters#1%
-% {\def\donexttrackcommando##1%
-% {\resetcounter{\??se##1}%
-% \donexttracklevel{##1}}%
-% \donexttracklevel{#1}}
-%
-% nicer
-%
-% \def\doresetsectioncounters#1%
-% {\resetcounter{\??se#1}%
-% \donexttracklevel{#1}}
-%
-% obey eigennummer
-
-\def\doresetsectioncounters#1%
- {\resetcounter{\??se#1}%
- \letgvalue{\??se#1\c!ownnumber}\relax
- \donexttracklevel{#1}}
-
-\def\resetsectioncounters % #1
- {\let\donexttrackcommando\doresetsectioncounters
- \donexttracklevel} % #1
-
-% bij checken kan geen prefix worden bekeken, anders vallen
-% er titels buiten de inhoudsopgave
-
-% evt ook level gaan opslaan tbv snelle selectie
-
-% \def\makesectionformat
-% {\edef\sectionformat
-% {\@@sectiontype\sectionseparator
-% \csname\lastsection\s!format\endcsname}}
-
-\unprotected \def\makesectionformat % we don't want eigennummers here
- {\pushmacro\@@shortsectionnumber
- \let\@@shortsectionnumber\@@sectionvalue
- \edef\sectionformat
- {\@@sectiontype\sectionseparator
- \csname\lastsection\s!format\endcsname}%
- \popmacro\@@shortsectionnumber}
-
-\def\dobacktracklevel#1%
- {\doifnot{\previoussection{#1}}\zerosection
- {\dobacktrackcommando{\previoussection{#1}}}}
-
-\def\donexttracklevel#1%
- {\doifnot{#1}\lastsection
- {\donexttrackcommando{\nextsection{#1}}}}
-
-\chardef\alltoclevels\zerocount
-
-\let\currentlevel\empty
-
-\def\dosetcurrentlevel#1%
- {\global\chardef\alltoclevels\zerocount
- \xdef\currentlevel{\getvalue{\lastsection\s!format}}}
-
-\def\dosetpreviouslevel#1%
- {\global\chardef\alltoclevels\plusone
- \globallet\currentlevel\empty
- \def\dobacktrackcommando##1%
- {\ifnum\countervalue{\??se##1}>\zerocount
- \global\chardef\alltoclevels\zerocount
- \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
- \else
- \dobacktracklevel{##1}%
- \fi}%
- \dobacktrackcommando\lastsection}
-
-\def\dosettextlevel#1%
- {\global\chardef\alltoclevels\plusone
- \globallet\currentlevel\empty}
-
-\def\dosetotherlevel#1%
- {\doifdefinedelse{\??ko#1\c!section} % beter alteratief: ook
- {\edef\@@sectie{\getvalue{\??ko#1\c!section}}} % hoofdstuk\c!format
- {\edef\@@sectie{#1}}%
- \doifdefinedelse{\??se\@@sectie}
- {\global\chardef\alltoclevels\zerocount
- \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
- {\global\chardef\alltoclevels\plusone
- \globallet\currentlevel\empty
- \def\dobacktrackcommando##1%
- {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
- \dobacktracklevel{##1}%
- \else
- \ifnum\countervalue{\??se##1}>\zerocount
- \global\chardef\alltoclevels\zerocount
- \xdef\currentlevel{\getvalue{##1\s!format}}%
- \else
- \dobacktracklevel{##1}%
- \fi
- \fi}%
- \dobacktrackcommando\lastsection}}
-
-% \def\ignoresectionconversion % brrr
-% {\let\@@sectionconversion\secondoftwoarguments}
-
-% todo: criterium=appendix|frontmatter|....
-
-\def\dosetfilterlevel#1#2% beware: this one is \let
- {\bgroup
- \let\@@shortsectionnumber\@@sectionvalue
-% \ignoresectionconversion
- \edef\askedlevel{#1}%
- \edef\askedfilter{#2}%
- \ifx\askedlevel\v!current
- \dosetcurrentlevel\askedlevel
- \else\ifx\askedlevel\v!previous
- \dosetpreviouslevel\askedlevel
- \else\ifx\askedlevel\v!all
- \global\chardef\alltoclevels\plusone
- \else\ifx\askedlevel\v!text
- \global\chardef\alltoclevels\plusone
- \else
- \edef\byaskedlevel{\csname\??by\askedlevel\endcsname}%
- \ifx\byaskedlevel\v!text
- \dosettextlevel\askedlevel
- \else
- \dosetotherlevel\askedlevel
- \fi
- \fi\fi\fi\fi
- % experiment
- \ifx\askedfilter\empty \else
- \xdef\currentlevel{\currentlevel\sectionseparator\askedfilter}%
- \fi
- \egroup}
-
-% \def\dontsetfilterlevel#1#2%
-% {\let\currentlevel\somesavedlevel
-% \chardef\alltoclevels\zerocount}
-
-\def\dontsetfilterlevel#1#2%
- {\let\currentlevel\somesavedlevel
- \let\@@sectiontype\@@tocsectiontype
- \chardef\alltoclevels\zerocount}
-
-\def\honorlocalfilterlevel % local lists will be real local
- {\let\dosetfilterlevel\dontsetfilterlevel}
-
-% cleaner
-%
-% \def\doifnextlevelelse[#1::#2]#3#4%
-% {\ifcase\alltoclevels
-% \doifelse{\@@sectiontype}{#1}
-% {\doifinstringelse{=\currentlevel:}{=:#2:}
-% {\doifinstringelse{=\currentlevel:0}{=:#2:}{#4}{#3}}
-% {#4}}
-% {#4}%
-% \else
-% #3%
-% \fi}
-%
-% \def\doifprevlevelelse[#1::#2]#3#4%
-% {\ifcase\alltoclevels
-% \doifelse{\@@sectiontype}{#1}
-% {\doifinstringelse{=\currentlevel:}{=:#2:}{#3}{#4}}
-% {#4}%
-% \else
-% #3%
-% \fi}
-%
-% faster
-%
-% \def\doifnextlevelelse[#1::#2]%
-% {\ifcase\alltoclevels
-% \doifelse{\@@sectiontype}{#1}
-% {\doifinstringelse{=\currentlevel:}{=:#2:}
-% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
-% \donefalse}
-% \donefalse
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-%
-% \def\doifprevlevelelse[#1::#2]%
-% {\ifcase\alltoclevels
-% \doifelse{\@@sectiontype}{#1}
-% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
-% \donefalse
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-%
-% meaner
-%
-% \setuplist
-% [chapter]
-% [after={\startcolumns\placelist[section]\stopcolumns}]
-
-\def\somesavedlevel{0}
-
-% \def\dosavesomelevel[#1:0:0:0:#2]%
-% {\def\somesavedlevel{:#1}}
-
-% \def\doifnextlevelelse[#1::#2]%
-% {\dosavesomelevel[#2:0:0:0:0]%
-% \ifcase\alltoclevels
-% \doifelse{\@@sectiontype}{#1}
-% {\doifinstringelse{=\currentlevel:}{=:#2:}
-% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
-% \donefalse}
-% \donefalse
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-%
-% \def\doifprevlevelelse[#1::#2]%
-% {\dosavesomelevel[#2:0:0:0:0]%
-% \ifcase\alltoclevels
-% \doifelse{\@@sectiontype}{#1}
-% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
-% \donefalse
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-%
-% again faster:
-
-% \def\doifnextlevelelse[#1::#2]% beware: this one is \let
-% {\dosavesomelevel[#2:0:0:0:0]%
-% \ifcase\alltoclevels
-% \ifnum\@@sectiontype=#1
-% \def\levelstring{=:#2:}%
-% \doifincsnameelse{=\currentlevel:}\levelstring
-% {\doifincsnameelse{=\currentlevel:0}\levelstring\donefalse\donetrue}
-% \donefalse
-% \else
-% \donefalse
-% \fi
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-%
-%\def\doifprevlevelelse[#1::#2]% beware: this one is \let
-% {\dosavesomelevel[#2:0:0:0:0]%
-% \ifcase\alltoclevels
-% \ifnum\@@sectiontype=#1
-% \doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse
-% \else
-% \donefalse
-% \fi
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-%
-% \let\doiftoclevelelse\doifnextlevelelse
-% \let\doifreglevelelse\doifprevlevelelse
-% \let\doifblklevelelse\doifprevlevelelse
-%
-% we want to be able to overload them globally
-
-% This will be reimplemented some day soon
-%
-% {nn}{xx}{yy}
-%
-% -> \scan{..}{..}{0} met 0 als sentinel
-
-% still not perfect
-%
-% \def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
-% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
-% \ifcase\alltoclevels
-% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
-% \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
-% \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
-% {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
-% \donefalse
-% \donetrue}
-% \donefalse
-% \else
-% \donefalse
-% \fi
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-%
-% \def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
-% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
-% \ifcase\alltoclevels
-% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
-% \doifinstringelse
-% {=\currentlevel\sectionseparator}
-% {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
-% \donetrue\donefalse
-% \else
-% \donefalse
-% \fi
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-
-\def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
- {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
- \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
- \ifcase\alltoclevels
- \ifnum\@@sectiontype=\@@tocsectiontype\relax
- \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
- \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
- {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
- \donefalse
- \donetrue}
- \donefalse
- \else
- \donefalse
- \fi
- \else
- \donetrue
- \fi
- \ifdone
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
-
-\def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
- {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
- \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
- \ifcase\alltoclevels
- \ifnum\@@sectiontype=\@@tocsectiontype\relax
- \doifinstringelse
- {=\currentlevel\sectionseparator}
- {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
- \donetrue\donefalse
- \else
- \donefalse
- \fi
- \else
- \donetrue
- \fi
- \ifdone
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
-
-% we need to cover the special case of nested lists in section blocks
-%
-% \starttext
-%
-% \def\ChapterEntry#1#2#3%
-% {chapter : \hbox to \hsize{\strut\bf#2\hss#3}\endgraf\placelist[section]}
-%
-% \startfrontmatter % optional
-% \placelist[chapter][alternative=command,command=\ChapterEntry,criterium=text] \page
-% \stopfrontmatter % optional
-%
-% \startbodymatter % optional
-% \chapter{first} \section{one} test \section{two} test \page
-% \chapter{second} \section{alpha} test \section{beta} test \page
-% \stopbodymatter % optional
-%
-% \stoptext
-
-\def\doiftoclevelelse{\doifnextlevelelse}
-\def\doifreglevelelse{\doifprevlevelelse}
-\def\doifblklevelelse{\doifprevlevelelse}
-
-\def\@@longformatnumber#1%
- {\csname\previoussection{#1}\s!format\endcsname
- \sectionseparator
- \@@shortsectionnumber{#1}}
-
-% \def\@@longsectionnumber#1%
-% {\ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
-% \csname\previoussection{#1}\c!nummer\endcsname.%
-% \fi
-% \@@shortsectionnumber{#1}}
-
-\def\@@longsectionnumber#1%
- {\ifreversesectionnumbers
- \@@shortsectionnumber{#1}%
- \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
- .\csname\previoussection{#1}\c!number\endcsname
- \fi
- \else
- \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
- \csname\previoussection{#1}\c!number\endcsname.%
- \fi
- \@@shortsectionnumber{#1}%
- \fi}
-
-% suited for chinese too:
-%
-% \def\@@shortsectionnumber#1%
-% {\@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
-% \@@sectionvalue{#1}%
-% \else
-% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
-% \fi}
-%
-% obey eigennummer
-%
-% \def\@@shortsectionnumber#1%
-% {\@EA\ifx\csname\??se#1\c!eigennummer\endcsname\relax
-% \@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
-% \@EA\ifx\csname\??se#1\c!conversie\endcsname\relax
-% \@@sectionvalue{#1}%
-% \else
-% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
-% \fi
-% \else
-% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
-% \fi
-% \else
-% \csname\??se#1\c!eigennummer\endcsname
-% \fi}
-
-\def\@@shortsectionnumber#1%
- {\@EA\ifx\csname\??se#1\c!ownnumber\endcsname\relax
- \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
- \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
- \@@sectionvalue{#1}%
- \else
- \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
- \fi
- \else
- \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
- \fi
- \else
- \csname\??se#1\c!ownnumber\endcsname
- \fi}
-
-\def\dosetlocalsectionblock#1#2#3% new \edef's
- {\edef\@@sectiontype {#1}%
- \edef\@@sectionblock {#2}%
- \edef\@@sectionblocks{#3}}
-
-% beware, the \resetsectionmarks generates some nodes that
-% will result in an additional last page, which needs to be
-% captured at the end
-
-% \def\doaroundsectionblock#1%
-% {\doifvaluesomething{\??sb#1\c!page}
-% {\ExpandFirstAfter\page[\getvalue{\??sb#1\c!page}]}%
-% \resetsectioncounters\zerosection % was firstsection
-% \resetsectionmarks\zerosection}
-
-% \def\dostartsectionblock#1#2%
-% {\begingroup
-% \doaroundsectionblock{#1}% % going to a new page or so
-% \getvalue{\??sb#1}% % set name of section block
-% \getsectionblockenvironment{#1}% % special settings, grouped
-% %\expandafter\csname#2true\endcsname % obsolete
-% \setsystemmode{#1}% % can be used in conditionals
-% \getvalue{\??sb\@@sectionblock\c!before}% this one is not to be moved!
-% \showmessage\m!structures1\@@sectionblocks}
-
-% \def\dostopsectionblock
-% {\showmessage\m!structures2\@@sectionblocks
-% \getvalue{\??sb\@@sectionblock\c!after}% don't move
-% \doaroundsectionblock\@@sectionblock
-% \endgroup}
-
-\def\doaroundsectionblock
- {\doifvaluesomething{\??sb\@@sectionblock\c!page}
- {\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
- \resetsectioncounters\zerosection % was firstsection
- \resetsectionmarks\zerosection}
-
-\def\dostartsectionblock#1#2%
- {\begingroup
- \getvalue{\??sb#1}%
- \doaroundsectionblock
-% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
-% \resetsectioncounters\zerosection % was firstsection
-% \resetsectionmarks\zerosection
- \getsectionblockenvironment\@@sectionblock
- \setsystemmode\@@sectionblock
- \getvalue{\??sb\@@sectionblock\c!before}%
- \showmessage\m!structures1\@@sectionblocks}
-
-\def\dostopsectionblock
- {\showmessage\m!structures2\@@sectionblocks
- \getvalue{\??sb\@@sectionblock\c!after}% don't move
- \doaroundsectionblock
-% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
-% \resetsectioncounters\zerosection % was firstsection
-% \resetsectionmarks\zerosection
- \endgroup}
-
-\def\dosetupsectionblock[#1]% [#2]
- {\getparameters[\??sb#1]}
-
-\def\setupsectionblock
- {\dodoubleargument\dosetupsectionblock}
-
-\long\def\setsectionblockenvironment#1#2%
- {\long\setvalue{\??sb\s!do#1}{\do{#2}}}
-
-\def\getsectionblockenvironment#1%
- {\let\do\firstofoneargument\getvalue{\??sb\s!do#1}}
-
-\setvalue{\e!start\v!sectionblockenvironment}%
- {\dosingleargument\dostartsectionblockenvironment}
-
-\def\dostartsectionblockenvironment[#1]% evt \pushendofline \popendofline
- {\long\def\do##1##2{\setsectionblockenvironment{#1}{##1##2}}%
- \grabuntil{\e!stop\v!sectionblockenvironment}{\getvalue{\??sb\s!do#1}}}
-
-%D \starttyping
-%D \startsectionblockenvironment[frontpart]
-%D \setuppagenumbering[conversion=romannumerals]
-%D \stopsectionblockenvironment
-%D
-%D \startsectionblockenvironment[bodypart]
-%D \setuppagenumber[number=1]
-%D \stopsectionblockenvironment
-%D
-%D \startsectionblockenvironment[frontpart]
-%D \setuppagenumbering[conversion=character]
-%D \stopsectionblockenvironment
-%D
-%D \starttext
-%D \startfrontmatter \chapter{test} \stopfrontmatter
-%D \startbodymatter \chapter{test} \stopbodymatter
-%D \startappendices \chapter{test} \stopappendices
-%D \stoptext
-%D \stoptyping
-
-% We used to use the first char as id, but a counter is
-% better, because in english we get a name clash.
-
-\newcounter\currentsectionblock
-
-\def\currentsection{\@@sectionblock}
-
-\def\dodefinesectionblock[#1][#2][#3]%
- {\getparameters
- [\??sb#1]
- [\c!number=\v!yes,
- \c!page=\v!right, % anders worden marks te vroeg gereset !
- %\c!before=,
- %\c!after=,
- #3]%
- \expandafter\newif\csname if#2\endcsname % better a mode
- \doglobal\increment\currentsectionblock
- \setsectionblockenvironment{#1}{}%
- \setevalue{\??sb #1}{\noexpand\dosetlocalsectionblock{\currentsectionblock}{#1}{#2}}%
- \setvalue {\e!start#2}{\dostartsectionblock{#1}{#2}}%
- \setvalue {\e!stop #2}{\dostopsectionblock}}
-
-\def\definesectionblock
- {\dotripleargument\dodefinesectionblock}
-
-\def\sectionblocklabel#1#2%
- {\@EA\ifx\csname\??ko#1\@@sectionblock\c!label\endcsname\relax
- \labeltexts{#1}{#2}%
- \else
- \labeltexts{\getvalue{\??ko#1\@@sectionblock\c!label}}{#2}%
- \fi}
-
-\dosetlocalsectionblock{2}{\v!bodypart}{\v!bodymatter} % hm, dirty
-
-\def\setsectiontype[#1]%
- {\getvalue{\??sb#1}}
-
-\def\writesection#1#2#3% #3 -> \asciititle
- {\bgroup
- \edef\!!stringa{#1}%
- \@EA\writestatus\@EA
- {\!!stringa}
- {\ifsectionnumber#2\else(#2)\fi\normalspace\asciititle}%
- \egroup}
-
-\def\@@kolevel{1} \def\headlevel{\@@kolevel}
-
-\def\dohandlepagebreakAA#1%
- {\ifnum\lastpenalty>0
- \global\paginageblokkeerdtrue
- \fi}
-
-% \setuphead[section][aligntitle=float] % permits title next to sidefloat
-%
-% \placefigure[left]{}{} \section{\dorecurse{10}{bagger }} \input tufte
-
-% \def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
-% {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
-% \getvalue{\??ko#1\c!before}%
-% % \whitespace vervangen door \noindent elders
-% \relax
-% \ifpaginageblokkeerd
-% \global\paginageblokkeerdfalse
-% \else
-% \!!countb\getvalue{\??se\@@sectie\c!level}\relax
-% \ifnum\!!countb>\@@kolevel\relax
-% \!!counta20000
-% \multiply\!!countb 500
-% \advance\!!counta \!!countb
-% \dosomebreak{\penalty\!!counta}%
-% \else
-% \dosomebreak\allowbreak
-% \fi
-% \fi
-% \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
-% \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
-
-\chardef\somebreakmethod\plusone
-
-\def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
- {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
- \getvalue{\??ko#1\c!before}%
- % \whitespace vervangen door \noindent elders
- \relax
- \ifpaginageblokkeerd
- \global\paginageblokkeerdfalse
- \else
- \ifcase\somebreakmethod
- % 0 = nothing
- \or
- % 1 = old weighted version
- \!!countb\getvalue{\??se\@@sectie\c!level}\relax
- \ifnum\!!countb>\@@kolevel\relax
- \!!counta20000
- \multiply\!!countb 500
- \advance\!!counta \!!countb
- \dosomebreak{\penalty\!!counta}%
- \else
- \dosomebreak\allowbreak % brr
- \fi
- \or
- % 2 = strict version
- \dosomebreak{\penalty\maxdimen}%
- \else
- % nothing
- \fi
- \fi
- \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
- \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
-
-\def\dohandlepagebreakBB#1#2#3%
- {%\doifinsetelse{\getvalue{\??tk#2\c!state}}{\v!normal,\v!start}
- \doifelselayouttextline{#2}
- {\doifvaluesomething{\??ko#1#3}
- {\setuplayouttext[#2][\c!state=\getvalue{\??ko#1#3}]}}
- \donothing}
-
-\def\dohandlepagebreakB#1%
- {\doifvaluesomething{\??ko#1\c!page}
- {\def\resetcurrentsectionmarks% toegevoegd, zie \page
- {\resetsectionmarks{\previoussection\@@sectie}}%
- \page[\getvalue{\??ko#1\c!page}]%
- \dohandlepagebreakBB{#1}\v!header\c!header
- \dohandlepagebreakBB{#1}\v!text \c!text
- \dohandlepagebreakBB{#1}\v!footer\c!footer}}
-
-\def\dohandlepagebreakX#1% zie doordefinieren / boven
- {\bgroup
- \!!countb\@@kolevel
- \advance\!!countb #1
- \multiply\!!countb 500
- \!!counta20000
- \advance\!!counta \!!countb
- \dosomebreak{\penalty\!!counta}%
- \egroup}
-
-\newconditional\ignorehandlepagebreak
-
-\def\handlepagebreak#1%
- {\ifconditional\ignorehandlepagebreak
- \setfalse\ignorehandlepagebreak
- \else
- \dohandlepagebreakAA{#1}%
- \ifnum\countervalue{\??se\previoussection\@@sectie}>\zerocount\relax
- \ifnum\countervalue{\??se\@@sectie}>\zerocount
- \dohandlepagebreakB{#1}%
- \else
- \doifnotvalue{\??ko#1\c!continue}\v!yes{\dohandlepagebreakB{#1}}%
- \fi
- \else
- \dohandlepagebreakB{#1}%
- \fi
- \dohandlepagebreakAB{#1}%
- \fi}
-
-\def\handlenopagebreak#1%
- {\ifconditional\ignorehandlepagebreak
- \setfalse\ignorehandlepagebreak
- \else
- \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}%
- \nobreak
- \fi}
-
-\def\localheadheight {\strutht}
-\def\localheaddepth {\strutdp}
-\def\localheadlineheight{\lineheight}
-
-\def\dolocalheadsetup#1% koppeling met standaard kopcommando / engels
- {\forgetall % traag dus ...
- \doifvaluesomething{\??ko#1\c!align} % wordt al expanded in spa
- {\expanded{\setupalign[\getvalue{\??ko#1\c!align}]}}%
- \doifvaluesomething{\??ko#1\c!tolerance} % wordt al expanded in spa
- {\expanded{\setuptolerance[\getvalue{\??ko#1\c!tolerance}]}}%
- \doifvalue{\??ko#1\c!strut}\v!no % wordt al expanded in spa
- {\setnostrut}% new
- \def\\{\crlf\strut\ignorespaces}}
-
-\def\localkopsetup{\localheadsetup} % kan tzt weg
-
-% todo: make them conditionals:
-
-\newif\ifincrementnumber
-\newif\ifreversesectionnumbers % todo: key/val
-\newif\ifsectionnumber \sectionnumbertrue
-\newif\ifdisplaysectionhead \displaysectionheadtrue
-\newif\ifplacehead
-\newif\ifemptyhead
-\newif\ifwritetolist
-\newif\ifheadnumber
-\newif\ifheadnumbercontent % niet meer wijzigen / wordt mode
-\newif\ifheadprefix
-\newif\ifsomeheadconversion
-
-% new
-
-\newconditional\@@resetsubheadnumbers
-
-\def\setsectieenkoppeling#1%
- {\edef\@@koppeling{\getvalue{\??ko#1\c!coupling}}%
- \edef\@@sectie{\getvalue{\??ko#1\c!section}}%
- \doifnothing\@@koppeling
- {\edef\@@koppeling{#1}}%
- \doifnothing\@@sectie
- {\edef\@@sectie{\getvalue{\??ko\@@koppeling\c!section}}}}
-
-% \handlepagebreak komt het eerst omdat eventueel
-% subpaginanummers moeten worden afgehandeld. Vervolgens
-% worden de nummers opgehoogd en referenties geset, dan
-% volgt de kop en tot slot de worden de marks en de prefix
-% geset.
-
-% \hoofdstuk {tekst}
-% \hoofdstuk tekst
-% \hoofdstuk
-
-\let\finalsectionnumber\empty
-
-\def\dofinalsectionnumber
- {\ifundefined{\@@sectie\c!number}\else
- \ifsomeheadconversion
- \@@shortsectionnumber\@@sectie
- \else
- \getvalue{\@@sectie\c!number}%
- \fi
- \fi}
-
-\def\findsectionnumber#1#2#3% class file title / uti seperator --
- {\begingroup
- \setsectieenkoppeling{#1}%
- \xdef\foundsectionnumber{1}%
- \def\dolistelement##1##2##3##4##5##6%
- {\doif{##1}{#1}
- {\ConvertConstantAfter\doif{##4}{#3}
- {\global\utilitydonetrue
- \scratchcounter=0\getvalue{\??se\@@sectie\c!level}%
- %
- %\advance\scratchcounter 2
- %\@EA\def\@EA\do\@EA####\@EA1\sectionseparator####2]%
- % {\advance\scratchcounter -1
- % \ifcase\scratchcounter
- % \xdef\foundsectionnumber{####1}%
- % \else
- % \do####2]%
- % \fi}%
- %\do##5]}}}%
- %
- \def\do####1\relax % :/- clean
- {\advance\scratchcounter \minusone
- \ifcase\scratchcounter
- \xdef\foundsectionnumber{\@@filterheadpart[####1]}%
- \else
- \@EAEAEA\do\@@filtertailpart[####1]\relax
- \fi}%
- \@EA\do\@@filternumberpart[##5]\relax}}}%
- \setbox0\vbox
- {\doutilities{#1}{#2}{#1}\relax\relax}%
- \endgroup
- \doifnumberelse\foundsectionnumber
- {\doif\foundsectionnumber\!!zerocount
- {\globallet\foundsectionnumber\!!plusone}}
- {\globallet\foundsectionnumber\!!plusone}% an appendix or so
- \setupheadnumber[#1][\foundsectionnumber]%
- \setupheadnumber[#1][-1]}
-
-% deal with eigennummer
-
-\def\setsomeheadconversion#1#2%
- {\someheadconversionfalse
- \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
- {\setgvalue{\??se\@@sectie\c!ownnumber}{#2}%
- \def\someheadconversion{#2}}
- {\letgvalue{\??se\@@sectie\c!ownnumber}\relax
- \determineheadnumber[#1]%
- \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\relax
- \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\relax
- \def\someheadconversion{#2}%
- \else
- \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\empty
- \def\someheadconversion{#2}%
- \else
- \someheadconversiontrue
- \def\someheadconversion%
- {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\c!headconversion}}{#2}}%
- \fi
- \fi
- \else
- \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\empty
- \def\someheadconversion{#2}%
- \else
- \someheadconversiontrue
- \def\someheadconversion%
- {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\@@sectionblock\c!headconversion}}{#2}}%
- \fi
- \fi}}
-
-\def\writtenfullsectionnumber
- {\string\fullsectionnumber}
-
-\def\ignoredfullsectionnumber#1#2#3%
- {#3}
-
-\let\storedfullsectionnumber\relax
-
-\def\expandablefullsectionnumber#1#2#3%
- {\convertnumber{#2}{#3}}
-
-\unexpanded\def\naturalfullsectionnumber#1#2#3%
- {\sectionblocklabel{#1}{\convertnumber{#2}{#3}}}
-
-\unexpanded\def\limitedfullsectionnumber#1#2#3%
- {\convertnumber{#2}{#3}}
-
-\def\setfullsectionnumber#1%
- {\doifelsevalue{#1\c!headconversion}\v!yes
- {\doifelsevalue{#1\c!headlabel}\v!yes
- {\let\fullsectionnumber\naturalfullsectionnumber}
- {\let\fullsectionnumber\limitedfullsectionnumber}}
- {\let\fullsectionnumber\ignoredfullsectionnumber}}
-
-\let\fullsectionnumber\limitedfullsectionnumber
-
-% \dodododoconstructhead IS NON GROUPED, SO WE NEED TO RESTORE !!!!
-%
-% dit kan dus beter \everyaroundhead zijn
-
-\let\currentheadnumber\empty
-\let\currentheadtext \empty
-
-\def\dodoconstructhead#1[#2]#3% [ref] {title}
- {\doifelsevalue{\??ko#1\c!ownnumber}\v!yes
- {\doquadruplegroupempty\dododoconstructhead{#1}{#2}{#3}}
- {\fourthargumentfalse \dododoconstructhead{#1}{#2}{#3}{}}}
-
-\def\dododoconstructhead#1#2#3#4% [ref] {own} {title}
- {\iffourthargument
- \def\next{\dodododoconstructhead{#1}[#2]{#3}{#4}}%
- \else
- \def\next{\dodododoconstructhead{#1}[#2]{\finalsectionnumber}{#3}}%
- \fi
- \next}
-
-% pas met \ExpandFirstAfter op bij twee||taligheid
-
-\ifx\dohandleheadnumber\undefined
- \let\dohandleheadnumber\firstofoneargument
-\fi
-
-\unexpanded\def\\{\space}
-
-\def\emptyheadcorrection % experimental, should work
- {\ifemptyhead % well with na=\blank
- \vskip-\lineheight
- \dosomebreak\nobreak
- \kern\zeropoint
- \prevdepth\strutdepth
- \fi}
-
-\let\localkopprefix\empty
-
-\def\headparameter#1% to do: everywhere in core-sec
- {\executeifdefined{\??ko\currenthead#1}\empty}
-
-% todo: write to list etc in both args or in enclosing h/vbox else it gets
-% lost when no #1 or #2 is typeset
-
-% we will use variables here
-
-\def\dodododoconstructhead#1[#2]#3#4% [ref] {number} {title}
- {\def\currenthead{#1}% dus #1 overal vervangen
- \let\finalsectionnumber\dofinalsectionnumber % overloaded ungrouped -)
- \unexpanded\def\\{\space}%
- \edef\numberseparator{\spr{\getvalue{\??ko\currenthead\c!separator}}}%
- \flushingcolumnfloatsfalse % {number} can be \finalsectionnumber
- \someheadconversionfalse
- \let\fullsectionnumber\limitedfullsectionnumber
- \setsectieenkoppeling{#1}%
- \doifelsevaluenothing{\??ko#1\c!prefix}
- \headprefixfalse\headprefixtrue
- \ifheadprefix
- \doifelsevalue{\??ko#1\c!prefix}{+}
- {\doifelsenothing{#2}
- {\def\localkopprefix{+}}
- {\def\localkopprefix{#2}}} % eigenlijk alleen eerste
- {\edef\localkoprefix{\getvalue{\??ko#1\c!prefix}}}%
- \else
- \let\localkoprefix\empty
- \fi
- \placeheadtrue
- \processaction
- [\getvalue{\??ko#1\c!placehead}]
- [ \v!yes=>\emptyheadfalse,
- \v!empty=>\emptyheadtrue,
- \v!no=>\emptyheadtrue\placeheadfalse]%
- \doifelsevalue{\??ko#1\c!resetnumber}\v!no
- {\setfalse\@@resetsubheadnumbers}%
- {\settrue \@@resetsubheadnumbers}%
- \writetolistfalse
- \processaction
- [\getvalue{\??ko#1\c!incrementnumber}]
- [ \v!yes=>\incrementnumbertrue,
- \v!no=>\incrementnumberfalse,
- \v!list=>\incrementnumberfalse
- % beware, since no numbers are used, no nested lists are
- % possible here
- \writetolisttrue,
- \s!unknown=>{\ifx\currentproduct\empty
- \findsectionnumber{#1}\commalistelement{#4}%
- \fi
- \incrementnumbertrue}]%
- \edef\numberheaddistance {\getvalue{\??ko#1\c!distance}}%
- \edef\numberheadalternative{\getvalue{\??ko#1\c!alternative}}%
- \doifelsevalue{\??ko:\numberheadalternative}\v!horizontal
- \displaysectionheadfalse
- \displaysectionheadtrue
- \ifsectionnumber
- \doifelsevalue{\??sb\@@sectionblock\c!number}\v!yes
- {\doifelsevalue{\??ko#1\c!number}\v!yes
- \headnumbertrue
- \headnumberfalse}
- {\headnumberfalse}%
- \else
- \headnumberfalse
- \fi
- \defconvertexpanded\asciititle{\getvalue{\??ko#1\c!expansion}}{#4}%
- %
- \gdef\currentheadtext{#4}% scheelt args
- \globallet\currentheadnumber\empty
- %
- \ifincrementnumber
- \ifplacehead
- \checknexthead\handlepagebreak{#1}%
- \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
- \ifheadprefix
- %\setupreferencing[\c!prefix=-]%
- \setupreferenceprefix[-]%
- \fi
- \getvalue{\e!next\@@sectie}%
- \ifheadnumber
- \setsomeheadconversion{#1}{#3}%
- \let\fullsectionnumber\expandablefullsectionnumber
- \xdef\currentheadnumber{\someheadconversion}%
- \getvalue{\??ko#1\c!inbetween}%
- \ifsomeheadconversion
- \let\fullsectionnumber\naturalfullsectionnumber
- \doplaceheadnumbertext
- {#1}
- {\setsectionlistreference{\@@sectie}{#1}%
- \pagetype[\@@koppeling]%
- \let\fullsectionnumber\writtenfullsectionnumber
- \rawreference\s!sec{#2}{{\someheadconversion}{\asciititle}}%
- \resetsectionmarks\@@sectie
- \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
- \let\fullsectionnumber\writtenfullsectionnumber
- \dowritetolist\@@koppeling\someheadconversion{#4}\v!head}%
- {\dohandleheadnumber\someheadconversion}% handle is new
- {#4}
- {\marking[#1]{#4}%
- \let\fullsectionnumber\storedfullsectionnumber
- \expanded{\marking[#1\v!number]{\someheadconversion}}}%
- \let\fullsectionnumber\ignoredfullsectionnumber
- \writesection{#1}{\someheadconversion}{#4}%
- \else
- \doplaceheadnumbertext
- {#1}
- {\setsectionlistreference{\@@sectie}{#1}%
- \pagetype[\@@koppeling]%
- \rawreference\s!sec{#2}{{#3}{\asciititle}}%
- \resetsectionmarks\@@sectie
- \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
- \dowritetolist\@@koppeling{#3}{#4}\v!head}
- {\sectionblocklabel{#1}{\dohandleheadnumber{#3}}}% handle is new
- {#4}
- {\marking[#1]{#4}%
- \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % rommelig omdat
- {\edef\finalsectionnumber{#3}} % #3 al is toegekend
- {\determineheadnumber[#1]}% migreert naar 3e argument
- \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
- \writesection{#1}{#3}{#4}%
- \fi
- \else
- \getvalue{\??ko#1\c!inbetween}%
- \doplaceheadtext
- {#1}
- {\setsectionlistreference{\@@sectie}{#1}%
- \pagetype[\@@koppeling]%
- \rawreference\s!sec{#2}{{#3}{\asciititle}}%
- \resetsectionmarks\@@sectie
- \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
- \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr, new per 18/1/2005, sometimes we need
- {\dowritetolist\@@koppeling{#3}{#4}\v!head} % entries in the list (special purpose) but
- {\dowritetolist\@@koppeling {}{#4}\v!head}% not in the header, ok we could pop in a command
- }% \dowritetolist\@@koppeling{}{#4}\v!head}
- {#4}
- {\marking[#1]{#4}%
- \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr
- {\edef\finalsectionnumber{#3}}
- {\determineheadnumber[#1]}%
- % todo : geen markering (leeg maken)
- \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
- \writesection{#1}{-}{#4}%
- \fi
- \ifheadprefix
- \setupreferenceprefix[\localkopprefix]%
- \fi
- \ifdisplaysectionhead
- \dosomebreak\nobreak
- \emptyheadcorrection
- \getvalue{\??ko#1\c!after}%
- \fi
- \else
- % Whatever future tex's will do with nodes,
- % we assume a node here, because other \c!after=\blank
- % will fail! See 'prikkels'
- %
- % so, maybe we need an explicit \kern
- %
- % do nothing / should be vbox to 0pt
- %
- \checknexthead\dohandlepagebreakB{#1}% toegevoegd ivm subpaginanr / tug sheets
- \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
- \ifheadprefix
- \setupreferenceprefix[-]%
- \fi
- \getvalue{\e!next\@@sectie}%
- \ifheadnumber
- \setsomeheadconversion{#1}{#3}%
- \let\fullsectionnumber\expandablefullsectionnumber
- \xdef\currentheadnumber{\someheadconversion}%
- \fi
- \getvalue{\??ko#1\c!inbetween}% documenteren, is enige hook
- \bgroup
- \setsectionlistreference{\@@sectie}{#1}%
- \resetsectionmarks\@@sectie
- \marking[#1]{#4}%
- \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
- {\edef\finalsectionnumber{#3}}
- {\determineheadnumber[#1]}%
- \expanded{\marking[#1\v!number]{\finalsectionnumber}}%
- \pagetype[\@@koppeling]%
-% \bgroup
- \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
- \ifheadnumber
- \rawreference\s!sec{#2}{{#3}{\asciititle}}%
- \dowritetolist\@@koppeling{#3}{#4}\v!head
- \writesection{#1}{#3}{#4}%
- \else % hm, also no own number
- \rawreference\s!sec{#2}{{#3}{\asciititle}}%
- \dowritetolist\@@koppeling{}{#4}\v!head
- \writesection{#1}{-}{#4}%
- \fi
- \egroup
- \ifheadprefix
- \setupreferenceprefix[\localkopprefix]%
- \fi
- \fi
- \else
- % todo : ref prefix
- \ifplacehead
- \checknexthead\handlepagebreak{#1}%
- \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
- \getvalue{\??ko#1\c!inbetween}%
- \doplaceheadtext
- {#1}
- {\forcesectiontolist{#1}{#4}%
- \rawreference\s!sec{#2}{{#3}{\asciititle}}} % #3 ?
- {#4}
- %{}% new:
- {\marking[#1]{#4}%
- \marking[#1\v!number]{}}%
- \writesection{#1}{-}{#4}%
- \ifdisplaysectionhead
- \dosomebreak\nobreak
- \emptyheadcorrection
- \getvalue{\??ko#1\c!after}%
- \fi
- \else
- % do nothing / should be vbox to 0pt
- \checknexthead\handlepagebreak{#1}%
- \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
- \getvalue{\??ko#1\c!inbetween}%
- \forcesectiontolist{#1}{#4}%
- \rawreference\s!sec{#2}{{#3}{\asciititle}}% #3 ?
- \marking[#1]{#4}%
- \marking[#1\v!number]{}%
- \writesection{#1}{-}{#4}%
- \fi
- \fi
- \flushingcolumnfloatstrue
- \someheadconversionfalse
- \setfalse\ignorehandlepagebreak
- \let\fullsectionnumber\limitedfullsectionnumber
- % ignorespaces prevents spaces creeping in when after=\dontleavehmode
- \ifdisplaysectionhead\ignorespaces\else\expandafter\GotoPar\fi}
-
-\def\forcesectiontolist#1#2%
- {\ifwritetolist
- % we need to make sure that there is a number set (non
- % zero) else the list mechanism cannot determine the
- % level
- \bgroup
- \setupheadnumber[#1][+1]% traag, wordt \getvalue{\c!next...}
- \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
- \dowritetolist\@@koppeling{}{#2}\v!head
- \setupheadnumber[#1][-1]% traag, wordt \getvalue{\c!previous...}
- \egroup
- \fi}
-
-\let\previoussectionformat\empty
-\let\currentsectionformat \empty
-
-\let\updatelistreferences \relax
-\let\updatedlistreferences\empty
-
-\def\setsectionlistreference#1#2%
- {\ifnum\countervalue{\??se\previoussection{#1}}>0\relax
- \xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}%
- \else
- \globallet\previoussectionformat\empty
- \fi
- \xdef\currentsectionformat{\@@longformatnumber{#1}}}
-
-\def\startlistreferences#1%
- {\thisissomeinternal{\s!lst}{#1\currentsectionformat}%
- \setxvalue{\s!lst:#1}{\realfolio}% to be sure
- \setxvalue{\s!lst:#1\currentsectionformat}{\realfolio}%
- \setxvalue{\e!previouslocal#1}{\s!lst:#1\previoussectionformat}%
- \setxvalue{\e!currentlocal#1}{\s!lst:#1\currentsectionformat}%
- \doifelse{\currentsectionformat}{}
- {\setglobalcrossreference
- {\e!previous#1}{}{\realfolio}{}}
- {\setglobalsystemreference\rt!list
- {\e!previous#1}{\getvalue{\e!previouslocal#1}}}%
- \def\stoplistreferences{\dostoplistreferences}}
-
-\def\dostoplistreferences#1%
- {\ifutilitydone
- \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
- \globallet\updatedlistreferences\updatedlistreferences % een noodverbandje
- \gdef\updatelistreferences%
- {\def\docommand####1%
- {\setglobalsystemreference\rt!list
- {\e!previous####1}{\getvalue{\e!currentlocal####1}}}%
- \processcommacommand[\updatedlistreferences]\docommand
- \globallet\updatelistreferences\relax
- \globallet\updatedlistreferences\empty}%
- \fi}
-
-\def\stoplistreferences
- {\gobbleoneargument}
-
-\appendtoks
- \updatelistreferences
-\to\aftereverypage
-
-% \prevdepth\strutdp % is belangrijk, vergelijk naast elkaar:
-%
-% \subject{test} \input tufte
-% \subject{test} \strut \input tufte
-% \subject{test} \placelist[...]
-
-% todo: kap
-
-% to be documented: \placeheadtext \placeheadnumber
-
-\unexpanded\def\placeheadtext
- {\doquintupleempty\doplaceheadtextornumber
- [\c!textstyle][\c!textcolor][\empty]}
-
-\unexpanded\def\placeheadnumber
- {\doquintupleempty\doplaceheadtextornumber
- [\c!numberstyle][\c!numbercolor][\v!number]}
-
-\def\doplaceheadtextornumber[#1][#2][#3][#4][#5]%
- {\bgroup
- \edef\@@sectie{\??ko\iffifthargument#5\else#4\fi}%
- \dostartattributes\@@sectie\c!style\c!color\empty
- \dontconvertfont
- \dostartattributes\@@sectie{#1}{#2}\empty
- \setupinterlinespace
- \begstrut\getmarking[\mainmarking{#4#3}]\endstrut
- \endgraf
- \dostopattributes
- \dostopattributes
- \egroup}
-
-\chardef\headtimingmode=0
-
-% \chardef\headtimingmode=1 % 0 also works ok now too
-%
-% Martin Kolarik's problem:
-%
-% \setuphead[section][command=\doTitle]
-%
-% \def\doTitle#1#2%
-% {\ruledvbox{\forgetall \hsize=4cm
-% \ruledhbox{\ruledvtop{#1}\ruledvtop{#2}}}}
-%
-% \section{test test test test test test test test test test
-% test test test test test test test}
-
-\newevery \everyheadstart \relax
-
-\def\placeheadmargintexts#1%
- {\the\everyheadstart
- \doifvalue{\??ko#1\c!margintext}\v!yes\placemargincontent}
-
-\def\doplaceheadtext#1#2#3#4%
- {\beginheadplacement{#1}%
- \ifemptyhead % = needed
- \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
- {\headnumbercontentfalse
- \resetsystemmode\v!sectionnumber
- #2}%
- \makestrutofbox0
- \else % = needed
- \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
- {\headnumbercontentfalse
- \resetsystemmode\v!sectionnumber
- % less interfering
- \ifcase\headtimingmode\or#2\fi
- % outerside font determines distance
- \dosetfontattribute{\??ko#1}\c!style
- % but we don't want color to influence user commands
- % todo: get the if-else out of it
- \getvalue{\??ko#1\c!command}
- {} % no number
- {\dostartattributes{\??ko#1}\c!style\c!color\empty
- \dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
- \dontconvertfont
- \ifdisplaysectionhead
- \setupinterlinespace
- \else
- \setupspacing
- \fi
- % \ifcase\headtimingmode#2\fi % can introduce cr
- \getvalue{\??ko#1\c!commandbefore}%
- \placeheadmargintexts{#1}% binnen #3?
- \ifdisplaysectionhead
- \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
- {\setstrut
- \begstrut
- \ifcase\headtimingmode\hbox{#2}\fi
- \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}%
- \endstrut}% \hbox prevents break
- \xdef\localheadheight {\the\strutht}%
- \xdef\localheaddepth {\the\strutdp}%
- \xdef\localheadlineheight{\the\lineheight}%
- % == \globallet\localheaddepth\strutdepth
- \else
- \ifcase\headtimingmode#2\fi
- \getvalue{\??ko#1\c!textcommand}%
- {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}}%
- \fi
- \getvalue{\??ko#1\c!commandafter}%
- \ifdisplaysectionhead\endgraf\fi
- \dostopattributes
- \dostopattributes}}%
- \fi
- \endheadplacement{#1}{#4}}
-
-\def\doplaceheadnumbertext#1#2#3#4#5% maybe move modes outside box
- {\beginheadplacement{#1}%
- \ifemptyhead % = needed
- \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
- {\doiftextelse{#3}
- {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
- {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
- #2}%
- \makestrutofbox0
- \else % = needed
- \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
- {\doiftextelse{#3}
- {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
- {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
- % less interfering
- \ifcase\headtimingmode\or#2\fi
- % outerside font determines distance
- \dosetfontattribute{\??ko#1}\c!style
- % but we don't want color to influence user commands
- \getvalue{\??ko#1\c!command}%
- {\dostartattributes{\??ko#1}\c!style\c!color\empty
- \dostartattributes{\??ko#1}\c!numberstyle\c!numbercolor\empty
- % \getvalue{\??ko#1\c!commandbefore}% strange, why here? moved 21/11/2005
- \placeheadmargintexts{#1}% binnen #3?
- \ifdisplaysectionhead
- % can be nilled with \setnostrut
- \getvalue{\??ko#1\c!numbercommand}%
- {\setstrut
- \begstrut
- \executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}%
- \endstrut}%
- \else
- \getvalue{\??ko#1\c!numbercommand}%
- {\executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}}%
- \fi
- \dostopattributes
- \dostopattributes}
- {\dostartattributes{\??ko#1}\c!style\c!color\empty
- \dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
- \dontconvertfont
- \ifdisplaysectionhead
- \setupinterlinespace
- \else
- \setupspacing
- \fi
- % \ifcase\headtimingmode#2\fi % can introduce cr
- \getvalue{\??ko#1\c!commandbefore}% makes more sense here
- \placeheadmargintexts{#1}% binnen #3?
- \ifdisplaysectionhead
- \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
- {\setstrut
- \begstrut
- \ifcase\headtimingmode\hbox{#2}\fi
- \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}%
- \endstrut}% \hbox prevents break
- \xdef\localheadheight {\the\strutht}%
- \xdef\localheaddepth {\the\strutdp}%
- \xdef\localheadlineheight{\the\lineheight}%
- % == \globallet\localheaddepth\strutdepth
- \else
- \ifcase\headtimingmode#2\fi % inside textcommand ?
- \getvalue{\??ko#1\c!textcommand}%
- {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}}%
- \fi
- \getvalue{\??ko#1\c!commandafter}%
- \ifdisplaysectionhead\endgraf\fi
- \dostopattributes
- \dostopattributes}}%
- \fi
- \endheadplacement{#1}{#5}}
-
-%D \starttyping
-%D \def\StretchedBox#1%
-%D {\framed
-%D [frame=off,offset=.5em,align=middle,width=broad]
-%D {\sc\def\stretchedspaceamount{.3em}\stretchednormalcase{#1}}}
-%D
-%D \definehead[MySubject][subject]
-%D \setuphead [MySubject][deeptextcommand=\StretchedBox]
-%D
-%D \MySubject{feeling stretched feeling stretched feeling stretched feeling stretched}
-%D \stoptyping
-
-\newsignal\headsignal
-\let\headlastlinewidth\!!zeropoint
-
-\def\beginheadplacement#1%
- {\bgroup
- \setsystemmode{#1}% to be documented
- \ifgridsnapping\iftracegridsnapping\showstruts\fi\fi
- \xdef\localheadheight {\the\strutht}%
- \xdef\localheaddepth {\the\strutdp}%
- \xdef\localheadlineheight{\the\lineheight}%
- % == \globallet\localheaddepth\strutdp
- \everypar\emptytoks % needed indeed
- \noindent % ipv \whitespace elders, na \forgetall !
- \bgroup
- \doifinsetelse{\getvalue{\??ko#1\c!aligntitle}}{\v!yes,\v!float}% new
- {\skip0 1\leftskip
- \skip2 1\rightskip
- \xdef\localheadskip{\the\skip0}%
- \forgetall
- \leftskip\skip0
- \rightskip\skip2
- \setlocalhsize\hsize\localhsize
- \forgetbothskips}
- {\globallet\localheadskip\!!zeropoint
- \forgetall}%
- \dontcomplain
- \postponefootnotes
- \iflocation\ifdisplaysectionhead\else\noninterferingmarks\fi\fi
- \resetinteractionparameter\c!style
- \resetinteractionparameter\c!color
- \resetinteractionparameter\c!contrastcolor
- \strictouterreferencestrue % tzt instelling
- \def\localheadsetup{\dolocalheadsetup{#1}}%
- \startsynchronization}
-
-% \setuphead[chapter] [style=\bfd,after=,hang=line] % fit broad 2
-% \setuphead[section] [style=\bfc,after=,hang=line]
-% \setuphead[subsection] [style=\bfb,after=,hang=line]
-% \setuphead[subsubsection] [style=\bfa,after=,hang=line]
-% \setuphead[subsubsubsection][style=\bf ,after=,hang=line]
-%
-% \chapter {Test} \input tufte \page
-% \section {Test} \input tufte \page
-% \subsection {Test} \input tufte \page
-% \subsubsection {Test} \input tufte \page
-% \subsubsubsection{Test} \input tufte \page
-%
-% \chapter {Test\\Test} \input tufte \page
-% \section {Test\\Test} \input tufte \page
-% \subsection {Test\\Test} \input tufte \page
-% \subsubsection {Test\\Test} \input tufte \page
-% \subsubsubsection{Test\\Test} \input tufte \page
-
-\def\hangheadplacement
- {\scratchdimen\localheadlineheight
- \bgroup
- \openlineheight\scratchdimen
- \scratchdimen\ht0
- \advance\scratchdimen\dp0
- \getnoflines\scratchdimen
- \advance\noflines\minusone
- \expanded{\egroup\noflines\the\noflines}% brrr
- \setbox0\hbox{\lower\noflines\scratchdimen\box0}%
- \scratchdimen\ht0
- \advance\scratchdimen\dp0
- \advance\scratchdimen-\localheadheight
- \advance\scratchdimen+\strutdp
- \ht0 \strutht
- \dp0 \strutdp
- \edef\localheaddepth{\the\strutdp}}
-
-\newconditional\continuoussectionhead % oeps, \newif\ifcontinuoushead got lost
-
-\def\endheadplacement#1#2%
- {\doifelsevalue{\??rf#1\c!state}\v!start
- {\doifvaluenothing{\??ko#1\c!file}{\autocrossdocumentfalse}}
- {\autocrossdocumentfalse}%
- % no message needed here, should be a proper switch
- \noflines\zerocount
- \ifdisplaysectionhead
- % new (tod tight == one following line up)
- \processaction
- [\getvalue{\??ko#1\c!hang}]
- [ \v!line=>\hangheadplacement\noflines\zerocount,
- \v!broad=>\hangheadplacement\getnoflines\scratchdimen,
- \v!fit=>\hangheadplacement\getrawnoflines\scratchdimen,
- \v!none=>\noflines\zerocount,
- \v!default=>\noflines\zerocount,
- \v!unknown=>\hangheadplacement\noflines0\commalistelement\advance\noflines\minusone]%
- % so far
- \let\headlastlinewidth\!!zeropoint
- \snaptogrid[\getvalue{\??ko#1\c!grid}]\hbox
- {\hskip\localheadskip
- \hskip\getvalue{\??ko#1\c!margin}\relax
- \iflocation
- \ifautocrossdocument
- \doifreferencefoundelse{\getvalue{\??ko#1\c!file}::#1}
- {\edef\currentinnerreference{\s!aut:\currenttextreference}% stored in
- \gotoouterlocation{}{\box0}} % text slot
- {\hbox{\box0}}%
- \else
- \hbox{\box0}%
- \fi
- \else
- \hbox{\box0}%
- \fi}%
- \doflushnotes % new, not really needed
- \endgraf
- \ifvmode
- \ifnum\noflines>\zerocount
- \dorecurse\noflines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}%
- \fi
- \nointerlineskip
- \dosomebreak\nobreak
- \fi
- #2%
- \else
- \strut
- \doflushnotes % new, here since we're in par mode
- \iflocation
- \ifautocrossdocument
- \hhboxindent=\ifconditional\continuoussectionhead\headlastlinewidth\else\zeropoint\fi
- \unhhbox0\with{\gotobox{\box\hhbox}[\getvalue{\??ko#1\c!file}::#1]}%
- \advance\lasthhboxwidth by \numberheaddistance
- \xdef\headlastlinewidth{\the\lasthhboxwidth}%
- \else
- \unhbox0
- \globallet\headlastlinewidth\!!zeropoint
- \fi
- \else
- \unhbox0
- \globallet\headlastlinewidth\!!zeropoint
- \fi
- #2%
- \dimen0=\numberheaddistance
- \hskip\dimen0 \!!plus \dimen0 \!!minus .25\dimen0
- \hskip\headsignal\ignorespaces
- \fi
- \ifdisplaysectionhead \ifvmode
- \ifgridsnapping % important, font related depth, see comment
- \prevdepth\strutdp
- \else
- \prevdepth\localheaddepth
- \fi
- \fi \fi
- \stopsynchronization
- \egroup
- \egroup
- \ifdisplaysectionhead
- \dochecknextindentation{\??ko#1}%
- \else
- \nonoindentation % recently added, was a bug
- \fi}
-
-\def\checknexthead#1#2% nog optioneel
- {\ifhmode
- \scratchcounter=\lastpenalty\unpenalty % no beauty in this
- \ifdim\lastskip=\headsignal
- \handlenopagebreak{#1}%
- \global\settrue\continuoussectionhead
- \else
- \penalty\scratchcounter
- \global\setfalse\continuoussectionhead
- #1{#2}%
- \fi
- \else
- \global\setfalse\continuoussectionhead
- #1{#2}%
- \fi}
-
-\def\dosetupheadnumber[#1][#2#3]% todo: = (don't reset)
- {\bgroup
- \setsectieenkoppeling{#1}%
- \doifinstringelse{#2}{+-}
- {\doifelsenothing{#3}
- {\@@nextsectionnumber\@@sectie}
- {\!!counta=#2#3\relax
- \advance\!!counta \@@sectionvalue\@@sectie
- \@@setsectionnumber\@@sectie\!!counta}}
- {\@@setsectionnumber\@@sectie{#2#3}}%
- \egroup}
-
-\def\setupheadnumber
- {\dodoubleargument\dosetupheadnumber}
-
-\def\currentheadnumber{0}
-
-\def\determineheadnumber[#1]%
- {\bgroup
- \setsectieenkoppeling{#1}%
- \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
- \egroup}
-
-\def\complexheadnumber[#1]%
- {\bgroup
- \edef\currentheadnumber{#1}%
- \doifinsetelse{-}{#1} % br undocumented
- {\removefromcommalist{-}\currentheadnumber % br
- \setsectieenkoppeling\currentheadnumber
- \setupsection[\@@sectie][\c!previousnumber=\v!no]}%
- {\setsectieenkoppeling\currentheadnumber}%
- \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
- \doifnot{\currentheadnumber}{0}{\finalsectionnumber}%
- \egroup}
-
-\def\simpleheadnumber
- {\currentheadnumber}
-
-\definecomplexorsimple\headnumber
-
-\def\alinea
- {\par}
-
-% nice testcase
-%
-% \setupheads[aligntitle=yes]
-%
-% \startnarrower
-% \subject{\dorecurse{100}{x }}
-% \section{\dorecurse{100}{x }}
-% \input tufte \par
-% \setupheads[alternative=inmargin]
-% \subject{\dorecurse{100}{x }}
-% \section{\dorecurse{100}{x }}
-% \input tufte \par
-% \stopnarrower
-
-\let\numberheadalternative\v!normal
-
-\def\defineheadplacement
- {\dodoubleargument\dodefineheadplacement}
-
-\def\dodefineheadplacement[#1][#2]% #3#4
- {\setvalue{\??ko:#1}{#2}%
- \setvalue{\??ko::#1}}
-
-\def\normalplacehead
- {\executeifdefined
- {\??ko::\numberheadalternative}
- {\getvalue{\??ko::\v!normal}}}
-
-\defineheadplacement[\v!paragraph][\v!vertical]#1#2%
- {\vbox
- {\localheadsetup
- \begstrut\ifheadnumbercontent#1\hskip\numberheaddistance\fi#2}}
-
-% \defineheadplacement[\v!normal][\v!vertical]#1#2%
-% {\ifheadnumbercontent
-% \setbox0\hbox{{#1}\hskip\numberheaddistance}%
-% \vbox
-% {\localheadsetup
-% \hangindent 1\wd0
-% \hangafter 1
-% \noindent
-% \unhbox0 % don't use \strut's here!
-% #2}%
-% \else
-% \vbox
-% {\localheadsetup\noindent#2}%
-% \fi}
-%
-% enhanced version:
-
-% \setuphead
-% [chapter]
-% [numberwidth=2cm,hang=line,after={\blank[3*line]}]
-%
-% \chapter{Oeps oeps oeps} \input tufte \section{Oeps}
-% \chapter{Oeps oeps oeps} \section{Oeps} \input tufte
-
-\defineheadplacement[\v!normal][\v!vertical]#1#2%
- {\vbox
- {\localheadsetup
- \edef\headwidth {\headparameter\c!width }%
- \edef\headnumberwidth{\headparameter\c!numberwidth}%
- \edef\headtextwidth {\headparameter\c!textwidth }%
- \ifheadnumbercontent
- \ifx\headwidth\empty
- \else
- \ifx\headnumberwidth\empty
- \ifx\headtextwidth\empty\else
- \edef\headnumberwidth{\the\dimexpr\headwidth-\headtextwidth\relax}%
- \fi
- \else
- \ifx\headtextwidth\empty
- \edef\headtextwidth{\the\dimexpr\headwidth-\headnumberwidth\relax}%
- \fi
- \fi
- \hsize\headwidth
- \fi
- \ifx\headnumberwidth\empty\else
- \let\numberheaddistance\!!zeropoint
- \fi
- \setbox\scratchbox\hbox \ifx\headnumberwidth\empty\else to \headnumberwidth\fi{{#1}}%
- \scratchdimen\dimexpr\wd\scratchbox+\numberheaddistance\relax
- \ifx\headtextwidth\empty\else
- \hsize\dimexpr\scratchdimen+\headparameter\c!textwidth\relax
- \fi
- \hangindent\scratchdimen
- \hangafter \plusone
- \noindent
- \box\scratchbox\hskip\numberheaddistance
- \else
- \ifx\headtextwidth\empty
- \ifx\headwidth\empty
- \else
- \hsize\headwidth
- \fi
- \else
- \hsize\headtextwidth
- \fi
- \noindent
- \fi
- #2}}
-
-\def\placeheadmargin#1#2%
- {\vbox
- {\localheadsetup
- \begstrut % use one \strut here!
- \dontleavehmode % in case there is no strut, else side effects with llap
- \ifheadnumbercontent
- \llap{\hbox to 5em{\hfill{#1}\hskip\localheadskip\hskip\leftmargindistance}}% introduces whitespace
- % maybe better:
- % \inleftmargin{\hbox{\hss{#1}\hskip\localheadskip}}%
- \fi
- {#2}}}
-
-\defineheadplacement[\v!inmargin][\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
-\defineheadplacement[\v!margin] [\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
-
-\defineheadplacement[\v!middle][\v!vertical]#1#2%
- {\vbox
- {\localheadsetup
- \veryraggedcenter
- \let\\\endgraf
- \let\crlf\endgraf
- \ifheadnumbercontent\strut#1\par\fi\begstrut#2}}
-
-\defineheadplacement[\v!text][\v!horizontal]#1#2%
- {\bgroup
- \localheadsetup % no stretch in distance
- \ifheadnumbercontent{#1}\kern\numberheaddistance\fi{\begstrut#2}%
- \egroup}
-
-\def\placeheadlohi#1#2#3%
- {\ifheadnumbercontent
- \setbox0\hbox{#2}
- \setbox2=#1{\localheadsetup\advance\hsize-\wd0\relax#3}%
- \hbox{\box0\hskip\numberheaddistance\box2}%
- \else
- #1{\localheadsetup\noindent#3}%
- \fi}
-
-% onder/boven lijnt het nummer op de onderste/bovenste regel
-% uit van een meerregelige kop
-
-\defineheadplacement[\v!bottom][\v!vertical]#1#2{\placeheadlohi\vbox{#1}{#2}}
-\defineheadplacement[\v!top] [\v!vertical]#1#2{\placeheadlohi\vtop{#1}{#2}}
-
-% default == instellingen
-% koppeling == koppen, breaks, marks, enz.
-% sectie == nummering
-
-\let\@@kolist=\empty
-
-\def\dododefinehead#1#2% % don't preset prefix to much
- {\presetlabeltext[#1=]%
- \getparameters
- [\??ko#1]
- [\c!numberstyle=\getvalue{\??ko#1\c!style},
- \c!textstyle=\getvalue{\??ko#1\c!style},
- \c!numbercolor=\getvalue{\??ko#1\c!color},
- \c!textcolor=\getvalue{\??ko#1\c!color}]%
- % deeptextcommand and deepnumbercommand are left undefined !
- \doifassignmentelse{#2}
- {\getparameters
- [\??ko#1]
- [\c!section=\getvalue{\??ko\getvalue{\??ko#1\c!coupling}\c!section},
- \c!default=,
- \c!coupling=,
- \c!prefix=,
- \c!before=,
- \c!after=,
- \c!distance=\!!zeropoint,
- \c!page=,
- \c!header=,
- \c!text=,
- \c!footer=,
- \c!style=,
- \c!numbercommand=,
- \c!textcommand=,
- \c!ownnumber=\v!no,
- \c!number=\v!yes,
- \c!color=,
- \c!continue=\v!yes,
- \c!placehead=\v!yes,
- \c!resetnumber=\v!yes,
- \c!incrementnumber=\v!yes,
- \c!alternative=\@@koalternative,
- \c!command=\normalplacehead,
- \c!separator=\@@koseparator,
- \c!stopper=\@@kostopper,
- \c!align=\@@koalign,
- \c!aligntitle=\@@koaligntitle,
- \c!tolerance=\@@kotolerance,
- \c!indentnext=\@@koindentnext,
- \c!strut=\@@kostrut,
- \c!hang=\@@kohang,
- \c!file=,
- \c!expansion=,
- \c!grid=,
- \c!margintext=,
- \c!margin=\@@komargin,
- #2]%
- \ConvertToConstant\doifnot{#1}{\getvalue{\??ko#1\c!default}}
- {\doifsomething{\getvalue{\??ko#1\c!default}}
- {\copyparameters
- [\??ko#1][\??ko\getvalue{\??ko#1\c!default}]
- [\c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
- \c!header,\c!text,\c!footer,\c!separator,\c!stopper,\c!resetnumber,
- \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
- \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
- % new per 20/03/3002 (o-pbu-l) / was too confusing
- % \c!numberstyle,\c!textstyle,\c!expansion,
- % again too confusing
- \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
- \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]}}%
- \getparameters[\??ko#1][#2]%
- \doifsomething{\getvalue{\??ko#1\c!section}}
- {\doifelsemarking{#1}% \doifundefined{\??mk#1}
- {}% marking #1 already defined
- {\definemarking[#1]%
- \couplemarking[#1][\getvalue{\??ko#1\c!section}]%
- \definemarking[#1\v!number]%
- \couplemarking[#1\v!number][\getvalue{\??ko#1\c!section}]}}%
- \doifundefined{\??li#1}{\definelist[#1]}}
- {\ConvertToConstant\doifelse{#1}{#2}
- {\doifundefined{\??li#1}{\definelist[#1]}}
- {\copyparameters
- [\??ko#1][\??ko#2]
- [\c!level,\c!section,\c!coupling,\c!prefix,
- \c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
- \c!separator,\c!stopper,
- \c!header,\c!text,\c!footer,\c!resetnumber,
- \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
- \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
- % new per 20/03/3002 (o-pbu-l) / was too confusing
- % \c!numberstyle,\c!textstyle,\c!expansion,
- % again too confusing
- \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
- \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]%
- \getparameters[\??ko#1][\c!expansion=]% iig een value, rather fuzzy
- \definemarking[#1][#2]%
- \definemarking[#1\v!number][#2\v!number]%
- \doifundefined{\??li#1}{\definelist[#1][#2]}}}%
- \addtocommalist{#1}\@@kolist
- \setevalue{\??sk#1}{\getvalue{\??ko#1\c!coupling}}%
- \setevalue{\??by#1}{\getvalue{\??ko#1\c!section}}%
- \setevalue{\??by\v!by#1}{\getvalue{\??ko#1\c!section}}%
- \setvalue{#1}{\dodoubleempty\doconstructhead[#1]}}
-
-\def\dodefinehead[#1][#2]%
- {\doifelsenothing{#2}
- {% todo: message that it's an invalid definition
- \setvalue{#1}{\endgraf[#1]\kern.5em}}
- {\doifassignmentelse{#2}
- {\dododefinehead{#1}{#2}}
- {\doifdefined{\??ko#2\c!section}
- {\dododefinehead{#1}{#2}}}}}
-
-\def\definehead
- {\dodoubleemptywithset\dodefinehead}
-
-\def\doconstructhead[#1][#2]%
- {\dowithpargument{\dodoconstructhead{#1}[#2]}}
-
-\def\dosetuphead[#1][#2]%
- {\getparameters[\??ko#1][#2]%
- % The next check prevents hard to trace problems. I once
- % set \c!command to nothing and (quite natural) got the
- % wrong references etc. The whole bunch should be boxed!
- \expandafter\defconvertedcommand\expandafter\ascii\csname\??ko#1\c!command\endcsname
- \doifnothing\ascii{\setvalue{\??ko#1\c!command}{\normalplacehead}}}
-
-\def\setuphead
- {\dodoubleargumentwithset\dosetuphead}
-
-\def\dosetupheads[#1]%
- {\getparameters[\??ko][#1]%
- \doifelse{\@@kosectionnumber}\v!yes\sectionnumbertrue\sectionnumberfalse}
-
-\def\setupheads
- {\dosingleargument\dosetupheads}
-
-\def\systemsuppliedchapter {\getvalue{\v!chapter}}
-\def\systemsuppliedtitle {\getvalue{\v!title}}
-
-% a left over
-
-\def\complexbijlage[#1]#2%
- {\page[\v!right]
- \setuppagenumbering[\c!state=\v!stop]
- \systemsuppliedchapter[#1]{#2}
- \page[\v!right]
- \setuppagenumbering[\c!state=\v!start]
- \setuppagenumbering[\c!number=1]}
-
-\setvalue{\v!appendix}%
- {\complexorsimpleempty\bijlage}
-
-\setupheads
- [\c!alternative=\v!normal,
- \c!sectionnumber=\v!yes,
- \c!separator=.,
- \c!stopper=,
- \c!limittext=\v!yes,
- \c!align=,
- \c!aligntitle=,
- \c!tolerance=,
- \c!strut=,
- \c!indentnext=\v!no,
- \c!margin=\zeropoint,
- \c!hang=\v!none,
- \c!command=]
-
-\definesectionblock [\v!frontpart] [\v!frontmatter] [\c!number=\v!no]
-\definesectionblock [\v!bodypart] [\v!bodymatter] [\c!number=\v!yes]
-\definesectionblock [\v!appendix] [\v!appendices] [\c!number=\v!yes]
-\definesectionblock [\v!backpart] [\v!backmatter] [\c!number=\v!no]
-
-\definesection[\s!section-1] % part
-\definesection[\s!section-2] % chapter
-\definesection[\s!section-3] % section
-\definesection[\s!section-4] % subsection
-\definesection[\s!section-5] % subsubsection
-\definesection[\s!section-6] % subsubsubsection
-\definesection[\s!section-7] % subsubsubsubsection
-
-% \c!eigennummer ook hier?
-
-\definehead
- [\v!part]
- [\c!section=\s!section-1,
- \c!ownnumber=\v!no]
-
-\definehead
- [\v!chapter]
- [\c!section=\s!section-2,
- \c!ownnumber=\v!no]
-
-\definehead
- [\v!section]
- [\c!section=\s!section-3,
- \c!ownnumber=\v!no]
-
-\definehead
- [\v!subsection]
- [\c!section=\s!section-4,
- \c!default=\v!section,
- \c!ownnumber=\v!no]
-
-\definehead
- [\v!subsubsection]
- [\c!section=\s!section-5,
- \c!default=\v!subsection,
- \c!ownnumber=\v!no]
-
-\definehead
- [\v!subsubsubsection]
- [\c!section=\s!section-6,
- \c!default=\v!subsubsection,
- \c!ownnumber=\v!no]
-
-\definehead
- [\v!subsubsubsubsection]
- [\c!section=\s!section-7,
- \c!default=\v!subsubsubsection,
- \c!ownnumber=\v!no]
-
-\definehead
- [\v!title]
- [\c!coupling=\v!chapter,
- \c!default=\v!chapter,
- \c!incrementnumber=\v!no]
-
-\definehead
- [\v!subject]
- [\c!coupling=\v!section,
- \c!default=\v!section,
- \c!incrementnumber=\v!no]
-
-\definehead
- [\v!subsubject]
- [\c!coupling=\v!subsection,
- \c!default=\v!subsection,
- \c!incrementnumber=\v!no]
-
-\definehead
- [\v!subsubsubject]
- [\c!coupling=\v!subsubsection,
- \c!default=\v!subsubsection,
- \c!incrementnumber=\v!no]
-
-\definehead
- [\v!subsubsubsubject]
- [\c!coupling=\v!subsubsubsection,
- \c!default=\v!subsubsubsection,
- \c!incrementnumber=\v!no]
-
-\definehead
- [\v!subsubsubsubsubject]
- [\c!coupling=\v!subsubsubsubsection,
- \c!default=\v!subsubsubsubsection,
- \c!incrementnumber=\v!no]
-
-\setupsection
- [\s!section-2]
- [\v!appendix\c!conversion=\v!Character,
- \c!previousnumber=\v!no]
-
-\setuphead
- [\v!part]
- [\c!placehead=\v!no]
-
-\setuphead
- [\v!chapter]
- [\v!appendix\c!label=\v!appendix,
- \v!bodypart\c!label=\v!chapter] % bijlageconversie=\Character
-
-\setuphead
- [\v!section]
- [\v!appendix\c!label=\v!section,
- \v!bodypart\c!label=\v!section] % bijlageconversie=\Character
-
-\setuphead
- [\v!subsection]
- [\v!appendix\c!label=\v!subsection,
- \v!bodypart\c!label=\v!subsection] % bijlageconversie=\Character
-
-\setuphead
- [\v!subsubsection]
- [\v!appendix\c!label=\v!subsubsection,
- \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character
-
-\setuphead
- [\v!part,\v!chapter]
- [%\c!align=,
- %\c!indentnext=\v!no,
- \c!continue=\v!no,
- \c!page=\v!right,
- \c!header=,
- \c!style=\tfc,
- \c!distance=.75em,
- \c!before={\blank[2*\v!big]},
- \c!after={\blank[2*\v!big]}]
-
-\setuphead
- [\v!section]
- [%\c!align=,
- %\c!indentnext=\v!no,
- \c!style=\tfa,
- \c!distance=.75em,
- \c!before={\blank[2*\v!big]},
- \c!after=\blank]
-
-\setuphead % nieuw
- [\v!subsection]
- [\c!page=]
-
-\definecombinedlist
- [\v!content]
- [\v!part,
- \v!chapter,
- \v!section,
- \v!subsection,
- \v!subsubsection,
- \v!subsubsubsection,
- \v!subsubsubsubsection]
- [\c!level=\v!subsubsubsubsection,
- \c!criterium=\v!local]
-
-\setuplist
- [\v!part]
- [\c!before={\blank\page[\v!preference]},
- \c!after=\blank,
- \c!label=\v!yes,
- \c!separator=:,
- \c!distance=1em]
-
-\setuplist
- [\v!chapter]
- [\c!before={\blank\page[\v!preference]},
- \c!after=]
-
-\setuplist [\v!part] [\c!width=0em]
-\setuplist [\v!chapter] [\c!width=2em]
-\setuplist [\v!section] [\c!width=3em]
-\setuplist [\v!subsection] [\c!width=4em]
-\setuplist [\v!subsubsection] [\c!width=5em]
-\setuplist [\v!subsubsubsection] [\c!width=6em]
-\setuplist [\v!subsubsubsubsection] [\c!width=7em]
-
-% hm
-
-\setuppagenumbering % na instellen hoofdteksten !
- [\c!alternative=\v!singlesided,
- \c!location={\v!header,\v!middle},
- \c!conversion=\v!numbers,
- \c!width=, % in geval van \v!marginedge
- \c!left=,
- \c!right=,
- \c!way=\v!by\v!part,
- \c!text=,
- \v!chapter\v!number=\v!no, % v
- \v!part\v!number=\v!yes, % v
- \c!numberseparator=--,
- \c!textseparator=\tfskip,
- \c!state=\v!start,
- \c!command=,
- \c!strut=\v!yes, % nieuw
- \c!style=, % \v!normal, % empty, otherwise conflict
- \c!color=]
-
-\protect \endinput
diff --git a/tex/context/base/core-spa.lua b/tex/context/base/core-spa.lua
index 2150d2103..5f4df72a2 100644
--- a/tex/context/base/core-spa.lua
+++ b/tex/context/base/core-spa.lua
@@ -8,7 +8,8 @@ if not modules then modules = { } end modules ['core-spa'] = {
-- todo: test without unset
-local format = string.format
+local format, insert = string.format, table.insert
+local utfchar = utf.char
-- vertical space handler
@@ -617,7 +618,7 @@ end
-- probably a has_glyphs is rather fast too
-do
+do -- maybe just share these locals
local has_attribute = node.has_attribute
local unset_attribute = node.unset_attribute
@@ -630,6 +631,7 @@ do
local glyph = node.id("glyph")
local whatsit = node.id("whatsit")
+ local penalty = node.id("penalty")
local kern = node.id("kern")
local disc = node.id('disc')
local glue = node.id('glue')
@@ -642,7 +644,7 @@ do
input.storage.register(false,"spacings/mapping", spacings.mapping, "spacings.mapping")
- function spacings.setspacing(id,char,left,right)
+ function spacings.setspacing(id,char,left,right,alternative)
local mapping = spacings.mapping[id]
if not mapping then
mapping = { }
@@ -653,42 +655,147 @@ do
map = { }
mapping[char] = map
end
- map.left, map.right = left, right
+ map.left, map.right, map.alternative = left, right, alternative
end
-- todo: no ligatures
+ function nodes.somespace(n,all)
+ if n then
+ local id = n.id
+ if id == glue then
+ return (all or (n.spec.width ~= 0)) and glue
+ elseif id == kern then
+ return (all or (n.kern ~= 0)) and kern
+ elseif id == glyph then
+ local category = characters.data[n.char].category
+ -- maybe more category checks are needed
+ return (category == "zs") and glyph
+ end
+ end
+ return false
+ end
+
+ function nodes.somepenalty(n,value)
+ if n then
+ local id = n.id
+ if id == penalty then
+ if value then
+ return n.penalty == value
+ else
+ return true
+ end
+ end
+ end
+ return false
+ end
+
+ spacings.trace = false
+
function spacings.process(namespace,attribute,head)
local done, mapping, fontids = false, spacings.mapping, fonts.tfm.id
- for start in traverse_id(glyph,head) do -- tricky since we inject
- local attr = has_attribute(start,attribute)
- if attr and attr > 0 then
- local map = mapping[attr]
- if map then
- map = map[start.char]
- unset_attribute(start,attribute)
+ local start = head
+ -- head is always begin of par (whatsit), so we have at least two prev nodes
+ -- penalty followed by glue
+ while start do
+ if start.id == glyph then
+ local attr = has_attribute(start,attribute)
+ if attr and attr > 0 then
+ local map = mapping[attr]
if map then
- local kern, prev = map.left, start.prev
- if kern and kern ~= 0 and prev and prev.id == glyph then
- node.insert_before(head,start,nodes.kern(tex.scale(fontids[start.font].parameters.quad,kern)))
- done = true
- end
- local kern, next = map.right, start.next
- if kern and kern ~= 0 and next and next.id == glyph then
- node.insert_after(head,start,nodes.kern(tex.scale(fontids[start.font].parameters.quad,kern)))
- done = true
+ map = map[start.char]
+ unset_attribute(start,attribute)
+ if map then
+ local trace = spacings.trace
+ local left, right, alternative = map.left, map.right, map.alternative
+ local quad = fontids[start.font].parameters.quad
+ local prev = start.prev
+ if left and left ~= 0 and prev then
+ local ok = false
+ if alternative == 1 then
+ local somespace = nodes.somespace(prev,true)
+ if somespace then
+ local prevprev = prev.prev
+ local somepenalty = nodes.somepenalty(prevprev,10000)
+ if somepenalty then
+ if trace then
+ logs.report("spacing","removing penalty and space before %s", utfchar(start.char))
+ end
+ head, _ = nodes.remove(head,prev,true)
+ head, _ = nodes.remove(head,prevprev,true)
+ else
+ local somespace = nodes.somespace(prev,true)
+ if somespace then
+ if trace then
+ logs.report("spacing","removing space before %s", utfchar(start.char))
+ end
+ head, _ = nodes.remove(head,prev,true)
+ end
+ end
+ end
+ ok = true
+ else
+ ok = not (nodes.somespace(prev,true) and nodes.somepenalty(prev.prev,true)) or nodes.somespace(prev,true)
+ end
+ if ok then
+ if trace then
+ logs.report("spacing","inserting penalty and space before %s", utfchar(start.char))
+ end
+ node.insert_before(head,start,nodes.penalty(10000))
+ node.insert_before(head,start,nodes.glue(tex.scale(quad,left)))
+ done = true
+ end
+ end
+ local next = start.next
+ if right and right ~= 0 and next then
+ local ok = false
+ if alternative == 1 then
+ local somepenalty = nodes.somepenalty(next,10000)
+ if somepenalty then
+ local nextnext = next.next
+ local somespace = nodes.somespace(nextnext,true)
+ if somespace then
+ if trace then
+ logs.report("spacing","removing penalty and space after %s", utfchar(start.char))
+ end
+ head, _ = nodes.remove(head,next,true)
+ head, _ = nodes.remove(head,nextnext,true)
+ end
+ else
+ local somespace = nodes.somespace(next,true)
+ if somespace then
+ if trace then
+ logs.report("spacing","removing space after %s", utfchar(start.char))
+ end
+ head, _ = nodes.remove(head,next,true)
+ end
+ end
+ ok = true
+ else
+ ok = not (nodes.somepenalty(next,10000) and nodes.somespace(next.next,true)) or nodes.somespace(next,true)
+ end
+ if ok then
+ if trace then
+ logs.report("spacing","inserting penalty and space after %s", utfchar(start.char))
+ end
+ node.insert_after(head,start,nodes.glue(tex.scale(quad,right)))
+ node.insert_after(head,start,nodes.penalty(10000))
+ done = true
+ end
+ end
end
end
end
end
+ start = start.next
end
return head, done
end
- lists.plugins[#lists.plugins+1] = {
- name = "spacing",
- namespace = spacings,
- processor = spacings.process,
+ lists.handle_spacing = nodes.install_attribute_handler {
+ name = "spacing",
+ namespace = spacings,
+ processor = spacings.process,
}
kerns = kerns or { }
@@ -701,8 +808,10 @@ do
kerns.mapping[id] = factor
end
--- local marks = fti[font].shared.otfdata.luatex.marks
--- if not marks[tchar] then
+ -- local marks = fti[font].shared.otfdata.luatex.marks
+ -- if not marks[tchar] then
+
+ -- todo: use node.* functions
function kerns.process(namespace,attribute,head) -- todo interchar kerns / disc nodes / can be made faster
local fti, scale = fonts.tfm.id, tex.scale
@@ -844,7 +953,7 @@ do
return head, done
end
- lists.plugins[#lists.plugins+1] = {
+ lists.handle_kerning = nodes.install_attribute_handler {
name = "kern",
namespace = kerns,
processor = kerns.process,
@@ -899,7 +1008,7 @@ do
local function finish_auto_before()
head, inserted = node.insert_before(head,current,nodes.textdir("-"..finish))
finished, finidir = inserted, finish
- if trace then table.insert(list,#list,format("finish %s",finish)) ; finipos = #list-1 end
+ if trace then insert(list,#list,format("finish %s",finish)) ; finipos = #list-1 end
finish, autodir, done = nil, 0, true
end
local function finish_auto_after()
@@ -920,10 +1029,10 @@ do
if finidir == finish then
nodes.remove(head,finished,true)
if trace then list[finipos] = list[finipos].." (deleted)" end
- if trace then table.insert(list,#list,format("start %s (deleted)",finish)) end
+ if trace then insert(list,#list,format("start %s (deleted)",finish)) end
else
head, inserted = node.insert_before(head,current,nodes.textdir("+"..finish))
- if trace then table.insert(list,#list,format("start %s",finish)) end
+ if trace then insert(list,#list,format("start %s",finish)) end
end
end
local function force_auto_right_before()
@@ -938,10 +1047,10 @@ do
if finidir == finish then
nodes.remove(head,finished,true)
if trace then list[finipos] = list[finipos].." (deleted)" end
- if trace then table.insert(list,#list,format("start %s (deleted)",finish)) end
+ if trace then insert(list,#list,format("start %s (deleted)",finish)) end
else
head, inserted = node.insert_before(head,current,nodes.textdir("+"..finish))
- if trace then table.insert(list,#list,format("start %s",finish)) end
+ if trace then insert(list,#list,format("start %s",finish)) end
end
end
local function is_right(n)
@@ -1148,7 +1257,7 @@ do
return head, done
end
- chars.plugins[#chars.plugins+1] = {
+ chars.handle_mirroring = nodes.install_attribute_handler {
name = "mirror",
namespace = mirror,
processor = mirror.process,
@@ -1158,8 +1267,6 @@ do
cases.enabled = false
cases.actions = { }
- -- hm needs to be run before glyphs: chars.plugins
-
local function helper(start, code, codes)
local data, char = characters.data, start.char
local dc = data[char]
@@ -1244,20 +1351,20 @@ do
end
end
- --~ cases.actions[5] = function(start)
- --~ local prev, next = start.prev, start.next
- --~ if prev and prev.id == kern and prev.subtype == 0 then
- --~ prev = prev.prev
- --~ end
- --~ if next and next.id == kern and next.subtype == 0 then
- --~ next = next.next
- --~ end
- --~ if (not prev or prev.id ~= glyph) and next and next.id == glyph then
- --~ return upper(start)
- --~ else
- --~ return start, false
- --~ end
- --~ end
+ -- cases.actions[5] = function(start)
+ -- local prev, next = start.prev, start.next
+ -- if prev and prev.id == kern and prev.subtype == 0 then
+ -- prev = prev.prev
+ -- end
+ -- if next and next.id == kern and next.subtype == 0 then
+ -- next = next.next
+ -- end
+ -- if (not prev or prev.id ~= glyph) and next and next.id == glyph then
+ -- return upper(start)
+ -- else
+ -- return start, false
+ -- end
+ -- end
cases.actions[8] = function(start)
local data = characters.data
@@ -1309,7 +1416,7 @@ do
return head, done
end
- chars.plugins[#chars.plugins+1] = {
+ chars.handle_casing = nodes.install_attribute_handler {
name = "case",
namespace = cases,
processor = cases.process,
@@ -1439,7 +1546,7 @@ do
return head, done
end
- chars.plugins[#chars.plugins+1] = {
+ chars.handle_breakpoints = nodes.install_attribute_handler {
name = "breakpoint",
namespace = breakpoints,
processor = breakpoints.process,
diff --git a/tex/context/base/core-spa.mkiv b/tex/context/base/core-spa.mkiv
index 6d7a0d986..8c1df68dc 100644
--- a/tex/context/base/core-spa.mkiv
+++ b/tex/context/base/core-spa.mkiv
@@ -146,9 +146,9 @@
\def\dosetupcharacterspacing[#1][#2][#3]%
{\ifcsname\??ch:#1\endcsname
- \begingroup
- \getparameters[\??ch][\c!left=0,\c!right=0,#3]%
- \ctxlua{spacings.setspacing(\getvalue{\??ch:#1},\number#2,\@@chleft,\@@chright)}%
+ \begingroup % for the moment we use modes, in ordere to avoid interface translation
+ \getparameters[\??ch][\c!left=0,\c!right=0,\c!alternative=0,#3]%
+ \ctxlua{spacings.setspacing(\getvalue{\??ch:#1},\number#2,\@@chleft,\@@chright,\@@chalternative)}%
\endgroup
\fi}
@@ -157,16 +157,24 @@
\gdef\setcharacterspacing[##1]{\dosetattribute{spacing}{\csname\??ch:##1\endcsname}}%
\setcharacterspacing}
+\def\resetcharacterspacing
+ {\doresetattribute{spacing}}
+
\letvalue{\??ch:\s!reset}\minusone
+% \setcharacterspacing[frenchpunctuation]
+% «\type{bla}»\crlf « \type{bla}»\crlf
+% «bla »\crlf « bla»\crlf « bla »\crlf
+% bla: bla\crlf bla : bla
+
\definecharacterspacing [frenchpunctuation] % name may change / unit is em
-\setupcharacterspacing [frenchpunctuation] ["003A] [\c!left =.25] % :
-\setupcharacterspacing [frenchpunctuation] ["003B] [\c!left =.25] % ;
-\setupcharacterspacing [frenchpunctuation] ["003F] [\c!left =.25] % ?
-\setupcharacterspacing [frenchpunctuation] ["0021] [\c!left =.25] % !
-\setupcharacterspacing [frenchpunctuation] ["00AB] [\c!right=.25] % guillemotleft/leftguillemot
-\setupcharacterspacing [frenchpunctuation] ["00BB] [\c!left =.25] % guillemotright/rightguillemot
+\setupcharacterspacing [frenchpunctuation] ["003A] [\c!left =.25,\c!alternative=1] % : % strip preceding space(char)
+\setupcharacterspacing [frenchpunctuation] ["003B] [\c!left =.25,\c!alternative=1] % ; % strip preceding space(char)
+\setupcharacterspacing [frenchpunctuation] ["003F] [\c!left =.25,\c!alternative=1] % ? % strip preceding space(char)
+\setupcharacterspacing [frenchpunctuation] ["0021] [\c!left =.25,\c!alternative=1] % ! % strip preceding space(char)
+\setupcharacterspacing [frenchpunctuation] ["00AB] [\c!right=.25,\c!alternative=1] % guillemotleft/leftguillemot % strip following space(char)
+\setupcharacterspacing [frenchpunctuation] ["00BB] [\c!left =.25,\c!alternative=1] % guillemotright/rightguillemot % strip preceding space(char)
% more
%
diff --git a/tex/context/base/core-spa.tex b/tex/context/base/core-spa.tex
index 0cbbf5dc1..31a75876e 100644
--- a/tex/context/base/core-spa.tex
+++ b/tex/context/base/core-spa.tex
@@ -103,9 +103,9 @@
%D A quick way to determine left|/|middle|/|right states
%D (experimental).
-\setvalue{\??as\v!left }{0}
+\setvalue{\??as\v!left }{0}
\setvalue{\??as\v!middle}{1}
-\setvalue{\??as\v!right}{2}
+\setvalue{\??as\v!right }{2}
\def\setalignmentswitch#1%
{\chardef\alignmentswitch0\csname\??as#1\endcsname\relax}
@@ -631,7 +631,16 @@
\global\blankgobackfalse
\blankouterfalse
\global\blankskip\zeropoint
- \expanded{\rawprocesscommalist[#1]}\doblank
+%
+\edefconvertedargument\ascii{#1}% todo fast check for simple
+\ifcsname\??bo\??bo\ascii\endcsname % internal def
+ \csname\??bo\??bo\ascii\endcsname
+\else\ifcsname\??bo\ascii\endcsname % user def / slow
+ \@EA\rawprocesscommalist\@EA[\csname\??bo\ascii\endcsname]\doblank\relax
+\else
+ \expanded{\rawprocesscommalist[#1]}\doblank
+\fi\fi
+%
\relax % to be sure
\ifdim\blankskip=\zeropoint\relax
\iflocalblankflexible
@@ -1347,16 +1356,14 @@
\unskip\unskip\unskip\unskip\unskip
\fi}
+\appendtoks\let~\space\to\simplifiedcommands
+
% still not fixed in aleph / luatex
%
-% \beginETEX \lastnodetype
-%
% \def\removeunwantedspaces
% {\ifhmode \ifnum\lastnodetype=\@@gluenode
% \unskip \@EAEAEA\removeunwantedspaces
% \fi \fi}
-%
-% \endETEX
%D For old time sake, will disappear soon.
@@ -1397,17 +1404,25 @@
\ifx\thinspace\undefined
- \def\thinspace {\kern .16667em }
- \def\negthinspace{\kern-.16667em }
- \def\enspace {\kern .5em }
+ \def\thinspace {\kern .16667em }
+ \def\negthinspace{\kern-.16667em }
+ \def\enspace {\kern .5em }
+
+ \def\thinspace {\kern .16667\fontdimen6\font}
+ \def\negthinspace{\kern-.16667\fontdimen6\font}
+ \def\enspace {\kern .5\fontdimen6\font}
\fi
\ifx\quad\undefined
- \def\enskip{\hskip.5em\relax}
- \def\quad {\hskip 1em\relax}
- \def\qquad {\hskip 2em\relax}
+ \def\enskip{\hskip.5em\relax}
+ \def\quad {\hskip 1em\relax}
+ \def\qquad {\hskip 2em\relax}
+
+ \def\enskip{\hskip.5\fontdimen6\font}
+ \def\quad {\hskip \fontdimen6\font} % faster
+ \def\qquad {\hskip 2\fontdimen6\font}
\fi
@@ -1529,18 +1544,57 @@
\definecomplexorsimple\setupwhitespace
+% \def\simplesetupwhitespace
+% {\doifnot\currentwhitespace\v!none\dosetupwhitespace}
+%
+% \def\complexsetupwhitespace[#1]%
+% {\doifelsenothing{#1}
+% {\simplesetupwhitespace}
+% {\edef\currentwhitespace{#1}%
+% \dosetupwhitespace}}
+%
+% \def\dosetupwhitespace
+% {\processcommacommand[\currentwhitespace]\dowhitespacemethod
+% \dodosetupwhitespace}
+
\def\simplesetupwhitespace
{\doifnot\currentwhitespace\v!none\dosetupwhitespace}
\def\complexsetupwhitespace[#1]%
- {\doifelsenothing{#1}
- {\simplesetupwhitespace}
- {\edef\currentwhitespace{#1}%
- \dosetupwhitespace}}
+ {\edef\nextcurrentwhitespace{#1}%
+ \ifx\nextcurrentwhitespace\empty
+ \simplesetupwhitespace
+ \else
+ \let\currentwhitespace\nextcurrentwhitespace
+ \dosetupwhitespace
+ \fi}
-\def\dosetupwhitespace
- {\processcommacommand[\currentwhitespace]\dowhitespacemethod
- \dodosetupwhitespace}
+\def\dosetupwhitespace % quick test for no list
+ {\ifcsname\??ws\??ws\currentwhitespace\endcsname
+ \csname\??ws\??ws\currentwhitespace\endcsname
+ \else
+ \expandafter\processcommalist\expandafter[\currentwhitespace]\dowhitespacemethod % can be raw
+ \fi\relax
+ \ifgridsnapping
+ \setfalse\flexiblewhitespace
+ \ifdim\ctxparskip>\zeropoint
+ \ctxparskip
+ \ifcase\baselinegridmode
+ \baselineskip % normal ! ! ! ! !!
+ \or
+ \ifdim\scratchdimen=\baselineskip % maybe range
+ \baselineskip % normal ! ! ! ! !!
+ \else
+ \numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax
+ \fi
+ \else
+ \baselineskip % normal ! ! ! ! !!
+ \fi
+ \fi
+ \else
+ \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi
+ \fi
+ \parskip\ctxparskip}
\chardef\baselinegridmode=0 % option in layout / 1=permit_half_lines
@@ -1582,8 +1636,11 @@
\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin}
+% \def\dowhitespacemethod#1%
+% {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax}
+
\def\dowhitespacemethod#1%
- {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax}
+ {\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax}
\def\nowhitespace
{\ifdim\parskip>\zeropoint\relax
@@ -1909,15 +1966,8 @@
\else
\strutdepthfactor \openlineheight
\fi
- \begingroup % avoid interference
- \scratchdimen\minimumstrutdepth
- \advance\scratchdimen\minimumstrutheight
- \ifdim\scratchdimen>\zeropoint
- \endgroup
- \openlineheight\openstrutheight % new
- \advance\openlineheight\openstrutdepth % new
- \else
- \endgroup
+ \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint
+ \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new
\fi
\normalbaselineskip\openlineheight
\ifgridsnapping\else
@@ -1929,30 +1979,41 @@
\normalbaselines
\mksetupgridsnapping}
-\def\setspacingfactor#1\to#2\by#3\\%
- {\strutdimen#2\points
- \strutdimen#3\strutdimen
- \edef#1{\withoutpt\the\strutdimen}}
+% \def\setspacingfactor#1\to#2\by#3\\%
+% {\strutdimen#2\points
+% \strutdimen#3\strutdimen
+% \edef#1{\withoutpt\the\strutdimen}}
+%
+% \def\spacing#1%
+% {\ifgridsnapping
+% %\doifnot{#1}{1}{\showmessage\m!layouts{11}{#1}}%
+% \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi
+% \edef\spacingfactor{1}%
+% \else
+% \edef\spacingfactor{#1}%
+% \fi
+% \setspacingfactor\systemtopskipfactor \to\topskipfactor \by#1\\% why no \spacingfactor ?
+% \setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\% why no \spacingfactor ?
+% \setnormalbaselines
+% \setstrut}
+%
+% \def\setspacingfactor#1#2#3%
+% {\edef#1{\withoutpt\the\dimexpr#2\points*#3\relax}}
\def\spacing#1%
{\ifgridsnapping
- %\doifnot{#1}{1}{\showmessage\m!layouts{11}{#1}}%
\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi
\edef\spacingfactor{1}%
\else
\edef\spacingfactor{#1}%
\fi
- \setspacingfactor\systemtopskipfactor \to\topskipfactor \by#1\\% why no \spacingfactor ?
- \setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\% why no \spacingfactor ?
+ %\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
\setstrut}
-\def\setstrutdimen#1#2#3% % een strut is n.m maal ex
- {\strutdimen\normallineheight % wat niet per se \lineheight
- \strutdimen#2\strutdimen % is omdat een strut lokaal
- \strutdimen#3\strutdimen % kan afwijken van de globale
- \edef#1{\the\strutdimen}} % macro % strut
-
%D Sometimes one needs to freeze the interlinespacing
%D
%D \starttyping
@@ -1970,7 +2031,7 @@
\normalbaselineskip \the\normalbaselineskip
\normallineskip \the\normallineskip
\normallineskiplimit\the\normallineskiplimit
- \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight\relax}%
+ \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}%
\noexpand\normalbaselines}}
% plain definition:
@@ -1997,6 +2058,18 @@
% The double \hbox construction enables us to \backtrack
% boxes.
+% \def\setstrutdimen#1#2#3% % een strut is n.m maal ex
+% {\strutdimen\normallineheight % wat niet per se \lineheight
+% \strutdimen#2\strutdimen % is omdat een strut lokaal
+% \strutdimen#3\strutdimen % kan afwijken van de globale
+% \edef#1{\the\strutdimen}} % macro % strut
+
+% \def\setstrutdimen#1#2#3% % een strut is n.m maal ex
+% {\strutdimen\normallineheight % wat niet per se \lineheight
+% \strutdimen#2\strutdimen % is omdat een strut lokaal
+% \strutdimen#3\strutdimen % kan afwijken van de globale
+% \edef#1{\the\strutdimen}} % macro % strut
+
% \def\setstrut
% {\setstrutdimen\strutheight\strutheightfactor\spacingfactor
% \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor
@@ -2032,37 +2105,90 @@
% interesting, strutdepth is 4.05064pt vs 4.05066pt depending on grid
% nasty rounding problem
-\def\setstrut
+% \def\setstrut
+% {% height
+% \strutdimen\normallineheight
+% \ifdim\minimumstrutheight>\zeropoint
+% \strutdimen\minimumstrutheight
+% \else
+% \strutdimen\strutheightfactor\strutdimen
+% \fi
+% \strutdimen\spacingfactor\strutdimen
+% \edef\strutheight{\the\strutdimen}%
+% % depth
+% \strutdimen\normallineheight
+% \ifgridsnapping
+% \ifdim\minimumstrutdepth>\zeropoint
+% \strutdimen\minimumstrutdepth
+% \else
+% \advance\strutdimen-\strutheight
+% \fi
+% \else
+% \ifdim\minimumstrutdepth>\zeropoint
+% \strutdimen\minimumstrutdepth
+% \else
+% \strutdimen\strutdepthfactor\strutdimen
+% \fi
+% \strutdimen\spacingfactor\strutdimen
+% \fi
+% \edef\strutdepth{\the\strutdimen}%
+% % finish
+% \dosetstrut}
+
+% \def\setstrut
+% {% height
+% \ifdim\minimumstrutheight>\zeropoint
+% \edef\strutheight{\the\dimexpr\spacingfactor\dimexpr\minimumstrutheight}%
+% \else
+% \edef\strutheight{\the\dimexpr\spacingfactor\dimexpr\strutheightfactor\dimexpr\normallineheight}%
+% \fi
+% % depth
+% \ifgridsnapping
+% \ifdim\minimumstrutdepth>\zeropoint
+% \edef\strutdepth{\the\dimexpr\minimumstrutdepth}%
+% \else
+% \edef\strutdepth{\the\dimexpr\normallineheight-\strutheight}%
+% \fi
+% \else
+% \ifdim\minimumstrutdepth>\zeropoint
+% \edef\strutdepth{\the\dimexpr\spacingfactor\dimexpr\minimumstrutdepth}%
+% \else
+% \edef\strutdepth{\the\dimexpr\spacingfactor\dimexpr\strutdepthfactor\dimexpr\normallineheight}%
+% \fi
+% \fi
+% % finish
+% \dosetstrut}
+
+\unexpanded\def\setstrut
{% height
- \strutdimen\normallineheight
- \ifdim\minimumstrutheight>\zeropoint
- \strutdimen\minimumstrutheight
- \else
- \strutdimen\strutheightfactor\strutdimen
- \fi
- \strutdimen\spacingfactor\strutdimen
- \edef\strutheight{\the\strutdimen}%
+ \edef\strutheight
+ {\the\dimexpr\spacingfactor\dimexpr
+ \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight
+ \else
+ \strutheightfactor\dimexpr\normallineheight
+ \fi}%
% depth
- \strutdimen\normallineheight
- \ifgridsnapping
- \ifdim\minimumstrutdepth>\zeropoint
- \strutdimen\minimumstrutdepth
- \else
- \advance\strutdimen-\strutheight
- \fi
- \else
- \ifdim\minimumstrutdepth>\zeropoint
- \strutdimen\minimumstrutdepth
- \else
- \strutdimen\strutdepthfactor\strutdimen
- \fi
- \strutdimen\spacingfactor\strutdimen
- \fi
- \edef\strutdepth{\the\strutdimen}%
+ \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
\dosetstrut}
-\def\setcharstrut#1%
+\unexpanded\def\setcharstrut#1%
{\setbox\strutbox\normalhbox{#1}%
\edef\strutheight{\the\strutht}%
\edef\strutdepth {\the\strutdp}%
@@ -2073,10 +2199,10 @@
%
% better, since some fonts have small (but descending Q etc)
-\def\setfontstrut
+\unexpanded\def\setfontstrut
{\setcharstrut{(gplQT}}
-\def\setcapstrut% could be M, but Q has descender
+\unexpanded\def\setcapstrut% could be M, but Q has descender
{\setcharstrut{Q}}
%D Handy for math (used in mathml):
@@ -2907,7 +3033,7 @@
{\begingroup % geen \bgroup, anders in mathmode lege \hbox
\ifincolor
\ifcsname#1#3\endcsname
- \let\dostopattributes\@@dostopattributes
+ \let\dostopattributes\@@dostopattributes
\faststartcolor[\csname#1#3\endcsname]%
\else
\let\dostopattributes\@@nostopattributes
@@ -3540,7 +3666,7 @@
\def\setupalign
{\dosingleargument\dosetupalign}
-\def\dosetupalign[#1]%
+\def\dosetupalign[#1]% can be made faster by checking for defined #1
{\!!doneafalse
\!!donebfalse
\processcommacommand[#1]\dodosetupngila
diff --git a/tex/context/base/core-syn.lua b/tex/context/base/core-syn.lua
index 1b4eb1e92..10bd9d6d9 100644
--- a/tex/context/base/core-syn.lua
+++ b/tex/context/base/core-syn.lua
@@ -1,116 +1,127 @@
--- filename : core-syn.lua
--- comment : companion to core-syn.tex
--- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
--- copyright: PRAGMA ADE / ConTeXt Development Team
--- license : see context related readme files
-
-if not versions then versions = { } end versions['core-syn'] = 1.001
-if not jobs then jobs = { } end
-if not job then jobs['main'] = { } end job = jobs['main']
-if not job.sortedlists then job.sortedlists = { } end
-
-function job.definesortedlist(id)
- if not job.sortedlists[id] then
- job.sortedlists[id] = { }
- end
+if not modules then modules = { } end modules ['core-syn'] = {
+ version = 1.001,
+ comment = "companion to core-syn.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+sorters = sorters or { }
+sorters.list = sorters.list or { }
+
+function sorters.list.compare(a,b)
+ return sorters.comparers.basic(a,b,1)
end
-sorters = sorters or { }
-sorters.list = sorters.list or { }
-sorters.list.data = sorters.list.data or { }
+function sorters.list.prepare(data)
+ sorters.prepare(data,sorters.splitters.utf,1)
+end
-do
+function sorters.list.sort(data)
+ sorters.sort(data,sorters.list.compare)
+end
- function sorters.list.compare(a,b)
- return sorters.comparers.basic(a,b,1)
- end
+function sorters.list.unique(data)
+ sorters.unique(data)
+end
- function sorters.list.prepare(data)
- sorters.prepare(data,sorters.splitters.utf,1)
- end
+function sorters.list.cleanup(data)
+ sorters.cleanup(data)
+end
- function sorters.list.sort(data)
- sorters.sort(data,sorters.list.compare)
+function sorters.list.finalize(data) -- hm, this really needs documentation
+ -- we use the same splitter as with indices
+ local split = { }
+ for k,v in ipairs(data) do
+ local entry, tag = v[2][1][3][1], ""
+ local se = sorters.entries[sorters.language]
+ 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
+ split[entry] = split[entry] or { tag = tag, data = { } }
+ split[entry].data[#split[entry].data+1] = v
end
+ return split
+end
- function sorters.list.unique(data)
- sorters.unique(data)
- end
+-- for the moment we use the old structure, some day mkiv code
+-- will be different: more structure, less mess
- function sorters.list.cleanup(data)
- sorters.cleanup(data)
- end
+local template = {
+ entry = "\\synonymentry{%s}{%s}{%s}{%s}"
+}
- function sorters.list.finalize(data)
- -- we use the same splitter as with indices
- local split = { }
- for k,v in ipairs(data) do
- local entry, tag = v[2][1][3][1], ""
- local se = sorters.entries[sorters.language]
- 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
- split[entry] = split[entry] or { tag = tag, data = { } }
- split[entry].data[#split[entry].data+1] = v
+function sorters.list.flush(sorted,class)
+ -- for the moment we don't add split data (letters) yet
+ class = class or 'abbreviation'
+ for k,v in ipairs(table.sortedkeys(sorted)) do
+ for _, vv in ipairs(sorted[v].data) do
+ tex.sprint(tex.ctxcatcodes,template.entry:format(class,vv[2][1][1],vv[2][1][2],vv[3]))
end
- return split
end
+end
+
+function sorters.list.process(data)
+ return sorters.process('list',data)
+end
- -- for the moment we use the old structure, some day mkiv code
- -- will be different: more structure, less mess
+-- interface to tex end
- local template = {
- entry = "\\synonymentry{%s}{%s}{%s}{%s}"
- }
+joblists = joblists or { }
+joblists.collected = joblists.collected or { }
+joblists.tobesaved = joblists.tobesaved or { }
- function sorters.list.flush(sorted,class,flush)
- -- for the moment we don't add split data (letters) yet
- flush = flush or print
- class = class or 'abbreviation'
- for k,v in ipairs(table.sortedkeys(sorted)) do
- for _, vv in ipairs(sorted[v].data) do
- flush(string.format(template.entry,class,vv[2][1][1],vv[2][1][2],vv[3]))
- end
- end
- end
+local collected, tobesaved = joblists.collected, joblists.tobesaved
- function sorters.list.process(data)
- return sorters.process('list',data)
+local function initializer()
+ collected, tobesaved = joblists.collected, joblists.tobesaved
+end
+
+job.register('joblists.collected', joblists.tobesaved, initializer, nil)
+
+local function allocate(class)
+ local d = tobesaved[class]
+ if not d then
+ d = {
+ language = 'en',
+ entries = { },
+ sorted = false,
+ class = class
+ }
+ tobesaved[class] = d
end
+ return d
+end
+local function collect(class)
+ return collected[class]
end
--- { { entry, key } }, meaning
-
-function job.loadsortedlist(class)
- if job.sortedlists[class] then
- if not sorters.list.data[class] then
- sorters.list.data[class] = {
- language = 'en',
- entries = { },
- flush = function(s) tex.sprint(tex.ctxcatcodes,s) end,
- sorted = false,
- class = class
- }
- local entries = sorters.list.data[class].entries
- for k,v in ipairs(job.sortedlists[class]) do
- if v[1] == 'l' then -- language
- sorters.list.data[class].language = v[2]
- else
- entries[#entries+1] = {
- v[1], -- kind (e)
- { { v[2], v[3] } }, -- entry, key
- v[4] -- optional meaning
- }
- end
- end
- end
- sorters.list.process(sorters.list.data[class])
+joblists.define = allocate
+
+-- this should be more generic, i.e. userdata = { meaning = "" }
+-- or at least we should get rid of the { { } } which is a quick
+-- hack to share code with the indexer
+
+function joblists.save_entry(class,kind,entry,key,meaning)
+ local data = allocate(class).entries
+ data[#data+1] = { kind, { { entry, key } }, meaning } -- { kind, entry, key, meaning }
+end
+
+function joblists.save_variable(class,key,value)
+ if key == "l" then key = "language" end
+ allocate(class)[key] = value
+end
+
+function joblists.process(class)
+ local data = collect(class)
+ if data then
+ sorters.list.process(data)
end
end
diff --git a/tex/context/base/core-syn.mkiv b/tex/context/base/core-syn.mkiv
index 23385c9e6..3b5398b56 100644
--- a/tex/context/base/core-syn.mkiv
+++ b/tex/context/base/core-syn.mkiv
@@ -15,36 +15,19 @@
\registerctxluafile{core-syn}{1.001}
-\appendtoks
- \immediatewriteutilitytua{if not job.sortedlists then job.sortedlists = { } end}%
- \immediatewriteutilitytua{local js = job.sortedlists}%
-\to \everyopenutilities
-
-\let\allsortedlists\empty
-
-\appendtoks
- \processcommacommand[\allsortedlists]\mkdodefinesortedlist
- \globallet\allsortedlists\empty
-\to \everyopenutilities
-
-\def\mkdodefinesortedlist#1% class
- {\ctxlua{job.definesortedlist('#1')}%
- \immediatewriteutilitytua{job.definesortedlist('#1')}}
-
\def\mkdefinesortedlist#1% class
- {\mkdodefinesortedlist{#1}%
- \doglobal\addtocommalist{#1}\allsortedlists}
+ {\ctxlua{joblists.define('#1')}}
\def\mksavesortedlistentry#1#2#3#4% class key entry meaning
- {\immediatewriteutilitytua{ti(js['#1'],{'e','#2',\!!bs#3\!!es,\!!bs#4\!!es})}}
+ {\ctxlua{joblists.save_entry('#1','e','#2',\!!bs#3\!!es,\!!bs#4\!!es)}}
\def\mksavesortedlistvariable#1#2#3% class type value
- {\immediatewriteutilitytua{ti(js['#1'],{'#2','#3'})}}
+ {\ctxlua{joblists.save_variable('#1','#2','#3')}}
\def\mkloadsortedlist#1% class
{\bgroup
\getvalue{\s!set#1}%
- \ctxlua{job.loadsortedlist('#1')}%
+ \ctxlua{joblists.process('#1')}%
\getvalue{\s!reset#1}%
\egroup}
diff --git a/tex/context/base/core-syn.tex b/tex/context/base/core-syn.tex
index 8d2817438..926e58233 100644
--- a/tex/context/base/core-syn.tex
+++ b/tex/context/base/core-syn.tex
@@ -80,8 +80,10 @@
\c!inbetween=\synonymparameter\c!inbetween,
\c!after=\synonymparameter\c!after,
\c!indentnext=\synonymparameter\c!indentnext,
- \c!headstyle=,
- \c!style=]%
+ \c!headstyle=\synonymparameter\c!headstyle,
+ \c!headcolor=\synonymparameter\c!headcolor,
+ \c!style=,
+ \c!color=]%
\setupwhitespace[\v!none]%
%doutilities{#1}\jobname{#2}\relax\par % no longer \par
\mkloadsortedlist{#1}%
@@ -196,6 +198,7 @@
\dosetupsynonyms
[#1]%
[\c!synonymstyle=,\c!textstyle=,
+ \c!headstyle=,\c!headcolor=,
\c!state=\v!start,\c!criterium=,
\c!location=\v!left,\c!width=5em,\c!distance=0pt,
\c!sample=,\c!hang=,\c!align=,
@@ -421,9 +424,11 @@
\setupsynonyms
[\v!abbreviation]
[\c!textstyle=\v!capital,
- \c!synonymstyle=,
\c!textcolor=,
+ \c!synonymstyle=,
\c!synonymcolor=,
+ \c!headstyle=,
+ \c!headcolor=,
\c!location=\v!left,
\c!width=5em,
\c!state=\v!start]
diff --git a/tex/context/base/core-tbl.tex b/tex/context/base/core-tbl.tex
index 843e92662..a5d5a37da 100644
--- a/tex/context/base/core-tbl.tex
+++ b/tex/context/base/core-tbl.tex
@@ -198,20 +198,31 @@
\def\tablebox#1%
{\csname\@@tabbox@@\number#1\endcsname}
-\def\checktablebox#1%
- {\ifundefinedelse{\@@tabbox@@\number#1}%
- \expandafter\newbox\csname\@@tabbox@@\number#1\endcsname
- \fi}
+% \def\checktablebox#1%
+% {\ifundefinedelse{\@@tabbox@@\number#1}%
+% \expandafter\newbox\csname\@@tabbox@@\number#1\endcsname
+% \fi}
-\def\initializetablebox#1%
- {\ifundefined{\@@tabbox@@\number#1}%
- \expandafter\newbox\csname\@@tabbox@@\number#1\endcsname
- \else
+\def\initializetablebox#1% also used elsewhere
+ {\ifcsname\@@tabbox@@\number#1\endcsname
\global\setbox\csname\@@tabbox@@\number#1\endcsname\box\voidb@x
+ \else
+ \expandafter\newbox\csname\@@tabbox@@\number#1\endcsname
\fi}
+% \def\initializetableboxes#1% hm, not that efficient, best make a simple dedicated tail recurser
+% {\dorecurse#1{\initializetablebox\recurselevel}}
+
\def\initializetableboxes#1%
- {\dorecurse#1{\initializetablebox\recurselevel}}
+ {\scratchcounter#1\relax
+ \doinitializetableboxes}
+
+\def\doinitializetableboxes
+ {\ifnum\scratchcounter>\zerocount
+ \initializetablebox\scratchcounter
+ \advance\scratchcounter\minusone
+ \expandafter\doinitializetableboxes
+ \fi}
\initializetableboxes\noftabcolumns
@@ -270,7 +281,6 @@
% some entries can be left out if we test for them being set
\@EA\appendtoks \@EA&\@EA\hskip\pretabskip\pretabrule##&\to\!!toksa
\appendtoks \ignorespaces\to\!!toksa
-% \@EA\appendtoks\@EA\xdef\@EA\tabulatecolumn\@EA{\the\tabulatecolumns}\to\!!toksa
\@EA\appendtoks\@EA\global\@EA\tabulatecolumn\the\tabulatecolumns\relax\to\!!toksa
\appendtoks \checktabulatesetups\to\!!toksa
\appendtoks \checktabulatehook\to\!!toksa
@@ -307,6 +317,32 @@
\let\gettabulateexit\dogettabulateexit
\tabulatewidth\zeropoint}
+% todo: we can speed up this module a bit
+%
+% \expanded{\!!toksa{\the\!!toksa
+% &\hskip\pretabskip\noexpand\pretabrule####&
+% \ignorespaces
+% \global\tabulatecolumn\the\tabulatecolumns
+% \noexpand\checktabulatesetups
+% \noexpand\checktabulatehook
+% \preamblebox
+% \bgroup\noexpand\bbskip\bgroup\normalunexpanded{#1}%
+% \noexpand\ifnum\tabulatetype=\plusone \noexpand\else
+% \the\tabulatebmath
+% \the\tabulatefont
+% \the\tabulatesettings
+% \the\tabulatebefore
+% \noexpand\fi
+% \bgroup\ignorespaces
+% \noexpand\tabulatehook####%
+% \unskip\unskip\noexpand\ifmmode\noexpand\else\endgraf\noexpand\fi\egroup
+% \noexpand\ifnum\noexpand\tabulatetype=1 \noexpand\else
+% \the\tabulateafter
+% \the\tabulateemath
+% \noexpand\fi
+% \normalunexpanded{#2}\egroup\egroup
+% &\noexpand\posttabrule\hskip\noexpand\postabskip####}}%
+
\def\dosettabulatepreamble
{\ifx\next\relax
\let\nextnext\relax % == \expandafter\gobbleoneargument
@@ -718,12 +754,13 @@
\resetcharacteralign
% todo: spacing around tabulate when bodyfont is set
% expansion en test needed ?
- \splittabulatefalse
+ \splittabulatetrue
\processaction
[\tabulateparameter\c!split]
- [ \v!yes=>\splittabulatetrue,
+ [% \v!yes=>\splittabulatetrue,
% \v!repeat=>\splittabulatetrue, % todo, default yes
- \v!auto=>\ifinsidesplitfloat\splittabulatetrue\fi]%
+ \v!no=>\splittabulatefalse,
+ \v!auto=>\ifinsidefloat\ifinsidesplitfloat\else\splittabulatefalse\fi\fi]%
\doifvaluesomething{\??tt\currenttabulate\c!bodyfont}
{\expanded{\switchtobodyfont
[\tabulateparameter\c!bodyfont]}}%
@@ -809,7 +846,7 @@
%\def\dotabulateruleseperator
% {\vskip\strutdp}
-\def\dotabulateruleseperator
+\def\dotabulateruleseperator % can be sped up
{\bgroup
\let\factor\!!plusone
\scratchskip\strutdp
@@ -908,6 +945,14 @@
\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}
+
\bgroup \catcode`\|=\@@other
\gdef\processtabulate[|#1|]% in the process of optimizing
@@ -915,14 +960,15 @@
\checkfulltabulatecontent
\globallet\tabulateruledepth \!!zeropoint
\globallet\tabulateruleheight\!!zeropoint
- \ExpandFirstAfter\processaction % use \setalignmentswitch instead
- [\tabulateparameter\c!align]
- [ \v!normal=>\def\@@tabulatealign{0},% = default value
- \v!right=>\def\@@tabulatealign{1},% chardefs gebruiken
- \v!left=>\def\@@tabulatealign{2},%
- \v!middle=>\def\@@tabulatealign{3},%
- \s!default=>\def\@@tabulatealign{0},%
- \s!unknown=>\def\@@tabulatealign{0}]%
+ \edef\@@tabulatealign{\executeifdefined{\??tt:\c!align:\tabulateparameter\c!align}0}%
+% \ExpandFirstAfter\processaction % use \setalignmentswitch instead
+% [\tabulateparameter\c!align]
+% [ \v!normal=>\def\@@tabulatealign{0},% = default value
+% \v!right=>\def\@@tabulatealign{1},% chardefs gebruiken
+% \v!left=>\def\@@tabulatealign{2},%
+% \v!middle=>\def\@@tabulatealign{3},%
+% \s!default=>\def\@@tabulatealign{0},%
+% \s!unknown=>\def\@@tabulatealign{0}]%
\let\pretabskip\!!zeropoint
\def\postabskip{.5\tabulateunit}%
\global\tabulatecolumns\zerocount
@@ -941,10 +987,11 @@
\donetrue
\fi\fi
\ifdone
- \processaction
- [\tabulateparameter\c!header]
- [\v!repeat=>\chardef\tabulaterepeathead\plusone,
- \v!text=>\chardef\tabulaterepeathead\plustwo]%
+ \chardef\tabulaterepeathead\executeifdefined{\??tt:\c!header:\tabulateparameter\c!header}\zerocount
+% \processaction
+% [\tabulateparameter\c!header]
+% [\v!repeat=>\chardef\tabulaterepeathead\plusone,
+% \v!text=>\chardef\tabulaterepeathead\plustwo]%
\fi
\unexpanded \def\NC{\tabulatenormalcolumn0}%
\unexpanded \def\RC{\tabulatenormalcolumn1}%
@@ -1115,45 +1162,6 @@
\totalnoftabulatelines\noftabulatelines
\minusnoftabulatelines\numexpr\noftabulatelines+\minusone\relax
\global\noftabulatelines\zerocount
-% not satisfying
-% \def\doHL##1%
-% {\TABLEnoalign
-% {\ifnum\noftabulatelines=\zerocount
-% \ifcase##1%
-% \@EAEAEA\ML
-% \or
-% \@EAEAEA\FL
-% \fi
-% \else\ifnum\noftabulatelines=\totalnoftabulatelines
-% \ifcase##1%
-% \@EA\@EAEAEA\@EA\ML
-% \or
-% \@EA\@EAEAEA\@EA\LL
-% \fi
-% \else
-% \@EAEAEA\ML
-% \fi\fi}}%
-% not good either
-% \def\doHL##1%
-% {\TABLEnoalign
-% {\csname\ifnum\noftabulatelines=\zerocount
-% \ifcase##1M\or F\fi
-% \else\ifnum\noftabulatelines=\totalnoftabulatelines
-% \ifcase##1M\or L\fi
-% \else
-% M%
-% \fi\fi L\endcsname}}%
-% ok
-% \def\doHL##1% ##1 ignored
-% {\TABLEnoalign
-% {\ifnum\noftabulatelines=\zerocount
-% \@EA\FL
-% \else\ifnum\noftabulatelines=\totalnoftabulatelines
-% \@EAEAEA\LL
-% \else
-% \@EAEAEA\ML
-% \fi\fi}}%
-% more fun
\def\doHL##1% ##1 ignored
{\TABLEnoalign
{\csname
diff --git a/tex/context/base/core-tsp.tex b/tex/context/base/core-tsp.tex
index 3046a1dda..e9f0e7d58 100644
--- a/tex/context/base/core-tsp.tex
+++ b/tex/context/base/core-tsp.tex
@@ -13,10 +13,6 @@
\writestatus{loading}{Context OTR Macros / Floating Bodies}
-\beginTEX
- \expandafter \endinput
-\endTEX
-
%D The code in this file is move here from other places.
\unprotect
diff --git a/tex/context/base/core-two.lua b/tex/context/base/core-two.lua
index 45f1d0f46..748c4eb97 100644
--- a/tex/context/base/core-two.lua
+++ b/tex/context/base/core-two.lua
@@ -6,68 +6,90 @@ if not modules then modules = { } end modules ['core-two'] = {
license = "see context related readme files"
}
+local texprint = tex.print
+
--[[ldx--
-We save multi-pass information in the main utility table.
+We save multi-pass information in the main utility table. This is a
+bit of a mess because we support old and new methods.
--ldx]]--
-if not jobs then jobs = { } end
-if not job then jobs['main'] = { } end job = jobs['main']
-if not job.twopass then job.twopass = { } end
+jobpasses = jobpasses or { }
+jobpasses.collected = jobpasses.collected or { }
+jobpasses.tobesaved = jobpasses.tobesaved or { }
+
+local collected, tobesaved = jobpasses.collected, jobpasses.tobesaved
-function job.definetwopassdata(id)
- job.twopass[id] = job.twopass[id] or { }
+local function initializer()
+ collected, tobesaved = jobpasses.collected, jobpasses.tobesaved
end
-function job.gettwopassdata(id)
- local jti = job.twopass[id]
- if jti and #jti > 0 then
- tex.print(jti[1])
- table.remove(jti,1)
+job.register('jobpasses.collected', jobpasses.tobesaved, initializer, nil)
+
+local function allocate(id)
+ local p = tobesaved[id]
+ if not p then
+ p = { }
+ tobesaved[id] = p
end
+ return p
+end
+
+jobpasses.define = allocate
+
+function jobpasses.save(id,str)
+ local jti = allocate(id)
+ jti[#jti+1] = str
end
-function job.checktwopassdata(id)
- local jti = job.twopass[id]
+function jobpasses.savetagged(id,tag,str)
+ local jti = allocate(id)
+ jti[tag] = str
+end
+
+function jobpasses.get(id)
+ local jti = collected[id]
if jti and #jti > 0 then
- tex.print(jti[1])
+ tex.print(table.remove(jti,1))
end
end
-function job.getfromtwopassdata(id,n)
- local jti = job.twopass[id]
- if jti and jti[n] then
- tex.print(jti[n])
+function jobpasses.first(id)
+ local jti = collected[id]
+ if jti and #jti > 0 then
+ tex.print(jti[1])
end
end
-job.findtwopassdata = job.getfromtwopassdata
-job.getfirstpassdata = job.checktwopassdata
-
-function job.getlasttwopassdata(id)
- local jti = job.twopass[id]
+function jobpasses.last(id)
+ local jti = collected[id]
if jti and #jti > 0 then
tex.print(jti[#jti])
end
end
-function job.noftwopassitems(id)
- local jti = job.twopass[id]
- if jti then
- tex.print(#jti)
- else
- tex.print('0')
+jobpasses.check = jobpasses.first
+
+function jobpasses.find(id,n)
+ local jti = collected[id]
+ if jti and jti[n] then
+ texprint(jti[n])
end
end
-function job.twopassdatalist(id)
- local jti = job.twopass[id]
+function jobpasses.count(id)
+ local jti = collected[id]
+ texprint((jti and #jti) or 0)
+end
+
+function jobpasses.list(id)
+ local jti = collected[id]
if jti then
- tex.print(table.concat(jti,','))
+ texprint(table.concat(jti,','))
end
end
-function job.doifelseintwopassdata(id,str)
- local jti = job.twopass[id]
+function jobpasses.doifinlistelse(id,str)
+ local jti = collected[id]
if jti then
local found = false
for _, v in pairs(jti) do
@@ -81,3 +103,23 @@ function job.doifelseintwopassdata(id,str)
cs.testcase(false)
end
end
+
+--
+
+function jobpasses.savedata(id,data)
+ local jti = allocate(id)
+ jti[#jti+1] = data
+ return #jti
+end
+
+function jobpasses.getdata(id,index,default)
+ local jti = collected[id]
+ texprint((jit and jti[index]) or default)
+end
+
+function jobpasses.getfield(id,index,tag,default)
+ local jti = collected[id]
+ jti = jit and jti[index]
+ texprint((jit and jti[tag]) or default)
+end
+
diff --git a/tex/context/base/core-two.mkiv b/tex/context/base/core-two.mkiv
index bbdc6d489..f4062725a 100644
--- a/tex/context/base/core-two.mkiv
+++ b/tex/context/base/core-two.mkiv
@@ -15,69 +15,30 @@
\registerctxluafile{core-two}{1.001}
-\appendtoks
- \immediatewriteutilitytua{if not job.twopass then job.twopass = { } end}%
- \immediatewriteutilitytua{local tp = job.twopass}%
-\to \everyopenutilities
-
%D I'm not that sure if this behaves exactly like mkii. This needs a cleanup.
-% \def\immediatesavetwopassdata #1#2#3{\immediatewriteutilitycommand{\twopassentry{#1}{#2}{#3}}}
-% \def\savetwopassdata #1#2#3{\writeutilitycommand{\twopassentry{#1}{#2}{#3}}}
-% \def\lazysavetwopassdata #1#2#3{\expanded{\writeutilitycommand{\noexpand\twopassentry{#1}{#2}{#3}}}} % expanded !
-% \def\savetaggedtwopassdata #1#2#3#4{\immediatewriteutilitycommand{\twopassentry{#1}{#2}{#3::#4}}}
-% \def\lazysavetaggedtwopassdata#1#2#3#4{\expanded{\writeutilitycommand{\noexpand\twopassentry{#1}{#2}{#3::#4}}}} % expanded !
-
-\def\immediatesavetwopassdata #1#2#3{\expanded{\immediatewriteutilitytua{ti(tp['#1'],"#3")}}}
-\def\savetwopassdata #1#2#3{\expanded{\writeutilitytua {ti(tp['#1'],"#3")}}}
-\def\lazysavetwopassdata #1#2#3{\expanded{\writeutilitytua {ti(tp['#1'],"#3")}}}
-\def\savetaggedtwopassdata #1#2#3#4{\expanded{\immediatewriteutilitytua{tp['#1']['#3']="#4"}}}
-\def\lazysavetaggedtwopassdata #1#2#3#4{\expanded{\writeutilitytua {tp['#1']['#3']="#4"}}}
+\def\immediatesavetwopassdata #1#2#3{\expanded{\ctxlua {jobpasses.save('#1',"#3")}}}
+\def\savetwopassdata #1#2#3{\expanded{\ctxlatetua{jobpasses.save('#1',"#3")}}}
+\def\lazysavetwopassdata #1#2#3{\expanded{\ctxlatelua{jobpasses.save('#1',"#3")}}}
+\def\savetaggedtwopassdata #1#2#3#4{\expanded{\ctxlua {jobpasses.savetagged('#1','#3',"#4")}}}
+\def\lazysavetaggedtwopassdata#1#2#3#4{\expanded{\ctxlatelua{jobpasses.savetagged('#1','#3',"#4")}}}
% temp hack: needs a proper \starteverytimeluacode
-\def\dodefinetwopasslist#1%
- {\ctxlua{job.definetwopassdata('#1')}%
- \immediatewriteutilitytua{job.definetwopassdata('#1')}}
-
-\def\definetwopasslist#1%
- {\dodefinetwopasslist{#1}%
- \doglobal\addtocommalist{#1}\alltwopasslists}
-
-\appendtoks
- \processcommacommand[\alltwopasslists]\dodefinetwopasslist
- \globallet\alltwopasslists\empty
-\to \everyopenutilities
-
-\def\testtwopassdata
- {\ifx\twopassdata\empty\twopassdatafoundfalse\else\twopassdatafoundtrue\fi}
-
-\def\gettwopassdata#1%
- {\edef\twopassdata{\ctxlua{job.gettwopassdata("#1")}}\testtwopassdata}
-
-\def\checktwopassdata#1%
- {\edef\twopassdata{\ctxlua{job.checktwopassdata("#1")}}\testtwopassdata}
-
-\def\findtwopassdata#1#2%
- {\edef\twopassdata{\ctxlua{job.findtwopassdata("#1","#2")}}\testtwopassdata}
-
-\let\getfirsttwopassdata\checktwopassdata
-
-\def\getlasttwopassdata#1%
- {\edef\noftwopassitems{\ctxlua{job.noftwopassitems("#1")}}%
- \edef\twopassdata {\ctxlua{job.getlasttwopassdata("#1")}}%
- \testtwopassdata}
-
-\def\getfromtwopassdata#1#2%
- {\edef\twopassdata{\ctxlua{job.getfromtwopassdata("#1",#2)}}\testtwopassdata}
+\def\testtwopassdata{\ifx\twopassdata\empty\twopassdatafoundfalse\else\twopassdatafoundtrue\fi}
-\def\gettwopassdatalist
- {\getnamedtwopassdatalist\twopassdatalist}
+% todo: move the edef to lua
-\def\getnamedtwopassdatalist#1#2% \cs tag
- {\edef#1{\ctxlua{job.twopassdatalist("#2")}}}
+\def\definetwopasslist #1{\ctxlua{jobpasses.define('#1')}}
+\def\gettwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.get("#1")}}\testtwopassdata}
+\def\checktwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.check("#1")}}\testtwopassdata}
+\def\findtwopassdata #1#2{\edef\twopassdata{\ctxlua{jobpasses.find("#1","#2")}}\testtwopassdata}
+\def\getfirsttwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.first("#1")}}\testtwopassdata}
+\def\getlasttwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.last("#1")}}\edef\noftwopassitems{\ctxlua{jobpasses.count("#1")}}\testtwopassdata}
+\def\getnamedtwopassdatalist#1#2{\edef#1{\ctxlua{jobpasses.list("#2")}}}
+\def\gettwopassdatalist #1{\edef\twopassdatalist{\ctxlua{jobpasses.list("#1")}}}
+\def\doifelseintwopassdata #1#2{\ctxlua{jobpasses.doifinlistelse("#1","#2")}}
-\def\doifelseintwopassdata#1#2% tag dat
- {\ctxlua{job.doifelseintwopassdata("#1","#2"))}}
+\let\getfromtwopassdata\findtwopassdata
\protect \endinput
diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua
index 00811e528..fc99f67cb 100644
--- a/tex/context/base/core-uti.lua
+++ b/tex/context/base/core-uti.lua
@@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['core-uti'] = {
license = "see context related readme files"
}
+-- todo: keep track of changes here (hm, track access, and only true when
+-- accessed and changed)
+
--[[ldx--
A utility file has always been part of and with
the move to we also moved a lot of multi-pass info
@@ -14,9 +17,12 @@ utility file under different setups, we now load a table once. This
saves much runtime but at the cost of more memory usage.
--ldx]]--
-if not jobs then jobs = { } end
-if not job then jobs['main'] = { } end job = jobs['main']
-if not job.variables then job.variables = { } end
+local format = string.format
+
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+
+jobs.version = 1.01
--[[ldx--
Variables are saved using in the previously defined table and passed
@@ -24,6 +30,88 @@ onto using the following method. Of course one can also
directly access the variable using a call.
--ldx]]--
-function job.initializevariable(cs,value)
- tex.sprint("\\xdef\\"..cs.."{"..value.."}")
+local savelist, comment = { }, { }
+
+function job.comment(...)
+ for _, str in ipairs({...}) do
+ comment[#comment+1] = str
+ end
+end
+
+job.comment(format("version: %1.2f",jobs.version))
+
+job._save_, job._load_ = { }, { }
+
+function job.save(filename)
+ input.starttiming(job._save_)
+ local f = io.open(filename,'w')
+ if f then
+ for _, str in ipairs(comment) do
+ f:write("-- ",str,"\n")
+ end
+ f:write("\n")
+ for _, list in ipairs(savelist) do
+ local target, data, finalizer = list[1], list[2], list[4]
+ if type(finalizer) == "function" then
+ finalizer()
+ end
+ f:write(aux.definetable(target),"\n")
+ f:write(table.serialize(data,target,true,true),"\n")
+ end
+ f:close()
+ end
+ input.stoptiming(job._save_)
+end
+
+function job.load(filename)
+ input.starttiming(job._load_)
+ local data = io.loaddata(filename)
+ if data and data ~= "" then
+ local version = tonumber(data:match("^-- version: ([%d%.]+)"))
+ if version ~= jobs.version then
+ logs.report("job","version mismatch with jobfile: %s <> %s", version or "?", jobs.version)
+ else
+ loadstring(data)()
+ for _, list in ipairs(savelist) do
+ local target, initializer = list[1], list[3]
+ if type(initializer) == "function" then
+ initializer(aux.accesstable(target))
+ end
+ end
+ end
+ end
+ input.stoptiming(job._load_)
+end
+
+function job.initialize(loadname,savename)
+ job.load(loadname)
+ table.insert(input.stop_actions, function()
+ if not status.lasterrorstring or status.lasterrorstring == "" then
+ job.save(savename)
+ end
+ end)
end
+
+function job.register(...) -- collected, tobesaved, initializer, finalizer
+ savelist[#savelist+1] = { ... }
+end
+
+-- as an example we implement variables
+
+jobvariables = jobvariables or { }
+jobvariables.collected = jobvariables.collected or { }
+jobvariables.tobesaved = jobvariables.tobesaved or { }
+
+local function initializer()
+ for cs, value in pairs(jobvariables.collected) do
+ tex.sprint(string.format("\\xdef\\%s{%s}",cs,value))
+ end
+end
+
+job.register('jobvariables.collected', jobvariables.tobesaved, initializer)
+
+function jobvariables.save(cs,value)
+ jobvariables.tobesaved[cs] = value
+end
+
+
diff --git a/tex/context/base/core-uti.mkiv b/tex/context/base/core-uti.mkiv
index 89fc2d9d1..ddbc47311 100644
--- a/tex/context/base/core-uti.mkiv
+++ b/tex/context/base/core-uti.mkiv
@@ -35,70 +35,10 @@
%D \long\edef\luaescapestring#1{\!!bs#1\!!es}
%D \stoptyping
-%D Next we implement a few helpers:
-
-\newwrite\utility@tua
-
-\prependtoks
- \def \writeutilitytua {\write\utility@tua}
- \def\immediatewriteutilitytua{\immediate\write\utility@tua}
-\to \everyjob
-
-\let \writeutilitytua\gobbleoneargument
-\let\immediatewriteutilitytua\gobbleoneargument
-
-\appendtoks
- \immediate\openout\utility@tua=\jobname.tua
- \immediatewriteutilitytua{-- file\space\space\space: \jobname}%
- \immediatewriteutilitytua{-- format\space: \contextformat}%
- \immediatewriteutilitytua{-- stamp\space\space: \contextversion}%
- \immediatewriteutilitytua{-- escape\space: \!!bs\space...\space\!!es}%
- \immediatewriteutilitytua{-- version: \utilityversion}%
- \immediatewriteutilitytua{}%
- \immediatewriteutilitytua{-- begin of utility file}%
- \immediatewriteutilitytua{}%
- \immediatewriteutilitytua{if job and job.version and not job.version == "\utilityversion" then return end}%
- \immediatewriteutilitytua{if not job then job = { } end}%
- \immediatewriteutilitytua{job.version = "\utilityversion"}%
- \immediatewriteutilitytua{local ti = table.insert}%
-\to \everyopenutilities
-
-\appendtoks
- %\immediatewriteutilitytua{}%
- %\immediatewriteutilitytua{-- end of utility file}%
- %\immediate\closeout\utility@tua
-\to \everycloseutilities
-
-% The next file can be in lua or luc format:
-
-\appendtoks
- \ctxlua { do
- if not job then job = { } end
- job.version = "\utilityversion"
- local settings = io.loaddata("\jobname.tuc")
- if settings then
- % if settings and settings:find("\letterpercent -\letterpercent -\letterpercent s*end of utility file\letterpercent s*$") then
- settings = loadstring(settings)
- if settings then
- settings()
- else
- logs.report("utilityfile","invalid, not loaded")
- end
- else
- logs.report("utilityfile","not present")
- end
- end}%
-% \to \everyjob
-\to \everystarttext
-
% variables
-\appendtoks
- \immediatewriteutilitytua{if not job.variables then job.variables = { } end}%
-\to \everyopenutilities
-
\def\savecurrentvalue#1#2%
- {\immediatewriteutilitytua{job.initializevariable("\strippedcsname#1","#2")}}
+ {\ctxlua{jobvariables.save("\strippedcsname#1","#2")}}
% temp
@@ -118,4 +58,20 @@
\ctxlua{nodes.cleanup_reserved()}%
\to \everydump
+% new
+
+% this loads and also sets the saving
+
+\appendtoks
+ \ctxlua {
+ job.comment(
+ "file: \jobname",
+ "format: \contextformat",
+ "stamp: \contextversion",
+ "escape: \!!bs\space...\space\!!es"
+ )
+ job.initialize("\jobname.tuc","\jobname.tua")
+ }%
+\to \everystarttext
+
\protect \endinput
diff --git a/tex/context/base/core-uti.tex b/tex/context/base/core-uti.tex
index b564347c1..e84a6db5c 100644
--- a/tex/context/base/core-uti.tex
+++ b/tex/context/base/core-uti.tex
@@ -33,6 +33,7 @@
\edef\utilityversion{2003.07.19} % was: 1998.12.20 % object pages
\edef\utilityversion{2006.06.23} % was: 2003.07.19 % -- instead of :
\edef\utilityversion{2006.09.21} % pt in pos
+\edef\utilityversion{2008.10.14} % moved more to lua in mkiv
% Bepaalde commando's worden als string weggeschreven. Deze
% zijn aan het eind van deze file gedefinieerd.
@@ -114,7 +115,7 @@
\newtoks \everycloseutilities
\newtoks \everycheckutilities
-\def\openutilities {\the\everyopenutilities }
+\def\openutilities {\the\everyopenutilities } % \global\everyopenutilities\emptytoks
\def\closeutilities{\the\everycloseutilities}
\def\checkutilities{\the\everycheckutilities}
diff --git a/tex/context/base/core-var.tex b/tex/context/base/core-var.tex
index 61a8c87e7..38c434e0b 100644
--- a/tex/context/base/core-var.tex
+++ b/tex/context/base/core-var.tex
@@ -431,11 +431,11 @@
%D mode, even when users explicitly ask for \PDF\ output in the
%D \PDFTEX\ configuration file.
-\ifx\pdfoutput\undefined \else
-
- \prependtoks \pdfoutput=0 \to \everyjob
-
-\fi
+% we assume no pdfcontext or whatever
+%
+% \ifx\pdfoutput\undefined \else
+% \prependtoks \pdfoutput=0 \to \everyjob
+% \fi
%D \macros
%D {setvariables,getvariable,getvariabledefault}
@@ -503,26 +503,13 @@
\long\def\setgvariable#1#2#3{\long\setgvalue{\??vars:#1:#2}{#3}}
\long\def\setxvariable#1#2#3{\long\setxvalue{\??vars:#1:#2}{#3}}
-\beginTEX
-
-\def\getvariable#1#2% to be sped up
- {\csname
- \ifundefined{\??vars:#1:#2}\s!empty\else\??vars:#1:#2\fi
- \endcsname}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\getvariable#1#2% to be sped up
{\csname
\ifcsname\??vars:#1:#2\endcsname\??vars:#1:#2\else\s!empty\fi
\endcsname}
-\endETEX
-
\def\showvariable#1#2%
- {\showvalue{\ifundefined{\??vars:#1:#2}\s!empty\else\??vars:#1:#2\fi}}
+ {\showvalue{\ifcsname\??vars:#1:#2\endcsname\??vars:#1:#2\else\s!empty\fi}}
\let\currentvariableclass\empty
@@ -532,27 +519,27 @@
%D A few trivial macros:
\def\doifelsevariable#1#2%
- {\ifundefined{\??vars:#1:#2}%
- \expandafter\secondoftwoarguments
- \else
+ {\ifcsname\??vars:#1:#2\endcsname
\expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
\fi}
\def\doifvariable#1#2%
- {\ifundefined{\??vars:#1:#2}%
- \expandafter\gobbleoneargument
- \else
+ {\ifcsname\??vars:#1:#2\endcsname
\expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
\fi}
\def\doifnotvariable#1#2%
- {\ifundefined{\??vars:#1:#2}%
- \expandafter\firstofoneargument
- \else
+ {\ifcsname\??vars:#1:#2\endcsname
\expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
\fi}
-\def\getvariabledefault#1#2% #3%
+\def\getvariabledefault#1#2% #3% can be command, so no ifcsname here
{\executeifdefined{\??vars:#1:#2}}% {#3}
%D \macros
diff --git a/tex/context/base/core-ver.mkiv b/tex/context/base/core-ver.mkiv
index d22059f8c..dcc283d6f 100644
--- a/tex/context/base/core-ver.mkiv
+++ b/tex/context/base/core-ver.mkiv
@@ -21,23 +21,53 @@
% todo: obeytabs|spaces|lines|pages
+% \def\mksetupprettytype % todo check
+% {\processingverbatimtrue % will move
+% \ctxlua{buffers.doifelsevisualizer("\prettyidentifier")}
+% {\ctxlua{buffers.setvisualizer("\prettyidentifier")}%
+% % \def\obs{\obeyedspace}%
+% % \def\bop{\bgroup\beginofpretty}%
+% % \def\eop{\endofpretty\egroup}%
+% % \def\sop{\endofpretty\egroup\bgroup\beginofpretty}}
+% }
+% {\def\obs{\obeyedspace}}}
+% \def\mkinitializeverbatim
+% {\ctxlua{buffers.visualizers.reset()}%
+% \localcolortrue % tricky, maybe not here
+% \def\obs{\obeyedspace}%
+% \def\obs{\obeyedspace}%
+% \def\bop{\bgroup\beginofpretty}%
+% \def\eop{\endofpretty\egroup}%
+% \def\sop{\endofpretty\egroup\bgroup\beginofpretty}%
+% \verbatimfont
+% \resetfontfeature
+% \obeycharacters}
+
\def\mksetupprettytype % todo check
{\processingverbatimtrue % will move
+ \ctxlua{buffers.visualizers.reset()}}
+
+\newtoks \everyinitializeverbatim
+
+\def\mkinitializeverbatim
+ {\ctxlua{buffers.visualizers.reset()}%
+ \def\obs{\obeyedspace}%
\ctxlua{buffers.doifelsevisualizer("\prettyidentifier")}
{\ctxlua{buffers.setvisualizer("\prettyidentifier")}%
\localcolortrue % tricky, maybe not here
- \def\obs{\obeyedspace}%
\def\bop{\bgroup\beginofpretty}%
\def\eop{\endofpretty\egroup}%
- \def\sop{\endofpretty\egroup\bgroup\beginofpretty}}
- {\def\obs{\obeyedspace}}}
-
-\def\mkinitializeverbatim
- {\ctxlua{buffers.visualizers.reset()}%
- \def\obs{\obeyedspace}%
+ \def\sop{\endofpretty\egroup\bgroup\beginofpretty}}%
+ {\let\bop\donothing
+ \let\eop\donothing
+ \let\sop\donothing}%
\verbatimfont
+ \relax\the\everyinitializeverbatim\relax}
+
+\appendtoks
\resetfontfeature
- \obeycharacters}
+ \resetcharacterspacing
+\to \everyinitializeverbatim
% \ctxluafileload{verb-tex}{}
% \ctxluafileload{verb-mp} {}
@@ -52,9 +82,7 @@
% \edef\currenttyping{#1}%
% \initializetype % probably too much
% \verbatimcolor
-% \setcatcodetable \vrbcatcodes
-% \catcode`\{=\plusone
-% \catcode`\}=\plustwo
+% \setcatcodetable \typcatcodesa
% \dodotype}
% \def\dodotype#1%
@@ -84,8 +112,7 @@
{\ifx\next\bgroup
\@EA\dodotypeA
\else\if\next<%
- \doifelse{\typingparameter\c!option}\v!none
- {\@EAEAEA\dodotypeB}{\@EAEAEA\dodotypeC}%
+ \doifelse{\typingparameter\c!option}\v!none{\@EAEAEA\dodotypeB}{\@EAEAEA\dodotypeC}%
\else
\@EAEAEA\dodotypeD
\fi\fi}
@@ -93,23 +120,19 @@
\def\dodotypeA
{\initializetype % probably too much
\verbatimcolor
- \setcatcodetable \vrbcatcodes
- \catcode`\{=\plusone
- \catcode`\}=\plustwo
+ \setcatcodetable \typcatcodesa
\dodotypeAA}
\def\dodotypeAA#1%
{\mkinitializeverbatim
-\def\obs{\obeyedspace}%
+ \def\obs{\obeyedspace}%
\ctxlua{buffers.hooks.flush_line(\!!bs\detokenize{#1}\!!es)}%
\egroup}
\def\dodotypeB#1%
{\initializetype
\verbatimcolor
- \setcatcodetable \vrbcatcodes
- \catcode`\<=\plusone
- \catcode`\>=\plustwo
+ \setcatcodetable \typcatcodesb
\dodotypeBB}
\def\dodotypeBB#1%
@@ -121,9 +144,7 @@
\def\dodotypeC#1%
{\initializetype
\verbatimcolor
- \setcatcodetable \vrbcatcodes
- \catcode`\<=\plusone
- \catcode`\>=\plustwo
+ \setcatcodetable \typcatcodesb
\dodotypeCC}
\def\dodotypeCC#1%
@@ -140,7 +161,7 @@
\def\dodotypeD#1%
{\initializetype
\verbatimcolor
- \setcatcodetable \vrbcatcodes
+ \setcatcodetable \typcatcodesa
\def\dodotypeDD##1#1{\dodotypeAA{##1}}%
\dodotypeDD}
diff --git a/tex/context/base/core-ver.tex b/tex/context/base/core-ver.tex
index 93fa96944..57dba0af1 100644
--- a/tex/context/base/core-ver.tex
+++ b/tex/context/base/core-ver.tex
@@ -99,10 +99,85 @@
\def\setupprettytype{\mksetupprettytype}
+% \def\setupcommonverbatim
+% {\recatcodeuppercharactersfalse % obey regime / encoding
+% %
+% \let\prettyidentifier\s!default
+% %
+% \doifelse{\typingparameter\c!text}\v!yes
+% \naturaltextexttrue
+% \naturaltextextfalse
+% \def\prettyidentifierfont{\typingparameter\c!icommand}%
+% \def\prettyvariablefont {\typingparameter\c!vcommand}%
+% \def\prettynaturalfont {\typingparameter\c!ccommand}%
+% %
+% \doif{\typingparameter\c!space}\v!on
+% {\def\obeyspaces{\setcontrolspaces}}%
+% \doif{\typingparameter\c!page }\v!no
+% {\def\obeypages {\ignorepages}}%
+% %
+% \doifelse{\typingparameter\c!tab}\v!yes
+% {\def\obeytabs{\settabskips}}%
+% {\doif{\typingparameter\c!tab}\s!ascii
+% {\chardef\tabskipmode\plustwo % quit on >127
+% \def\obeytabs{\settabskips}}}%
+% %
+% \ignorehyphens % default
+% \ExpandFirstAfter\processaction
+% [\typingparameter\c!lines]
+% [ \v!yes=>\obeybreakpoints,
+% \v!hyphenated=>\obeyhyphens]%
+% \processaction
+% [\typingparameter\c!empty]
+% [\v!yes=>\obeyemptylines,
+% \v!all=>\obeyallemptylines]%
+% %
+% \ExpandFirstAfter\processaction
+% [\typingparameter\c!option]
+% [ \v!none=>\let\obeycharacters\relax,
+% \v!color=>\setupprettiesintype{TEX}%
+% \let\obeycharacters\setupprettytype
+% \let\obeytabs\ignoretabs,
+% \v!normal=>\let\obeycharacters\setupgroupedtype,
+% \v!commands=>\def\obeycharacters{\setupcommandsintype}% \let
+% \let\obeytabs\ignoretabs,
+% \v!slanted=>\let\obeycharacters\setupslantedtype
+% \let\obeytabs\ignoretabs,
+% \s!unknown=>\setupprettiesintype{\typingparameter\c!option}%
+% \let\obeycharacters\setupprettytype
+% \let\obeytabs\ignoretabs]%
+% \doifnumberelse{\typingparameter\c!tab}
+% {\def\obeytabs{\setfixedtabskips{\typingparameter\c!tab}}}%
+% \donothing
+% %\def\verbatimfont{\typingparameter\c!style\normalnoligatures\font}%
+% % more generic, but beware of the \redoconvertfont (else no typing in titles and such)
+% \def\verbatimfont{\redoconvertfont\dosetfontattribute{\currenttypingclass\currenttyping}\c!style\normalnoligatures\font}%
+% \setupverbatimcolor}
+
+\setvalue{\??tp:\c!lines:\v!yes }{\obeybreakpoints}
+\setvalue{\??tp:\c!lines:\v!hyphenated}{\obeyhyphens}
+
+\setvalue{\??tp:\c!empty:\v!yes }{\obeyemptylines}
+\setvalue{\??tp:\c!empty:\v!all }{\obeyallemptylines}
+
+\setvalue{\??tp:\c!option:\v!none }{\let\obeycharacters\relax}
+\setvalue{\??tp:\c!option:\v!color }{\setupprettiesintype{TEX}%
+ \let\obeycharacters\setupprettytype
+ \let\obeytabs\ignoretabs}
+\setvalue{\??tp:\c!option:\v!normal }{\let\obeycharacters\setupgroupedtype}
+\setvalue{\??tp:\c!option:\v!commands }{\def\obeycharacters{\setupcommandsintype}%
+ \let\obeytabs\ignoretabs}
+\setvalue{\??tp:\c!option:\v!slanted }{\let\obeycharacters\setupslantedtype
+ \let\obeytabs\ignoretabs}
+\setvalue{\??tp:\c!option:\s!unknown }{\setupprettiesintype{\typingparameter\c!option}%
+ \let\obeycharacters\setupprettytype
+ \let\obeytabs\ignoretabs}
+
+
\def\setupcommonverbatim
{\recatcodeuppercharactersfalse % obey regime / encoding
%
- \def\prettyidentifier{TEX}%
+ \let\prettyidentifier\s!default
%
\doifelse{\typingparameter\c!text}\v!yes
\naturaltextexttrue
@@ -118,34 +193,14 @@
%
\doifelse{\typingparameter\c!tab}\v!yes
{\def\obeytabs{\settabskips}}%
- {\doif{\typingparameter\c!tab}\s!ascii
+ {\doif{\typingparameter\c!tab}\s!ascii % not needed in mkiv
{\chardef\tabskipmode\plustwo % quit on >127
\def\obeytabs{\settabskips}}}%
%
\ignorehyphens % default
- \ExpandFirstAfter\processaction
- [\typingparameter\c!lines]
- [ \v!yes=>\obeybreakpoints,
- \v!hyphenated=>\obeyhyphens]%
- \processaction
- [\typingparameter\c!empty]
- [\v!yes=>\obeyemptylines,
- \v!all=>\obeyallemptylines]%
- %
- \ExpandFirstAfter\processaction
- [\typingparameter\c!option]
- [ \v!none=>\let\obeycharacters\relax,
- \v!color=>\setupprettiesintype{TEX}%
- \let\obeycharacters\setupprettytype
- \let\obeytabs\ignoretabs,
- \v!normal=>\let\obeycharacters\setupgroupedtype,
- \v!commands=>\def\obeycharacters{\setupcommandsintype}% \let
- \let\obeytabs\ignoretabs,
- \v!slanted=>\let\obeycharacters\setupslantedtype
- \let\obeytabs\ignoretabs,
- \s!unknown=>\setupprettiesintype{\typingparameter\c!option}%
- \let\obeycharacters\setupprettytype
- \let\obeytabs\ignoretabs]%
+ \getvalue{\??tp:\c!lines:\typingparameter\c!lines}%
+ \getvalue{\??tp:\c!empty:\typingparameter\c!empty}%
+ \getvalue{\??tp:\c!option:\ifcsname\??tp:\c!option:\typingparameter\c!option\endcsname\typingparameter\c!option\else\s!unknown\fi}%
\doifnumberelse{\typingparameter\c!tab}
{\def\obeytabs{\setfixedtabskips{\typingparameter\c!tab}}}%
\donothing
@@ -292,7 +347,7 @@
%D \type{\tt} text will be implemented soon.
\def\obeyhyphens
- {\def\obeyedspace {\hskip\interwordspace}% better than spaceskip
+ {\def\obeyedspace {\hskip\interwordspace\relax}% better than spaceskip
\def\controlspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint}%
\spaceskip.25em\relax} % hm a bit of stretch !
@@ -300,9 +355,15 @@
{\ignorehyphens
\veryraggedright}
+% \def\ignorehyphens
+% {\def\obeyedspace {\null\hskip\interwordspace\null}% better than spaceskip
+% \def\controlspace{\null\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\null}%
+% \spaceskip.5em\relax}
+
\def\ignorehyphens
- {\def\obeyedspace {\null\hskip\interwordspace\null}% better than spaceskip
- \def\controlspace{\null\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\null}%
+ {% \language\minusone % extra bonus, the \null should do the job too
+ \def\obeyedspace {\hskip\interwordspace}% better than spaceskip
+ \def\controlspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint}%
\spaceskip.5em\relax}
\unexpanded\def\typ
@@ -367,16 +428,75 @@
\let\currenttyping \empty
\let\currenttypingclass\??ty % saveguard
+% \def\typingparameter#1%
+% {\executeifdefined
+% {\currenttypingclass\currenttyping#1}%
+% {\executeifdefined{\currenttypingclass#1}\empty}}
+
\def\typingparameter#1%
- {\executeifdefined
- {\currenttypingclass\currenttyping#1}%
- {\executeifdefined{\currenttypingclass#1}\empty}}
+ {\ifcsname\currenttypingclass\currenttyping#1\endcsname
+ \csname\currenttypingclass\currenttyping#1\endcsname
+ \else\ifcsname\currenttypingclass#1\endcsname
+ \csname\currenttypingclass#1\endcsname
+ \fi\fi}
\def\settypingparameter#1#2%
{\setvalue{\currenttypingclass\currenttyping#1}{#2}}
+
\def\setxtypingparameter#1#2%
{\setxvalue{\currenttypingclass\currenttyping#1}{#2}}
+% \def\initializetyping
+% {%\donefalse
+% \switchtobodyfont[\typingparameter\c!bodyfont]%
+% \donefalse
+% \scratchskip\typingparameter\c!oddmargin\relax
+% \ifzeropt\scratchskip\else\donetrue\fi
+% \scratchskip\typingparameter\c!evenmargin\relax
+% \ifzeropt\scratchskip\else\donetrue\fi
+% \ifdone
+% \def\doopenupverbatimline
+% {\getpagestatus
+% \ifrightpage
+% \hskip\typingparameter\c!oddmargin\relax
+% \else
+% \hskip\typingparameter\c!evenmargin\relax
+% \fi}%
+% \else
+% \doadaptleftskip{\typingparameter\c!margin}%
+% \fi
+% \doifdefinedelse{\??bo\typingparameter\c!blank}
+% {\edef\!!stringa{\csname\??bo\typingparameter\c!blank\endcsname}}
+% {\edef\!!stringa{\typingparameter\c!blank}}%
+% \processaction
+% [\!!stringa]
+% [ \v!standard=>\scratchskip\ctxparskip,
+% \v!small=>\scratchskip\blankokleinmaat,
+% \v!medium=>\scratchskip\blankomiddelmaat,
+% \v!big=>\scratchskip\blankogrootmaat,
+% \v!halfline=>\scratchskip.5\baselineskip,
+% \v!line=>\scratchskip\baselineskip,
+% \v!none=>\scratchskip\zeropoint,
+% \s!unknown=>\scratchskip\commalistelement]%
+% \ifgridsnapping
+% \ifdim\scratchskip=.5\baselineskip\relax
+% \edef\verbatimbaselineskip{\the\scratchskip}% new
+% \else
+% \edef\verbatimbaselineskip{\the\baselineskip}%
+% \fi
+% \else
+% \edef\verbatimbaselineskip{\the\scratchskip}%
+% \fi
+% \setupcommonverbatim}
+
+\setvalue{\??tp:\c!blank:\v!standard}{\ctxparskip}
+\setvalue{\??tp:\c!blank:\v!small }{\blankokleinmaat}
+\setvalue{\??tp:\c!blank:\v!medium }{\blankomiddelmaat}
+\setvalue{\??tp:\c!blank:\v!big }{\blankogrootmaat}
+\setvalue{\??tp:\c!blank:\v!halfline}{.5\baselineskip}
+\setvalue{\??tp:\c!blank:\v!line }{\baselineskip}
+\setvalue{\??tp:\c!blank:\v!none }{\zeropoint}
+
\def\initializetyping
{%\donefalse
\switchtobodyfont[\typingparameter\c!bodyfont]%
@@ -396,19 +516,8 @@
\else
\doadaptleftskip{\typingparameter\c!margin}%
\fi
- \doifdefinedelse{\??bo\typingparameter\c!blank}
- {\edef\!!stringa{\csname\??bo\typingparameter\c!blank\endcsname}}
- {\edef\!!stringa{\typingparameter\c!blank}}%
- \processaction
- [\!!stringa]
- [ \v!standard=>\scratchskip\ctxparskip,
- \v!small=>\scratchskip\blankokleinmaat,
- \v!medium=>\scratchskip\blankomiddelmaat,
- \v!big=>\scratchskip\blankogrootmaat,
- \v!halfline=>\scratchskip.5\baselineskip,
- \v!line=>\scratchskip\baselineskip,
- \v!none=>\scratchskip\zeropoint,
- \s!unknown=>\scratchskip\commalistelement]%
+ \edef\!!stringa{\executeifdefined{\??bo\typingparameter\c!blank}{\typingparameter\c!blank}}%
+ \scratchskip\executeifdefined{\??tp:\c!blank:\!!stringa}\!!stringa\relax
\ifgridsnapping
\ifdim\scratchskip=.5\baselineskip\relax
\edef\verbatimbaselineskip{\the\scratchskip}% new
diff --git a/tex/context/base/enco-fde.tex b/tex/context/base/enco-fde.tex
index da104b802..a7c11abfc 100644
--- a/tex/context/base/enco-fde.tex
+++ b/tex/context/base/enco-fde.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\doifmode{mkiv}{\endinput}
+
\unprotect
\installactivecharacter "
diff --git a/tex/context/base/enco-ffr.tex b/tex/context/base/enco-ffr.tex
index abe362750..c321153e8 100644
--- a/tex/context/base/enco-ffr.tex
+++ b/tex/context/base/enco-ffr.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\doifmode{mkiv}{\endinput}
+
% \definehspace[fr][:][.25em]
% \definehspace[fr][;][.25em]
% \definehspace[fr][!][.25em]
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
index a6c369068..cbebaad9e 100644
--- a/tex/context/base/enco-ini.mkiv
+++ b/tex/context/base/enco-ini.mkiv
@@ -13,30 +13,43 @@
%D In the end we will cleanup enco-ini.tex!
+% \setinterfacecommand{setuphead}{stelleüberschriftein}
+% \section{Oeps}
+% \stelleüberschriftein[section][style=\bf]
+% \section{Oeps}
+
% could also be a new kind of table \definecharacter {name} {char} {fallback}
-\startruntimectxluacode
- characters.context.rehash()
-\stopruntimectxluacode
-% \ctxlua{characters.context.rehash()}
-
-\ctxlua{characters.context.define()}
-
-\startextendcatcodetable\ctxcatcodes \ctxlua{characters.context.activate()}\stopextendcatcodetable
-\startextendcatcodetable\notcatcodes \ctxlua{characters.context.activate()}\stopextendcatcodetable
-\startextendcatcodetable\xmlcatcodesn\ctxlua{characters.context.activate()}\stopextendcatcodetable
-\startextendcatcodetable\xmlcatcodese\ctxlua{characters.context.activate()}\stopextendcatcodetable
-\startextendcatcodetable\xmlcatcodesr\ctxlua{characters.context.activate()}\stopextendcatcodetable
-
-% [[[\utfchar{8194}]]][[[\utfchar{8195}]]] \par
-% $[[[\utfchar{8194}]]][[[\utfchar{8195}]]]$\par
-% {\setcatcodetable\ctxcatcodes [[[\utfchar{8194}]]][[[\utfchar{8195}]]]}\par
-% {\setcatcodetable\texcatcodes [[[\utfchar{8194}]]][[[\utfchar{8195}]]]}\par
-% {\setcatcodetable\prtcatcodes [[[\utfchar{8194}]]][[[\utfchar{8195}]]]}\par
-% \startXMLdata
-% ((( )))
-% \stopXMLdata
-% $\alpha\char945 \utfchar{945} abc 123$
+% \startruntimectxluacode
+% characters.context.rehash()
+% \stopruntimectxluacode
+
+% % % % \ctxlua{characters.context.rehash()}
+
+% \ctxlua {
+% characters.context.define(
+% { % letter catcodes
+% \number\texcatcodes,
+% \number\ctxcatcodes,
+% \number\notcatcodes,
+% \number\mthcatcodes,
+% \number\vrbcatcodes,
+% \number\prtcatcodes,
+% \number\xmlcatcodesn,
+% \number\xmlcatcodese,
+% \number\xmlcatcodesr,
+% \number\typcatcodesa,
+% \number\typcatcodesb,
+% },
+% { % activate catcodes
+% \number\ctxcatcodes,
+% \number\notcatcodes,
+% \number\xmlcatcodesn,
+% \number\xmlcatcodese,
+% \number\xmlcatcodesr,
+% }
+% )
+% }
\unprotect
diff --git a/tex/context/base/enco-run.tex b/tex/context/base/enco-run.tex
index d78b6e4c8..8e50e9398 100644
--- a/tex/context/base/enco-run.tex
+++ b/tex/context/base/enco-run.tex
@@ -98,8 +98,6 @@
% {\font\test=uplr8t \test \ruledhbox{t}
% \font\test=uplr8r \test \ruledhbox{t}}
-\beginETEX \fontcharwd
-
\gdef\showcharacterbounds
{\bgroup
\localcolortrue
@@ -109,31 +107,30 @@
\fi}\unskip
\egroup}
-\endETEX
+\beginOLDTEX
-\beginTEX
+ \gdef\showhyphenations#1%
+ {\starttabulate[|le|l|]
+ \NC language \NC \currentlanguage\ (internal code:\the\normallanguage) \NC \NR
+ \NC font \NC \fontname\font \NC \NR
+ \NC encoding \NC \ifx\@@fontencoding\empty not set\else\@@fontencoding\fi \NC \NR
+ \NC mapping \NC \ifx\@@fontmapping \empty not set\else\@@fontmapping \fi \NC \NR
+ \NC handling \NC \ifx\@@fonthandling\empty not set\else\@@fonthandling\fi \NC \NR
+ \NC sample \NC \hyphenatedword{#1} \NC \NR
+ \stoptabulate}
-\gdef\showcharacterbounds
- {\bgroup
- \localcolortrue
- \dorecurse{255}
- {\setbox\scratchbox\ruledhbox{\darkgray\char\recurselevel}%
- \ifnum\wd\scratchbox>\zeropoint
- \noindent\box\scratchbox\space
- \fi}\unskip
- \egroup}
+\endOLDTEX
+
+\beginNEWTEX
-\endTEX
+ \gdef\showhyphenations#1%
+ {\starttabulate[|le|l|]
+ \NC language \NC \currentlanguage\ (internal code:\the\normallanguage) \NC \NR
+ \NC font \NC \fontname\font \NC \NR
+ \NC sample \NC \hyphenatedword{#1} \NC \NR
+ \stoptabulate}
-\gdef\showhyphenations#1%
- {\starttabulate[|le|l|]
- \NC language \NC \currentlanguage\ (internal code:\the\normallanguage) \NC \NR
- \NC font \NC \fontname\font \NC \NR
- \NC encoding \NC \ifx\@@fontencoding\empty not set\else\@@fontencoding\fi \NC \NR
- \NC mapping \NC \ifx\@@fontmapping \empty not set\else\@@fontmapping \fi \NC \NR
- \NC handling \NC \ifx\@@fonthandling\empty not set\else\@@fonthandling\fi \NC \NR
- \NC sample \NC \hyphenatedword{#1} \NC \NR
- \stoptabulate}
+\endNEWTEX
\gdef\showmapping
{\dostepwiserecurse{128}{255}{1}
diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua
index 56f1b1c89..eef80c597 100644
--- a/tex/context/base/font-afm.lua
+++ b/tex/context/base/font-afm.lua
@@ -25,7 +25,7 @@ fonts.afm = fonts.afm or { }
local afm = fonts.afm
local tfm = fonts.tfm
-afm.version = 1.26 -- incrementing this number one up will force a re-cache
+afm.version = 1.30 -- incrementing this number one up will force a re-cache
afm.syncspace = true -- when true, nicer stretch values
afm.enhance_data = true -- best leave this set to true
afm.trace_features = false
@@ -57,199 +57,194 @@ built in and reader.
--~ Comment DELIM 2390 1010
--~ Comment AXISHEIGHT 250
-do
-
- local c = lpeg.P("Comment")
- local s = lpeg.S(" \t")
- local l = lpeg.S("\n\r")
- local w = lpeg.C((1 - l)^1)
- local n = lpeg.C((lpeg.R("09") + lpeg.S("."))^1) / tonumber * s^0
-
- local fd = { }
-
- local pattern = ( c * s^1 * (
- ("CODINGSCHEME" * s^1 * w ) / function(a) end +
- ("DESIGNSIZE" * s^1 * n * w ) / function(a) fd[ 1] = a end +
- ("CHECKSUM" * s^1 * n * w ) / function(a) fd[ 2] = a end +
- ("SPACE" * s^1 * n * "plus" * n * "minus" * n) / function(a,b,c) fd[ 3], fd[ 4], fd[ 5] = a, b, c end +
- ("QUAD" * s^1 * n ) / function(a) fd[ 6] = a end +
- ("EXTRASPACE" * s^1 * n ) / function(a) fd[ 7] = a end +
- ("NUM" * s^1 * n * n * n ) / function(a,b,c) fd[ 8], fd[ 9], fd[10] = a, b, c end +
- ("DENOM" * s^1 * n * n ) / function(a,b ) fd[11], fd[12] = a, b end +
- ("SUP" * s^1 * n * n * n ) / function(a,b,c) fd[13], fd[14], fd[15] = a, b, c end +
- ("SUB" * s^1 * n * n ) / function(a,b) fd[16], fd[17] = a, b end +
- ("SUPDROP" * s^1 * n ) / function(a) fd[18] = a end +
- ("SUBDROP" * s^1 * n ) / function(a) fd[19] = a end +
- ("DELIM" * s^1 * n * n ) / function(a,b) fd[20], fd[21] = a, b end +
- ("AXISHEIGHT" * s^1 * n ) / function(a) fd[22] = a end +
- (1-l)^0
- ) + (1-c)^1)^0
-
- function afm.scan_comment(str)
- fd = { }
- pattern:match(str)
- return fd
- end
-
+local c = lpeg.P("Comment")
+local s = lpeg.S(" \t")
+local l = lpeg.S("\n\r")
+local w = lpeg.C((1 - l)^1)
+local n = lpeg.C((lpeg.R("09") + lpeg.S("."))^1) / tonumber * s^0
+
+local fd = { }
+
+local pattern = ( c * s^1 * (
+ ("CODINGSCHEME" * s^1 * w ) / function(a) end +
+ ("DESIGNSIZE" * s^1 * n * w ) / function(a) fd[ 1] = a end +
+ ("CHECKSUM" * s^1 * n * w ) / function(a) fd[ 2] = a end +
+ ("SPACE" * s^1 * n * "plus" * n * "minus" * n) / function(a,b,c) fd[ 3], fd[ 4], fd[ 5] = a, b, c end +
+ ("QUAD" * s^1 * n ) / function(a) fd[ 6] = a end +
+ ("EXTRASPACE" * s^1 * n ) / function(a) fd[ 7] = a end +
+ ("NUM" * s^1 * n * n * n ) / function(a,b,c) fd[ 8], fd[ 9], fd[10] = a, b, c end +
+ ("DENOM" * s^1 * n * n ) / function(a,b ) fd[11], fd[12] = a, b end +
+ ("SUP" * s^1 * n * n * n ) / function(a,b,c) fd[13], fd[14], fd[15] = a, b, c end +
+ ("SUB" * s^1 * n * n ) / function(a,b) fd[16], fd[17] = a, b end +
+ ("SUPDROP" * s^1 * n ) / function(a) fd[18] = a end +
+ ("SUBDROP" * s^1 * n ) / function(a) fd[19] = a end +
+ ("DELIM" * s^1 * n * n ) / function(a,b) fd[20], fd[21] = a, b end +
+ ("AXISHEIGHT" * s^1 * n ) / function(a) fd[22] = a end +
+ (1-l)^0
+) + (1-c)^1)^0
+
+local function scan_comment(str)
+ fd = { }
+ pattern:match(str)
+ return fd
end
-do
-
- -- On a rainy day I will rewrite this in lpeg ...
-
- local keys = { }
-
- function keys.FontName (data,line) data.fullname = line:strip() end
- function keys.ItalicAngle (data,line) data.italicangle = tonumber (line) end
- function keys.IsFixedPitch(data,line) data.isfixedpitch = toboolean(line,true) end
- function keys.CharWidth (data,line) data.charwidth = tonumber (line) end
- function keys.XHeight (data,line) data.xheight = tonumber (line) end
- function keys.Descender (data,line) data.descender = tonumber (line) end
- function keys.Ascender (data,line) data.ascender = tonumber (line) end
- function keys.Comment (data,line)
- -- Comment DesignSize 12 (pts)
- -- Comment TFM designsize: 12 (in points)
- line = line:lower()
- local designsize = line:match("designsize[^%d]*(%d+)")
- if designsize then data.designsize = tonumber(designsize) end
- end
+-- On a rainy day I will rewrite this in lpeg ...
+
+local keys = { }
+
+function keys.FontName (data,line) data.fullname = line:strip() end
+function keys.ItalicAngle (data,line) data.italicangle = tonumber (line) end
+function keys.IsFixedPitch(data,line) data.isfixedpitch = toboolean(line,true) end
+function keys.CharWidth (data,line) data.charwidth = tonumber (line) end
+function keys.XHeight (data,line) data.xheight = tonumber (line) end
+function keys.Descender (data,line) data.descender = tonumber (line) end
+function keys.Ascender (data,line) data.ascender = tonumber (line) end
+function keys.Comment (data,line)
+ -- Comment DesignSize 12 (pts)
+ -- Comment TFM designsize: 12 (in points)
+ line = line:lower()
+ local designsize = line:match("designsize[^%d]*(%d+)")
+ if designsize then data.designsize = tonumber(designsize) end
+end
- local function get_charmetrics(data,charmetrics,vector)
- local characters = data.characters
- local chr, str, ind = { }, "", 0
- for k,v in charmetrics:gmatch("([%a]+) +(.-) *;") do
- if k == 'C' then
- if str ~= "" then characters[str] = chr end
- chr = { }
- str = ""
- v = tonumber(v)
- if v < 0 then
- ind = ind + 1
- else
- ind = v
- end
- chr.index = ind
- elseif k == 'WX' then
- chr.width = v
- elseif k == 'N' then
- str = v
- elseif k == 'B' then
- local llx, lly, urx, ury = v:match("^ *(.-) +(.-) +(.-) +(.-)$")
- chr.boundingbox = { tonumber(llx), tonumber(lly), tonumber(urx), tonumber(ury) }
- elseif k == 'L' then
- local plus, becomes = v:match("^(.-) +(.-)$")
- if not chr.ligatures then chr.ligatures = { } end
- chr.ligatures[plus] = becomes
+local function get_charmetrics(data,charmetrics,vector)
+ local characters = data.characters
+ local chr, str, ind = { }, "", 0
+ for k,v in charmetrics:gmatch("([%a]+) +(.-) *;") do
+ if k == 'C' then
+ if str ~= "" then characters[str] = chr end
+ chr = { }
+ str = ""
+ v = tonumber(v)
+ if v < 0 then
+ ind = ind + 1
+ else
+ ind = v
end
+ chr.index = ind
+ elseif k == 'WX' then
+ chr.width = v
+ elseif k == 'N' then
+ str = v
+ elseif k == 'B' then
+ local llx, lly, urx, ury = v:match("^ *(.-) +(.-) +(.-) +(.-)$")
+ chr.boundingbox = { tonumber(llx), tonumber(lly), tonumber(urx), tonumber(ury) }
+ elseif k == 'L' then
+ local plus, becomes = v:match("^(.-) +(.-)$")
+ if not chr.ligatures then chr.ligatures = { } end
+ chr.ligatures[plus] = becomes
end
- if str ~= "" then
- characters[str] = chr
- end
end
+ if str ~= "" then
+ characters[str] = chr
+ end
+end
- local function get_kernpairs(data,kernpairs)
- local characters = data.characters
- for one, two, value in kernpairs:gmatch("KPX +(.-) +(.-) +(.-)\n") do
- local chr = characters[one]
- if chr then
- if not chr.kerns then chr.kerns = { } end
- chr.kerns[two] = tonumber(value)
- end
+local function get_kernpairs(data,kernpairs)
+ local characters = data.characters
+ for one, two, value in kernpairs:gmatch("KPX +(.-) +(.-) +(.-)\n") do
+ local chr = characters[one]
+ if chr then
+ if not chr.kerns then chr.kerns = { } end
+ chr.kerns[two] = tonumber(value)
end
end
+end
- local function get_variables(data,fontmetrics)
- for key, rest in fontmetrics:gmatch("(%a+) *(.-)[\n\r]") do
- if keys[key] then keys[key](data,rest) end
- end
+local function get_variables(data,fontmetrics)
+ for key, rest in fontmetrics:gmatch("(%a+) *(.-)[\n\r]") do
+ if keys[key] then keys[key](data,rest) end
end
+end
- local function get_indexes(data,filename)
- local trace = fonts.trace
- local pfbname = input.find_file(file.removesuffix(file.basename(filename))..".pfb","pfb") or ""
- if pfbname ~= "" then
- data.luatex = data.luatex or { }
- data.luatex.filename = pfbname
- local pfbblob = fontforge.open(pfbname)
- if pfbblob then
- local characters = data.characters
- local pfbdata = fontforge.to_table(pfbblob)
- --~ print(table.serialize(pfbdata))
- if pfbdata then
- local glyphs = pfbdata.glyphs
- if glyphs then
- if trace then
- logs.report("load afm","getting index data from %s",pfbname)
- end
- -- local offset = (glyphs[0] and glyphs[0] != .notdef) or 0
- for index, glyph in pairs(glyphs) do
- local name = glyph.name
- if name then
- local char = characters[name]
- if char then
- if trace then
- logs.report("load afm","glyph %s has index %s",name,index)
- end
- char.index = index
+local function get_indexes(data,filename)
+ local trace = fonts.trace
+ local pfbname = input.find_file(file.removesuffix(filename)..".pfb","pfb") or ""
+ if pfbname == "" then
+ pfbname = input.find_file(file.removesuffix(file.basename(filename))..".pfb","pfb") or ""
+ end
+ if pfbname ~= "" then
+ data.luatex = data.luatex or { }
+ data.luatex.filename = pfbname
+ local pfbblob = fontforge.open(pfbname)
+ if pfbblob then
+ local characters = data.characters
+ local pfbdata = fontforge.to_table(pfbblob)
+ --~ print(table.serialize(pfbdata))
+ if pfbdata then
+ local glyphs = pfbdata.glyphs
+ if glyphs then
+ if trace then
+ logs.report("load afm","getting index data from %s",pfbname)
+ end
+ -- local offset = (glyphs[0] and glyphs[0] != .notdef) or 0
+ for index, glyph in pairs(glyphs) do
+ local name = glyph.name
+ if name then
+ local char = characters[name]
+ if char then
+ if trace then
+ logs.report("load afm","glyph %s has index %s",name,index)
end
+ char.index = index
end
end
- elseif trace then
- logs.report("load afm","no glyph data in pfb file %s",pfbname)
end
elseif trace then
- logs.report("load afm","no data in pfb file %s",pfbname)
+ logs.report("load afm","no glyph data in pfb file %s",pfbname)
end
elseif trace then
- logs.report("load afm","invalid pfb file %s",pfbname)
+ logs.report("load afm","no data in pfb file %s",pfbname)
end
elseif trace then
- logs.report("load afm","no pfb file for %s",filename)
+ logs.report("load afm","invalid pfb file %s",pfbname)
end
+ elseif trace then
+ logs.report("load afm","no pfb file for %s",filename)
end
+end
- function afm.read_afm(filename)
- local ok, afmblob, size = input.loadbinfile(filename) -- has logging
- -- local ok, afmblob = true, file.readdata(filename)
- if ok and afmblob then
- local data = {
- version = version or '0',
- characters = { },
- filename = file.removesuffix(file.basename(filename))
- }
- afmblob = afmblob:gsub("StartCharMetrics(.-)EndCharMetrics", function(charmetrics)
- if fonts.trace then
- logs.report("load afm","loading char metrics")
- end
- get_charmetrics(data,charmetrics,vector)
- return ""
- end)
- afmblob = afmblob:gsub("StartKernPairs(.-)EndKernPairs", function(kernpairs)
- if fonts.trace then
- logs.report("load afm","loading kern pairs")
- end
- get_kernpairs(data,kernpairs)
- return ""
- end)
- afmblob = afmblob:gsub("StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics)
- if fonts.trace then
- logs.report("load afm","loading variables")
- end
- data.afmversion = version
- get_variables(data,fontmetrics)
- data.fontdimens = afm.scan_comment(fontmetrics) -- todo: all lpeg, no time now
- return ""
- end)
- get_indexes(data,filename)
- return data
- else
+function afm.read_afm(filename)
+ local ok, afmblob, size = input.loadbinfile(filename) -- has logging
+-- local ok, afmblob = true, file.readdata(filename)
+ if ok and afmblob then
+ local data = {
+ version = version or '0',
+ characters = { },
+ filename = file.removesuffix(file.basename(filename))
+ }
+ afmblob = afmblob:gsub("StartCharMetrics(.-)EndCharMetrics", function(charmetrics)
+ if fonts.trace then
+ logs.report("load afm","loading char metrics")
+ end
+ get_charmetrics(data,charmetrics,vector)
+ return ""
+ end)
+ afmblob = afmblob:gsub("StartKernPairs(.-)EndKernPairs", function(kernpairs)
if fonts.trace then
- logs.report("load afm","no valid afm file %s",filename)
+ logs.report("load afm","loading kern pairs")
end
- return nil
+ get_kernpairs(data,kernpairs)
+ return ""
+ end)
+ afmblob = afmblob:gsub("StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics)
+ if fonts.trace then
+ logs.report("load afm","loading variables")
+ end
+ data.afmversion = version
+ get_variables(data,fontmetrics)
+ data.fontdimens = scan_comment(fontmetrics) -- todo: all lpeg, no time now
+ return ""
+ end)
+ get_indexes(data,filename)
+ return data
+ else
+ if fonts.trace then
+ logs.report("load afm","no valid afm file %s",filename)
end
+ return nil
end
-
end
--[[ldx--
@@ -261,6 +256,9 @@ way we can set them faster when defining a font.
function afm.load(filename)
local name = file.removesuffix(filename)
local data = containers.read(afm.cache(),name)
+ if data and data.verbose ~= fonts.verbose then
+ data = nil
+ end
local size = lfs.attributes(name,"size") or 0
if data and data.size ~= size then
data = nil
@@ -278,6 +276,7 @@ function afm.load(filename)
end
logs.report("load afm","file size: %s",size)
data.size = size
+ data.verbose = fonts.verbose
logs.report("load afm","saving: in cache")
data = containers.write(afm.cache(), name, data)
end
@@ -287,10 +286,11 @@ function afm.load(filename)
end
function afm.unify(data, filename)
---~ local unicode, unicodes, private = fonts.enc.load('unicode').hash, { }, 0x0F0000
- local unicode, unicodes, private = fonts.enc.load('unicode').hash, { }, fonts.private
+ local unicodevector = fonts.enc.load('unicode').hash
+ local glyphs, indices, unicodes, names = { }, { }, { }, { }
+ local verbose, private = fonts.verbose, fonts.private
for name, blob in pairs(data.characters) do
- local code = unicode[name] -- or characters.name_to_unicode[name]
+ local code = unicodevector[name] -- or characters.name_to_unicode[name]
if not code then
local u = name:match("^uni(%x+)$")
code = u and tonumber(u,16)
@@ -300,14 +300,33 @@ function afm.unify(data, filename)
logs.report("afm glyph", "assigning private slot 0x%04X for unknown glyph name %s", code, name)
end
end
- blob.unicode = code
+ local index = blob.index
unicodes[name] = code
+ indices[code] = index
+ glyphs[index] = blob
+ names[name] = index
+ blob.name = name
+ if verbose then
+ local bu = blob.unicode
+ if not bu then
+ blob.unicode = code
+ elseif type(bu) == "table" then
+ bu[#bu+1] = code
+ else
+ blob.unicode = { bu, code }
+ end
+ else
+ blob.index = nil
+ end
end
data.luatex = {
filename = file.basename(filename),
- -- version = afm.version,
- unicodes = unicodes
+ unicodes = unicodes, -- name to unicode
+ indices = indices, -- unicode to index
+ names = names, -- name to index
}
+ data.glyphs = glyphs
+ data.characters = nil
end
--[[ldx--
@@ -316,13 +335,17 @@ and extra kerns. This saves quite some lookups later.
--ldx]]--
function afm.add_ligatures(afmdata,ligatures)
- local chars = afmdata.characters
- for k,v in pairs(characters[ligatures]) do
- local one = chars[k]
+ local glyphs = afmdata.glyphs
+ local luatex = afmdata.luatex
+ local indices = luatex.indices
+ local unicodes = luatex.unicodes
+ local names = luatex.names
+ for k,v in pairs(characters[ligatures]) do -- main characters table
+ local one = glyphs[names[k]]
if one then
for _, b in pairs(v) do
two, three = b[1], b[2]
- if two and three and chars[two] and chars[three] then
+ if two and three and names[two] and names[three] then
local ol = one[ligatures]
if ol then
if not ol[two] then -- was one.ligatures ... bug
@@ -343,38 +366,40 @@ them selectively.
--ldx]]--
function afm.add_kerns(afmdata)
- local chars = afmdata.characters
- -- add complex with values of simplified when present
+ local glyphs = afmdata.glyphs
+ local names = afmdata.luatex.names
+ local uncomposed = characters.uncomposed
local function do_it_left(what)
- for _,v in pairs(chars) do
- if v.kerns then
+ for index, glyph in pairs(glyphs) do
+ if glyph.kerns then
local k = { }
- for complex,simple in pairs(characters.uncomposed[what]) do
+ for complex, simple in pairs(uncomposed[what]) do
local ks = k[simple]
if ks and not k[complex] then
k[complex] = ks
end
end
- if not table.is_empty(k) then
- v.extrakerns = k
+ if next(k) then
+ glyph.extrakerns = k
end
end
end
end
- do_it_left("left")
- do_it_left("both")
- -- copy kerns from simple char to complex char unless set
local function do_it_copy(what)
- for complex,simple in pairs(characters.uncomposed[what]) do
- local c = chars[complex]
+ for complex, simple in pairs(uncomposed[what]) do
+ local c = glyphs[names[complex]]
if c then -- optional
- local s = chars[simple]
+ local s = glyphs[names[simple]]
if s and s.kerns then
c.extrakerns = s.kerns -- ok ? no merge ?
end
end
end
end
+ -- add complex with values of simplified when present
+ do_it_left("left")
+ do_it_left("both")
+ -- copy kerns from simple char to complex char unless set
do_it_copy("both")
do_it_copy("right")
end
@@ -388,99 +413,119 @@ end
function afm.add_dimensions(data) -- we need to normalize afm to otf i.e. indexed table instead of name
if data then
- for n, d in pairs(data.characters) do
- local bb = d.boundingbox
+ for index, glyph in pairs(data.glyphs) do
+ local bb = glyph.boundingbox
if bb then
local ht, dp = bb[4], -bb[2]
- if ht ~= 0 then d.height = ht end
- if dp ~= 0 then d.depth = dp end
+ if ht ~= 0 then glyph.height = ht end
+ if dp ~= 0 then glyph.depth = dp end
end
- d.name = n
end
end
end
function afm.copy_to_tfm(data)
- if data and data.characters then
- local tfm = { characters = { }, parameters = { } }
- local afmcharacters = data.characters
- local characters, parameters = tfm.characters, tfm.parameters
- if afmcharacters then
- for k, v in pairs(afmcharacters) do
- characters[v.unicode] = { description = v }
+ if data then
+ local glyphs = data.glyphs
+ if glyphs then
+ local characters, parameters, descriptions = { }, { }, { }
+ local unicodes = data.luatex.unicodes
+ local indices = data.luatex.indices
+ local tfm = { characters = characters, parameters = parameters, descriptions = descriptions }
+ for u, i in pairs(indices) do
+ local d = glyphs[i]
+ characters[u] = { } -- not needed
+ descriptions[u] = d
+ d.index = i
end
- end
- tfm.encodingbytes = data.encodingbytes or 2
- tfm.fullname = data.fullname
- tfm.filename = data.filename
- tfm.name = tfm.fullname -- data.name or tfm.fullname
- tfm.type = "real"
- tfm.units = 1000
- tfm.stretch = stretch
- tfm.slant = slant
- tfm.direction = 0
- tfm.boundarychar_label = 0
- tfm.boundarychar = 65536
- --~ tfm.false_boundarychar = 65536 -- produces invalid tfm in luatex
- tfm.designsize = (data.designsize or 10)*65536
- local spaceunits = 500
- tfm.spacer = "500 units"
- if data.isfixedpitch then
- if afmcharacters['space'] and afmcharacters['space'].width then
- spaceunits, tfm.spacer = afmcharacters['space'].width, "space"
- elseif afmcharacters['emdash'] and afmcharacters['emdash'].width then -- funny default
- spaceunits, tfm.spacer = afmcharacters['emdash'].width, "emdash"
- elseif data.charwidth then
- spaceunits, tfm.spacer = data.charwidth, "charwidth"
+ tfm.encodingbytes = data.encodingbytes or 2
+ tfm.fullname = data.fullname
+ tfm.filename = data.filename
+ tfm.name = tfm.fullname -- data.name or tfm.fullname
+ tfm.type = "real"
+ tfm.units = 1000
+ tfm.stretch = stretch
+ tfm.slant = slant
+ tfm.direction = 0
+ tfm.boundarychar_label = 0
+ tfm.boundarychar = 65536
+ --~ tfm.false_boundarychar = 65536 -- produces invalid tfm in luatex
+ tfm.designsize = (data.designsize or 10)*65536
+ local spaceunits = 500
+ tfm.spacer = "500 units"
+ -- same as otf
+ local endash, emdash = unicodes['space'], unicodes['emdash']
+ if data.isfixedpitch then
+ if descriptions[endash] then
+ spaceunits, tfm.spacer = descriptions[endash].width, "space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, tfm.spacer = descriptions[emdash].width, "emdash"
+ end
+ if not spaceunits and data.charwidth then
+ spaceunits, tfm.spacer = data.charwidth, "charwidth"
+ end
+ else
+ if descriptions[endash] then
+ spaceunits, tfm.spacer = descriptions[endash].width, "space"
+ end
+ -- if not spaceunits and descriptions[emdash] then
+ -- spaceunits, tfm.spacer = descriptions[emdash].width/2, "emdash/2"
+ -- end
+ if not spaceunits and data.charwidth then
+ spaceunits, tfm.spacer = data.charwidth, "charwidth"
+ end
end
- elseif afmcharacters['space'] and afmcharacters['space'].width then
- spaceunits, tfm.spacer = afmcharacters['space'].width, "space"
- elseif data.charwidth then
- spaceunits, tfm.spacer = data.charwidth, "charwidth variable"
- end
- spaceunits = tonumber(spaceunits)
- parameters.slant = 0
- parameters.space = spaceunits
- parameters.space_stretch = 500
- parameters.space_shrink = 333
- parameters.x_height = 400
- parameters.quad = 1000
- parameters.extra_space = 0
- if spaceunits < 200 then
- -- todo: warning
- end
- tfm.italicangle = data.italicangle
- tfm.ascender = math.abs(data.ascender or 0)
- tfm.descender = math.abs(data.descender or 0)
- if data.italicangle then
- parameters.slant = parameters.slant - math.round(math.tan(data.italicangle*math.pi/180))
- end
- if data.isfixedpitch then
- parameters.space_stretch = 0
- parameters.space_shrink = 0
- elseif afm.syncspace then
- parameters.space_stretch = spaceunits/2
- parameters.space_shrink = spaceunits/3
- end
- if data.xheight and data.xheight > 0 then
- parameters.x_height = data.xheight
- elseif afmcharacters['x'] and afmcharacters['x'].height then
- parameters.x_height = afmcharacters['x'].height or 0
- end
- local fd = data.fontdimens
- if fd and fd[8] and fd[9] and fd[10] then -- math
- for k,v in pairs(fd) do
- parameters[k] = v
+ --
+ spaceunits = tonumber(spaceunits)
+ parameters.slant = 0
+ parameters.space = spaceunits
+ parameters.space_stretch = 500
+ parameters.space_shrink = 333
+ parameters.x_height = 400
+ parameters.quad = 1000
+ parameters.extra_space = 0
+ if spaceunits < 200 then
+ -- todo: warning
+ end
+ tfm.italicangle = data.italicangle
+ tfm.ascender = math.abs(data.ascender or 0)
+ tfm.descender = math.abs(data.descender or 0)
+ if data.italicangle then
+ parameters.slant = parameters.slant - math.round(math.tan(data.italicangle*math.pi/180))
+ end
+ if data.isfixedpitch then
+ parameters.space_stretch = 0
+ parameters.space_shrink = 0
+ elseif afm.syncspace then
+ parameters.space_stretch = spaceunits/2
+ parameters.space_shrink = spaceunits/3
+ end
+ if data.xheight and data.xheight > 0 then
+ parameters.x_height = data.xheight
+ else
+ -- same as otf
+ local x = unicodes['x']
+ if x then
+ local x = descriptions[x]
+ if x then
+ parameters.x_height = x.height
+ end
+ end
+ --
+ end
+ local fd = data.fontdimens
+ if fd and fd[8] and fd[9] and fd[10] then -- math
+ for k,v in pairs(fd) do
+ parameters[k] = v
+ end
+ end
+ if next(characters) then
+ return tfm
end
end
- if table.is_empty(characters) then
- return nil
- else
- return tfm
- end
- else
- return nil
end
+ return nil
end
--[[ldx--
@@ -621,10 +666,6 @@ function tfm.set_normal_feature(specification,name,value)
end
function tfm.read_from_afm(specification)
---~ local fullname = input.findbinfile(specification.name,"afm") or ""
---~ if fullname ~= "" then
---~ specification.filename = fullname
---~ end
local tfmtable = afm.afm_to_tfm(specification)
if tfmtable then
tfmtable.name = specification.name
@@ -656,20 +697,24 @@ those that make sense for this format.
function afm.features.prepare_ligatures(tfmdata,ligatures,value)
if value then
- local charlist = tfmdata.shared.afmdata.characters
- for _, chr in pairs(tfmdata.characters) do
- local ac = charlist[chr.description.name]
- if ac then
- local al = ac[ligatures]
- if al then
- local ligatures = chr.ligatures
- if not ligatures then
- ligatures = { }
- chr.ligatures =ligatures
- end
- for k,v in pairs(al) do
- ligatures[charlist[k].unicode] = {
- char = charlist[v].unicode,
+ local afmdata = tfmdata.shared.afmdata
+ local luatex = afmdata.luatex
+ local unicodes = luatex.unicodes
+ local descriptions = tfmdata.descriptions
+ for u, chr in pairs(tfmdata.characters) do
+ local d = descriptions[u]
+ local l = d[ligatures]
+ if l then
+ local ligatures = chr.ligatures
+ if not ligatures then
+ ligatures = { }
+ chr.ligatures = ligatures
+ end
+ for k, v in pairs(l) do
+ local uk, uv = unicodes[k], unicodes[v]
+ if uk and uv then
+ ligatures[uk] = {
+ char = uv,
type = 0
}
end
@@ -681,9 +726,13 @@ end
function afm.features.prepare_kerns(tfmdata,kerns,value)
if value then
- local charlist = tfmdata.shared.afmdata.characters
- for _, chr in pairs(tfmdata.characters) do
- local newkerns = charlist[chr.description.name][kerns]
+ local afmdata = tfmdata.shared.afmdata
+ local luatex = afmdata.luatex
+ local unicodes = luatex.unicodes
+ local descriptions = tfmdata.descriptions
+ for u, chr in pairs(tfmdata.characters) do
+ local d = descriptions[u]
+ local newkerns = d[kerns]
if newkerns then
local kerns = chr.kerns
if not kerns then
@@ -691,7 +740,10 @@ function afm.features.prepare_kerns(tfmdata,kerns,value)
chr.kerns = kerns
end
for k,v in pairs(newkerns) do
- kerns[charlist[k].unicode] = v
+ local uk = unicodes[k]
+ if uk then
+ kerns[uk] = v
+ end
end
end
end
diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua
index 473e658d0..0bafea708 100644
--- a/tex/context/base/font-col.lua
+++ b/tex/context/base/font-col.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['font-col'] = {
license = "see context related readme files"
}
+-- possible optimization: delayed initialization of vectors
+
fonts = fonts or { }
nodes = nodes or { }
@@ -41,39 +43,64 @@ end
function fonts.collections.define(name,font,ranges,details)
-- todo: details -> method=force|conditional rscale=
-- todo: remap=name
+ local trace = fonts.collections.trace
local d = definitions[name]
- if not d then
+ if d then
+ if name and trace then
+ logs.report("fonts","def: extending set %s using %s",name, font)
+ end
+ else
+ if name and trace then
+ logs.report("fonts","def: defining set %s using %s",name, font)
+ end
d = { }
definitions[name] = d
end
details = aux.settings_to_hash(details)
+ -- todo, combine per font start/stop as arrays
for s in ranges:gmatch("([^, ]+)") do
- local start, stop = characters.getrange(s)
+ local start, stop, description = characters.getrange(s)
if start and stop then
+ if trace then
+ if description then
+ logs.report("fonts","def: using range %s (0x%04x-0x%04X, %s)",s,start,stop,description)
+ end
+ for i=1,#d do
+ local di = d[i]
+ if (start >= di.start and start <= di.stop) or (stop >= di.start and stop <= di.stop) then
+ logs.report("fonts","def: overlapping ranges 0x%04x-0x%04X and 0x%04x-0x%04X",start,stop,di.start,di.stop)
+ end
+ end
+ end
details.font, details.start, details.stop = font, start, stop
- d[#d+1] = details
+ d[#d+1] = table.fastcopy(details)
end
end
end
function fonts.collections.stage_1(name)
- local last = font.current() -- fonts.define.last
+ input.starttiming(fonts)
+ local last = font.current()
if fonts.collections.trace then
- logs.report("fonts","registering font %s as id %s",name,last)
+ logs.report("fonts","def: registering font %s with name %s",last,name)
end
- list[name] = last
+ list[#list+1] = last
end
function fonts.collections.stage_2(name)
local d = definitions[name]
local t = { }
local ids = fonts.tfm.id
+ local trace = fonts.collections.trace
+ if trace then
+ logs.report("fonts","def: process collection %s",name)
+ end
for i=1,#d do
local f = d[i]
- local id = list[f.font]
+ local id = list[i]
local start, stop = f.start, f.stop
- if fonts.collections.trace then
- logs.report("fonts","remapping font %s to %s for range 0x%04X - 0x%04X",current,id,start,stop)
+ if trace then
+ logs.report("fonts","def: remapping font %s to %s for range 0x%04X - 0x%04X",current,id,start,stop)
end
local check = toboolean(f.check or "false")
local force = toboolean(f.force or "true")
@@ -105,38 +132,57 @@ function fonts.collections.stage_2(name)
end
end
vectors[current] = t
+ if trace then
+ logs.report("fonts","def: activating collection %s for font %s",name,current)
+ end
active = true
+ input.stoptiming(fonts)
end
local P, Cc = lpeg.P, lpeg.Cc
local spec = (P("sa") + P("at") + P("scaled") + P("at") + P("mo")) * P(" ")^1 * (1-P(" "))^1 * P(" ")^0 * -1
local okay = ((1-spec)^1 * spec * Cc(true)) + Cc(false)
+-- todo: check for already done
+
function fonts.collections.prepare(name)
+ current = font.current()
+ if vectors[current] then
+ return
+ end
+ local ids = fonts.tfm.id
+ local trace = fonts.collections.trace
local d = definitions[name]
if d then
- list, current = { }, fonts.define.last
+ if trace then
+ local filename = file.basename(ids[current].filename or "?")
+ logs.report("fonts","def: applying collection %s to %s (file: %s)",name,current,filename)
+ end
+ list = { }
texsprint(tex.ctxcatcodes,"\\dostartcloningfonts") -- move this to tex \dostart...
for i=1,#d do
local f = d[i]
local name = f.font
- if not list[name] then
- local scale = f.rscale or 1
- if okay:match(name) then
- texsprint(tex.ctxcatcodes,format("\\doclonefonta{%s}{%s}",name,scale)) -- define with unique specs
- else
- texsprint(tex.ctxcatcodes,format("\\doclonefontb{%s}{%s}",name,scale)) -- define with inherited specs
- end
- texsprint(tex.ctxcatcodes,format("\\ctxlua{fonts.collections.stage_1('%s')}",name)) -- registering main font
- list[name] = true
+ local scale = f.rscale or 1
+ if okay:match(name) then
+ texsprint(tex.ctxcatcodes,format("\\doclonefonta{%s}{%s}",name,scale)) -- define with unique specs
+ else
+ texsprint(tex.ctxcatcodes,format("\\doclonefontb{%s}{%s}",name,scale)) -- define with inherited specs
end
+ texsprint(tex.ctxcatcodes,format("\\ctxlua{fonts.collections.stage_1('%s')}",name)) -- registering main font
end
texsprint(tex.ctxcatcodes,format("\\ctxlua{fonts.collections.stage_2('%s')}",name)) -- preparing clone vectors
texsprint(tex.ctxcatcodes,"\\dostopcloningfonts")
end
end
-function fonts.collections.normalize(head)
+function fonts.collections.message(message)
+ if fonts.collections.trace then
+ logs.report("fonts","tex: %s",message)
+ end
+end
+
+function fonts.collections.normalize(head,tail)
if active then
local done = false
local trace = fonts.collections.trace
@@ -148,12 +194,12 @@ function fonts.collections.normalize(head)
if type(id) == "table" then
local newid, newchar = id[1], id[2]
if trace then
- logs.report("fonts","remapping character %s in font %s to character %s in font %s",n.char,n.font,newchar,newid)
+ logs.report("fonts","lst: remapping character %s in font %s to character %s in font %s",n.char,n.font,newchar,newid)
end
n.font, n.char = newid, newchar
else
if trace then
- logs.report("fonts","remapping font %s to %s for character %s",n.font,id,n.char)
+ logs.report("fonts","lst: remapping font %s to %s for character %s",n.font,id,n.char)
end
n.font = id
end
@@ -161,7 +207,7 @@ function fonts.collections.normalize(head)
end
end
end
- return head, done
+ return head, tail, done
end
nodes.normalize_fonts = fonts.collections.normalize
diff --git a/tex/context/base/font-col.tex b/tex/context/base/font-col.tex
index a646e2ef5..3383b6515 100644
--- a/tex/context/base/font-col.tex
+++ b/tex/context/base/font-col.tex
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% ! EXPERIMENTAL !
+% ! EXPERIMENTAL ! code will be made more nice
% todo: missing only, force always, multiple fallbacks with test, scale
%
@@ -44,19 +44,30 @@
\def\dodefinefontfallbacks#1%
{\ctxlua{fonts.collections.prepare("#1")}}
-\def\s!fallbacks{fallbacks}
+% we might as well move the handling to lua but then we need to pass the
+% fallbacks, skewchar etc.
-\def\updatefontparameters
- {%edef\@@fonthandling {\truefontdata\somefontname\s!handling}% goes away, is now feature
- \edef\@@fontfeatures {\truefontdata\fontfile \s!features}%
- \edef\@@fontfallbacks{\truefontdata\somefontname\s!fallbacks}%
- \edef\@@fontskewchar {\truefontdata\fontfile \s!skewchar}} % will be replaced
+\setfalse\doingfontfallbacks
+
+\def\dodefinefontfallbacksindeed#1%
+ {\begingroup
+ \settrue\doingfontfallbacks
+ \lastrawfontcall % sets current font id
+ \dodefinefontfallbacks#1%
+ \endgroup}
\appendtoks
- \ifx\@@fontfallbacks\empty\else
- \bgroup\dodefinefontfallbacks\@@fontfallbacks\egroup
- \fi
-\to\everyfont
+ \ifconditional\doingfontfallbacks\else
+ \ifx\@@fontfallbacks\empty
+ \ifx\@@fontclassfallbacks\empty
+ \else
+ \dodefinefontfallbacksindeed\@@fontclassfallbacks
+ \fi
+ \else
+ \dodefinefontfallbacksindeed\@@fontfallbacks
+ \fi
+ \fi
+\to\everydefinefont
\def\dostartcloningfonts
{\bgroup
@@ -66,18 +77,19 @@
{\egroup}
\def\doclonefonta#1#2% kind of dododefinefont
- {\let\lastfontidentifier\s!dummy
- %\let\localrelativefontsize\defaultrelativefontsize
+ {\ctxlua{fonts.collections.message("defining #1 (relative scale: #2)")}%
+ \autofontsizefalse
+ \let\lastfontidentifier\s!dummy
\def\localrelativefontsize{#2}%
\let\localabsolutefontsize\fontbody
- \parsefontspec{#1}\rawfontidentifier
- %\let\localrelativefontsize\defaultrelativefontsize % not needed
+ \lowleveldefinefont{#1}\rawfontidentifier
\csname\rawfontidentifier\endcsname
\autofontsizefalse
%\setfontcharacteristics
}%\the\everyfontswitch}
-\def\doclonefontb#1{\doclonefonta{#1\savedfontspec}}
+\def\doclonefontb#1% #2
+ {\doclonefonta{#1 \savedfontspec}}
% check : only replace when present in replacement font (default: no)
% force : force replacent even when basefont has glyph (default: yes)
@@ -101,4 +113,36 @@
% }
% \stopcolumns
+% \ctxlua{fonts.trace = true ; fonts.collections.trace = true}
+%
+% \definefontfeature[zh][mode=node,script=hang,lang=zhs]
+% \definefontfallback[serifwhatever] [lmroman10-regular] [0x0000-0x0400][force=yes]
+% \definefontfallback[serifboldwhatever] [lmroman10-bold] [0x0000-0x0400][force=yes]
+% \definefontfallback[serifitalicwhatever] [lmroman10-italic] [0x0000-0x0400][force=yes]
+% \definefontfallback[serifbolditalicwhatever][lmroman10-bolditalic][0x0000-0x0400][force=yes]
+%
+% \starttypescript [serif] [zhfont]
+% \definefontsynonym [zhserif] [AdobeSongStd-Light] [features=zh,fallbacks=serifwhatever]
+% \definefontsynonym [zhserifbold] [AdobeHeitiStd-Regular][features=zh,fallbacks=serifboldwhatever]
+% \definefontsynonym [zhserifitalic] [AdobeKaitiStd-Regular][features=zh,fallbacks=serifitalicwhatever]
+% \definefontsynonym [zhserifbolditalic][AdobeHeitiStd-Regular][features=zh,fallbacks=serifbolditalicwhatever]
+% \stoptypescript
+%
+% \starttypescript [serif][zhfont][name]
+% \definefontsynonym[Serif] [zhserif] % [fallbacks=serifwhatever]
+% \definefontsynonym[SerifBold] [zhserifbold] % [fallbacks=serifboldwhatever]
+% \definefontsynonym[SerifItalic] [zhserifitalic] % [fallbacks=serifitalicwhatever]
+% \definefontsynonym[SerifBoldItalic] [zhserifbolditalic] % [fallbacks=serifbolditalicwhatever]
+% \stoptypescript
+%
+% \starttypescript[myfont]
+% \definetypeface[myfont][rm][serif][zhfont]
+% \stoptypescript
+%
+% \usetypescript[myfont] \setupbodyfont[myfont,rm,12pt]
+%
+% \starttext
+% fonts {\bf fonts} {\bi fonts} {\it fonts}
+% \stoptext
+
\protect \endinput
diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua
index cc7c45a9e..474cde41d 100644
--- a/tex/context/base/font-def.lua
+++ b/tex/context/base/font-def.lua
@@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['font-def'] = {
-- check reuse of lmroman1o-regular vs lmr10
+local texsprint, count, dimen, format, concat = tex.sprint, tex.count, tex.dimen, string.format, table.concat
+
--[[ldx--
Here we deal with defining fonts. We do so by intercepting the
default loader that only handles .
@@ -44,7 +46,6 @@ fonts.define.method = 3 -- 1: tfm 2: tfm and if not then afm 3: afm and
fonts.define.auto_afm = true
fonts.define.auto_otf = true
fonts.define.specify = fonts.define.specify or { }
-fonts.define.splitsymbols = ""
fonts.define.methods = fonts.define.methods or { }
tfm.fonts = tfm.fonts or { }
@@ -75,28 +76,47 @@ synonym table.
and prepares a table that will move along as we proceed.
--ldx]]--
-function fonts.define.analyze(name, size, id)
- name = name or 'unknown'
- local specification = name
- local lookup, rest = specification:match("^(.-):(.+)$")
- local sub = ""
- if lookup == 'file' or lookup == 'name' then
- name = rest
- else
- lookup = 'file'
- end
- local font, method, detail = name:match("^(.-)(["..fonts.define.splitsymbols.."])(.+)$")
- if method and detail then
- name = font
- else
- method, detail = "", ""
+-- beware, we discard additional specs
+--
+-- method:name method:name(sub) method:name(sub)*spec method:name*spec
+-- name name(sub) name(sub)*spec name*spec
+-- name@spec*oeps
+
+local splitter, specifiers = nil, ""
+
+function fonts.define.add_specifier(symbol)
+ specifiers = specifiers .. symbol
+ local left = lpeg.P("(")
+ local right = lpeg.P(")")
+ local colon = lpeg.P(":")
+ local method = lpeg.S(specifiers)
+ local lookup = lpeg.C(lpeg.P("file")+lpeg.P("name")) * colon -- hard test, else problems with : method
+ local sub = left * lpeg.C(lpeg.P(1-left-right-method)^1) * right
+ local specification = lpeg.C(method) * lpeg.C(lpeg.P(1-method)^1)
+ local name = lpeg.C((1-sub-specification)^1)
+ splitter = lpeg.P((lookup + lpeg.Cc("")) * name * (sub + lpeg.Cc("")) * (specification + lpeg.Cc("")))
+end
+
+function fonts.define.get_specification(str)
+ return splitter:match(str)
+end
+
+function fonts.define.register_split(symbol,action)
+ fonts.define.add_specifier(symbol)
+ fonts.define.specify[symbol] = action
+end
+
+function fonts.define.makespecification(specification, lookup, name, sub, method, detail, size)
+ size = size or 655360
+ if fonts.trace then
+ logs.report("define font","%s -> lookup: %s, name: %s, sub: %s, method: %s, detail: %s",
+ specification, (lookup ~= "" and lookup) or "[file]", (name ~= "" and name) or "-",
+ (sub ~= "" and sub) or "-", (method ~= "" and method) or "-", (detail ~= "" and detail) or "-")
end
- local mainfont, subfont = name:match("^(.*-)(%(.*-)(%)$")
- if mainfont and subfont then
- name, sub = mainfont, subfont
+ if lookup ~= 'name' then -- for the moment only two lookups, maybe some day also system:
+ lookup = 'file'
end
- size = size or (65536*10)
- return {
+ local t = {
lookup = lookup, -- forced type
specification = specification, -- full specification
size = size, -- size in scaled points or -1000*n
@@ -106,18 +126,14 @@ function fonts.define.analyze(name, size, id)
detail = detail, -- specification
resolved = "", -- resolved font name
forced = "", -- forced loader
- id = id, -- font id
features = { }, -- preprocessed features
- -- hash = nil
- -- filename = nil,
- -- encoding = nil,
- -- format = nil,
}
+ return t
end
-function fonts.define.register_split(symbol,action)
- fonts.define.splitsymbols = fonts.define.splitsymbols .. "%" .. symbol
- fonts.define.specify[symbol] = action
+function fonts.define.analyze(specification, size)
+ local lookup, name, sub, method, detail = fonts.define.get_specification(specification or "")
+ return fonts.define.makespecification(specification,lookup, name, sub, method, detail, size)
end
--[[ldx--
@@ -130,7 +146,7 @@ function tfm.hash_features(specification)
local t = { }
local normal = features.normal
if normal and next(normal) then
- local f = table.sortedkeys(normal)
+ local f = table.sortedhashkeys(normal)
for i=1,#f do
local v = f[i]
if v ~= "number" then
@@ -140,27 +156,19 @@ function tfm.hash_features(specification)
end
local vtf = features.vtf
if vtf and next(vtf) then
- local f = table.sortedkeys(vtf)
+ local f = table.sortedhashkeys(vtf)
for i=1,#f do
local v = f[i]
t[#t+1] = v .. '=' .. tostring(vtf[v])
end
end
if #t > 0 then
- return table.concat(t,"+")
+ return concat(t,"+")
end
end
return "unknown"
end
-
---~ function tfm.hash_instance(specification)
---~ if not specification.hash then
---~ specification.hash = tfm.hash_features(specification)
---~ end
---~ return specification.hash .. ' @ ' .. tostring(specification.size)
---~ end
-
fonts.designsizes = { }
--[[ldx--
@@ -172,16 +180,20 @@ loose our testcases for .
--ldx]]--
function tfm.hash_instance(specification,force)
- local hash, size = specification.hash, specification.size
+ local hash, size, fallbacks = specification.hash, specification.size, specification.fallbacks
if force or not hash then
hash = tfm.hash_features(specification)
specification.hash = hash
end
if size < 1000 and fonts.designsizes[hash] then
- size = tfm.scaled(size, fonts.designsizes[hash])
+ size = math.round(tfm.scaled(size, fonts.designsizes[hash]))
specification.size = size
end
- return hash .. ' @ ' .. tostring(size)
+ if fallbacks then
+ return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks
+ else
+ return hash .. ' @ ' .. tostring(size)
+ end
end
--[[ldx--
@@ -189,18 +201,22 @@ end
--ldx]]--
function fonts.define.resolve(specification)
- if specification.lookup == 'name' then
- specification.resolved, specification.sub = fonts.names.resolve(specification.name,specification.sub)
- if specification.resolved then
- specification.forced = file.extname(specification.resolved)
- specification.name = file.removesuffix(specification.resolved)
+ if not specification.resolved or specification.resolved == "" then -- resolved itself not per se in mapping hash
+ if specification.lookup == 'name' then
+ specification.resolved, specification.sub = fonts.names.resolve(specification.name,specification.sub)
+ if specification.resolved then
+ specification.forced = file.extname(specification.resolved)
+ specification.name = file.removesuffix(specification.resolved)
+ end
+ elseif specification.lookup == 'file' then
+ specification.forced = file.extname(specification.name)
+ specification.name = file.removesuffix(specification.name)
end
- elseif specification.lookup == 'file' then
- specification.forced = file.extname(specification.name)
- specification.name = file.removesuffix(specification.name)
end
if specification.forced == "" then
specification.forced = nil
+ else
+ specification.forced = specification.forced
end
specification.hash = specification.name .. ' @ ' .. tfm.hash_features(specification)
if specification.sub and specification.sub ~= "" then
@@ -226,13 +242,12 @@ specification yet.
--ldx]]--
function tfm.read(specification)
- garbagecollector.push()
- input.starttiming(fonts)
+--~ input.starttiming(fonts)
local hash = tfm.hash_instance(specification)
local tfmtable = tfm.fonts[hash] -- hashes by size !
if not tfmtable then
if specification.forced and specification.forced ~= "" then
- tfmtable = tfm.readers[specification.forced](specification)
+ tfmtable = tfm.readers[specification.forced:lower()](specification)
if not tfmtable then
logs.report("define font","forced type %s of %s not found",specification.forced,specification.name)
end
@@ -258,8 +273,7 @@ function tfm.read(specification)
--~ tfmtable.mode = specification.features.normal.mode or "base"
end
end
- input.stoptiming(fonts)
- garbagecollector.pop()
+--~ input.stoptiming(fonts)
if not tfmtable then
logs.report("define font","font with name %s is not found",specification.name)
end
@@ -271,26 +285,21 @@ end
--ldx]]--
function tfm.read_and_define(name,size) -- no id
- local specification = fonts.define.analyze(name,size,nil)
- if specification.method and fonts.define.specify[specification.method] then
- specification = fonts.define.specify[specification.method](specification)
+ local specification = fonts.define.analyze(name,size)
+ local method = specification.method
+ if method and fonts.define.specify[method] then
+ specification = fonts.define.specify[method](specification)
end
specification = fonts.define.resolve(specification)
local hash = tfm.hash_instance(specification)
- local id = tfm.internalized[hash]
+ local id = fonts.define.registered(hash)
if not id then
local fontdata = tfm.read(specification)
if fontdata then
- if not tfm.internalized[hash] then
- id = font.define(fontdata)
- tfm.id[id] = fontdata
- tfm.internalized[hash] = id
- if fonts.trace then
- logs.report("define font","loading at 1 id %s, hash: %s",id,hash)
- end
- else
- id = tfm.internalized[hash]
- end
+ fontdata.hash = hash
+ id = font.define(fontdata)
+ fonts.define.register(fontdata,id)
+tfm.cleanup_table(fontdata)
else
id = 0 -- signal
end
@@ -298,17 +307,6 @@ function tfm.read_and_define(name,size) -- no id
return tfm.id[id], id
end
---[[ldx--
-A naive callback could be the following:
-
-
-callback.register('define_font', function(name,size,id)
- return fonts.define.read(fonts.define.resolve(fonts.define.analyze(name,size,id)))
-end)
-
---ldx]]--
-
-
--[[ldx--
Next follow the readers. This code was written while
evolved. Each one has its own way of dealing with its format.
@@ -389,7 +387,7 @@ name*context specification
function fonts.define.specify.predefined(specification)
local detail = specification.detail
if detail ~= "" then
- detail = detail:gsub("["..fonts.define.splitsymbols.."].*$","") -- get rid of *whatever specs and such
+ -- detail = detail:gsub("["..fonts.define.splitsymbols.."].*$","") -- get rid of *whatever specs and such
if fonts.define.methods[detail] then -- since these may be appended at the
specification.features.vtf = { preset = detail } -- tex end by default
end
@@ -429,6 +427,13 @@ function fonts.define.specify.colonized(specification) -- xetex mode
end
function tfm.make(specification)
+ -- currently fonts are scaled while constructing the font, so we
+ -- have to do scaling of commands in the vf at that point using
+ -- e.g. "local scale = g.factor or 1" after all, we need to work
+ -- with copies anyway and scaling needs to be done at some point;
+ -- however, when virtual tricks are used as feature (makes more
+ -- sense) we scale the commands in fonts.tfm.scale (and set the
+ -- factor there)
local fvm = fonts.define.methods[specification.features.vtf.preset]
if fvm then
return fvm(specification)
@@ -446,15 +451,6 @@ fonts.define.specify.synonyms = fonts.define.specify.synonyms or {
input.storage.register(false,"fonts/setups" , fonts.define.specify.context_setups , "fonts.define.specify.context_setups" )
input.storage.register(false,"fonts/numbers", fonts.define.specify.context_numbers, "fonts.define.specify.context_numbers")
---~ local t = aux.settings_to_hash(features)
---~ for k,v in pairs(t) do
---~ k = synonyms[k] or k
---~ t[k] = v:is_boolean()
---~ if type(t[k]) == "nil" then
---~ t[k] = v
---~ end
---~ end
-
fonts.triggers = fonts.triggers or { }
function fonts.define.specify.preset_context(name,parent,features)
@@ -507,11 +503,6 @@ function fonts.define.specify.preset_context(name,parent,features)
setups[name] = tt
end
---~ function fonts.define.specify.context_number(name)
---~ local s = fonts.define.specify.context_setups[name]
---~ return (s and s.number) or -1
---~ end
-
do
-- here we clone features according to languages
@@ -553,7 +544,7 @@ do
end
-function fonts.define.specify.context_tostring(name,kind,separator,yes,no,strict,omit)
+function fonts.define.specify.context_tostring(name,kind,separator,yes,no,strict,omit) -- not used
return aux.hash_to_string(table.merged(fonts[kind].features.default or {},fonts.define.specify.context_setups[name] or {}),separator,yes,no,strict,omit)
end
@@ -565,9 +556,12 @@ function fonts.define.specify.split_context(features)
end
end
-function fonts.define.specify.starred(features)
- if features.detail and features.detail ~= "" then
- features.features.normal = fonts.define.specify.split_context(features.detail)
+local splitter = lpeg.splitat(",")
+
+function fonts.define.specify.starred(features) -- no longer fallbacks here
+ local detail = features.detail
+ if detail and detail ~= "" then
+ features.features.normal = fonts.define.specify.split_context(detail)
else
features.features.normal = { }
end
@@ -609,18 +603,41 @@ introduced later in the development.
fonts.define.last = nil
-function fonts.define.read(name,size,id)
- local specification = fonts.define.analyze(name,size,id)
- if specification.method and fonts.define.specify[specification.method] then
- specification = fonts.define.specify[specification.method](specification)
+function fonts.define.register(fontdata,id)
+ if fontdata and id then
+ local hash = fontdata.hash
+ if not tfm.internalized[hash] then
+ if fonts.trace then
+ logs.report("define font","loading at 2 id %s, hash: %s",id or "?",hash or "?")
+ end
+ tfm.id[id] = fontdata
+ tfm.internalized[hash] = id
+ end
+ end
+end
+
+function fonts.define.registered(hash)
+ local id = tfm.internalized[hash]
+ return id, id and tfm.id[id]
+end
+
+local cache_them = false
+
+function fonts.define.read(specification,size,id) -- id can be optional, name can already be table
+ input.starttiming(fonts)
+ if type(specification) == "string" then
+ specification = fonts.define.analyze(specification,size)
+ end
+ local method = specification.method
+ if method and fonts.define.specify[method] then
+ specification = fonts.define.specify[method](specification)
end
specification = fonts.define.resolve(specification)
local hash = tfm.hash_instance(specification)
- if true then
- --~ local fontdata = containers.read(fonts.cache(),hash) -- for tracing purposes
+ if cache_them then
+ local fontdata = containers.read(fonts.cache(),hash) -- for tracing purposes
end
- local fontdata = tfm.internalized[hash] -- id
- fonts.define.last = fontdata or id
+ local fontdata = fonts.define.registered(hash) -- id
if not fontdata then
if specification.features.vtf and specification.features.vtf.preset then
fontdata = tfm.make(specification)
@@ -630,19 +647,17 @@ function fonts.define.read(name,size,id)
tfm.check_virtual_id(fontdata)
end
end
- if true then
- --~ fontdata = containers.write(fonts.cache(),hash,fontdata) -- for tracing purposes
+ if cache_them then
+ fontdata = containers.write(fonts.cache(),hash,fontdata) -- for tracing purposes
end
- if not tfm.internalized[hash] then
- tfm.id[id] = fontdata
- tfm.internalized[hash] = id
- if fonts.trace then
- logs.report("define font","loading at 2 id %s, hash: %s",id,hash)
+ if fontdata then
+ fontdata.hash = hash
+ if id then
+ fonts.define.register(fontdata,id)
end
- else
- fontdata = tfm.internalized[hash]
end
end
+ fonts.define.last = fontdata or id -- todo ! ! ! ! !
if not fontdata then
logs.report("define font", "unknown font %s, loading aborted",specification.name)
elseif fonts.trace and type(fontdata) == "table" then
@@ -656,9 +671,118 @@ function fonts.define.read(name,size,id)
fontdata.fullname or "?",
file.basename(fontdata.filename or "?"))
end
+ input.stoptiming(fonts)
return fontdata
end
+-- define (two steps)
+
+local P, C, Cc = lpeg.P, lpeg.C, lpeg.Cc
+
+local space = P(" ")
+local spaces = space^0
+local value = C((1-space)^1)
+local rest = C(P(1)^0)
+local scale_none = Cc(0)
+local scale_at = P("at") * Cc(1) * spaces * value
+local scale_sa = P("sa") * Cc(2) * spaces * value
+local scale_mo = P("mo") * Cc(3) * spaces * value
+local scale_scaled = P("scaled") * Cc(4) * spaces * value
+
+local sizepattern = spaces * (scale_at + scale_sa + scale_mo + scale_scaled + scale_none)
+local splitpattern = spaces * value * spaces * rest
+
+local specification --
+
+function fonts.define.command_1(str)
+ input.starttiming(fonts)
+ local fullname, size = splitpattern:match(str)
+ local lookup, name, sub, method, detail = fonts.define.get_specification(fullname)
+ if not name then
+ logs.report("define font","strange definition '%s'",str)
+ texsprint(tex.ctxcatcodes,"\\glet\\somefontname\\defaultfontfile")
+ elseif name == "unknown" then
+ texsprint(tex.ctxcatcodes,"\\glet\\somefontname\\defaultfontfile")
+ else
+ texsprint(tex.ctxcatcodes,format("\\xdef\\somefontname{%s}",name))
+ end
+ -- we can also use a count for the size
+ if size and size ~= "" then
+ local mode, size = sizepattern:match(size)
+ if size and mode then
+ count.scaledfontmode = mode
+ texsprint(tex.ctxcatcodes,format("\\def\\somefontsize{%s}",size))
+ else
+ count.scaledfontmode = 0
+ texsprint(tex.ctxcatcodes,format("\\let\\somefontsize\\empty",size))
+ end
+ else
+ count.scaledfontmode = 0
+ texsprint(tex.ctxcatcodes,format("\\let\\somefontsize\\empty",size))
+ end
+ specification = fonts.define.makespecification(str,lookup,name,sub,method,detail,size)
+end
+
+function fonts.define.command_2(global,cs,name,size,classfeatures,fontfeatures,classfallbacks,fontfallbacks)
+ local trace = fonts.trace
+ -- name is now resolved and size is scaled cf sa/mo
+ local lookup, name, sub, method, detail = fonts.define.get_specification(name or "")
+ -- asome settings can be overloaded
+ if lookup and lookup ~= "" then specification.lookup = lookup end
+ specification.name = name
+ specification.size = size
+ specification.sub = sub
+ if detail and detail ~= "" then
+ specification.method, specification.detail = method or "*", detail
+ elseif specification.detail and specification.detail ~= "" then
+ -- already set
+ elseif fontfeatures and fontfeatures ~= "" then
+ specification.method, specification.detail = "*", fontfeatures
+ elseif classfeatures and classfeatures ~= "" then
+ specification.method, specification.detail = "*", classfeatures
+ end
+ if trace then
+ logs.report("define font","memory usage before: %s",ctx.memused())
+ end
+if fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+elseif classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+end
+ local tfmdata = fonts.define.read(specification,size) -- id not yet known
+ if not tfmdata then
+ logs.report("define font","unable to define %s as \\%s",name,cs)
+ elseif type(tfmdata) == "number" then
+ if trace then
+ logs.report("define font","reusing %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s)",name,tfmdata,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks)
+ end
+ tex.definefont(global,cs,tfmdata)
+ -- resolved (when designsize is used):
+ texsprint(tex.ctxcatcodes,format("\\def\\somefontsize{%isp}",tfm.id[tfmdata].size))
+ else
+ -- local t = os.clock(t)
+ local id = font.define(tfmdata)
+ -- print(name,os.clock()-t)
+ tfmdata.id = id
+ fonts.define.register(tfmdata,id)
+ tex.definefont(global,cs,id)
+ tfm.cleanup_table(tfmdata)
+ if fonts.trace then
+ logs.report("define font","defining %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s)",name,id,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks)
+ end
+ -- resolved (when designsize is used):
+ texsprint(tex.ctxcatcodes,format("\\def\\somefontsize{%isp}",tfmdata.size))
+ --~ if specification.fallbacks then
+ --~ fonts.collections.prepare(specification.fallbacks)
+ --~ end
+ end
+ if trace then
+ logs.report("define font","memory usage after: %s",ctx.memused())
+ end
+ input.stoptiming(fonts)
+end
+
+
--~ table.insert(tfm.readers.sequence,1,'vtf')
--~ function tfm.readers.vtf(specification)
diff --git a/tex/context/base/font-ext.lua b/tex/context/base/font-ext.lua
index 2b360c57c..c3979fad6 100644
--- a/tex/context/base/font-ext.lua
+++ b/tex/context/base/font-ext.lua
@@ -124,6 +124,8 @@ fonts.protrusions.vectors['pure'] = {
[0x002D] = { 0, 1 }, -- hyphen
[0x2013] = { 0, 0.50 }, -- endash
[0x2014] = { 0, 0.33 }, -- emdash
+ [0x3001] = { 0, 1 }, -- ideographic comma ã€
+ [0x3002] = { 0, 1 }, -- ideographic full stop 。
}
@@ -147,6 +149,20 @@ fonts.protrusions.vectors['punctuation'] = {
-- todo: left and right quotes: .5 double, .7 single
+ [0x2039] = { 0.70, 0.70 }, -- left single guillemet ‹
+ [0x203A] = { 0.70, 0.70 }, -- right single guillemet ›
+ [0x00AB] = { 0.50, 0.50 }, -- left guillemet «
+ [0x00BB] = { 0.50, 0.50 }, -- right guillemet »
+
+ [0x2018] = { 0.70, 0.70 }, -- left single quotation mark ‘
+ [0x2019] = { 0, 0.70 }, -- right single quotation mark ’
+ [0x201A] = { 0.70, 0 }, -- single low-9 quotation mark ,
+ [0x201B] = { 0.70, 0 }, -- single high-reversed-9 quotation mark ‛
+ [0x201C] = { 0.50, 0.50 }, -- left double quotation mark “
+ [0x201D] = { 0, 0.50 }, -- right double quotation mark â€
+ [0x201E] = { 0.50, 0 }, -- double low-9 quotation mark „
+ [0x201F] = { 0.50, 0 }, -- double high-reversed-9 quotation mark ‟
+
}
fonts.protrusions.vectors['alpha'] = {
diff --git a/tex/context/base/font-fbk.lua b/tex/context/base/font-fbk.lua
index 228f6c5c0..d3287c393 100644
--- a/tex/context/base/font-fbk.lua
+++ b/tex/context/base/font-fbk.lua
@@ -46,34 +46,34 @@ vf.aux.combine.commands["fake-character"] = function(g,v) -- g, nr, fallback_id
local index, fallback = v[2], v[3]
if vf.aux.combine.force_fallback or not g.characters[index] then
if fonts.fallbacks[fallback] then
- g.characters[index] = fonts.fallbacks[fallback](g)
+ g.characters[index], g.descriptions[index] = fonts.fallbacks[fallback](g)
end
end
end
fonts.fallbacks['textcent'] = function (g)
- local c = string.byte("c")
+ local c = ("c"):byte()
local t = table.fastcopy(g.characters[c])
- local s = tfm.scaled(g.specification.size or g.size)
local a = - math.tan(math.rad(g.italicangle or 0))
local special, red, green, blue, black = vf.aux.combine.initialize_trace()
+ local quad = g.parameters.quad
if a == 0 then
t.commands = {
{"push"}, {"slot", 1, c}, {"pop"},
{"right", .5*t.width},
{"down", .2*t.height},
{special, green},
- {"rule", 1.4*t.height, .02*s},
+ {"rule", 1.4*t.height, .02*quad},
{special, black},
}
else
t.commands = {
{"push"},
- {"right", .5*t.width-.025*s},
+ {"right", .5*t.width-.025*quad},
{"down", .2*t.height},
- {"special",string.format("pdf: q 1 0 %s 1 0 0 cm",a)},
+ {"special",("pdf: q 1 0 %s 1 0 0 cm"):format(a)},
{special, green},
- {"rule", 1.4*t.height, .025*s},
+ {"rule", 1.4*t.height, .025*quad},
{special, black},
{"special","pdf: Q"},
{"pop"},
@@ -84,15 +84,16 @@ fonts.fallbacks['textcent'] = function (g)
-- todo: set height
t.height = 1.2*t.height
t.depth = 0.2*t.height
- return t
+ local d = g.descriptions
+ return t, d and d[c]
end
fonts.fallbacks['texteuro'] = function (g)
- local c = string.byte("C")
+ local c = ("C"):byte()
local t = table.fastcopy(g.characters[c])
- local s = tfm.scaled(g.specification.size or g.size)
local d = math.cos(math.rad(90+(g.italicangle)))
local special, red, green, blue, black = vf.aux.combine.initialize_trace()
+ local quad = g.parameters.quad
t.width = 1.05*t.width
t.commands = {
{"right", .05*t.width},
@@ -100,10 +101,10 @@ fonts.fallbacks['texteuro'] = function (g)
{"right", .5*t.width*d},
{"down", -.5*t.height},
{special, green},
- {"rule", .05*s, .4*s},
+ {"rule", .05*quad, .4*quad},
{special, black},
}
- return t
+ return t, g.descriptions[c]
end
-- maybe store llx etc instead of bbox in tfm blob / more efficient
@@ -112,11 +113,13 @@ vf.aux.combine.force_composed = false
function vf.aux.compose_characters(g) -- todo: scaling depends on call location
-- this assumes that slot 1 is self, there will be a proper self some day
- local chars = g.characters
- local fastcopy = table.fastcopy
- local xchar = chars[string.byte("X")]
- if xchar and xchar.description then
- local cap_lly = xchar.description.boundingbox[4]
+ local chars, descs = g.characters, g.descriptions
+ local X = ("X"):byte()
+ local xchar = chars[X]
+ local xdesc = descs[X]
+ if xchar and xdesc then
+ local scale = g.factor or 1
+ local cap_lly = scale*xdesc.boundingbox[4]
local ita_cor = math.cos(math.rad(90+(g.italicangle or 0)))
local force = vf.aux.combine.force_composed
local fallbacks = characters.fallbacks
@@ -134,45 +137,33 @@ function vf.aux.compose_characters(g) -- todo: scaling depends on call location
local cc = c.category
if cc == 'll' or cc == 'lu' or cc == 'lt' then
local acc = s[3]
- -- local t = fastcopy(charschr) -- mem hogg but we cannot share
local t = { }
for k, v in pairs(charschr) do
- if k == "commands" then
- -- skip
- elseif k == "description" then
- local d = { }
- for kk, vv in pairs(v) do
- d[kk] = vv
- end
- t.description = d
- else
+ if k ~= "commands" then
t[k] = v
end
end
- local d = t.description
- d.name = c.adobename or "unknown"
- d.unicode = i
local charsacc = chars[acc]
if not charsacc then
acc = fallbacks[acc]
charsacc = acc and chars[acc]
end
if charsacc then
- local cb = charschr.description.boundingbox
- local ab = charsacc.description.boundingbox
+ local cb = descs[chr].boundingbox
+ local ab = descs[acc].boundingbox
if cb and ab then
- local c_llx, c_lly, c_urx, c_ury = cb[1], cb[2], cb[3], cb[4]
- local a_llx, a_lly, a_urx, a_ury = ab[1], ab[2], ab[3], ab[4]
+ -- can be sped up for scale == 1
+ local c_llx, c_lly, c_urx, c_ury = scale*cb[1], scale*cb[2], scale*cb[3], scale*cb[4]
+ local a_llx, a_lly, a_urx, a_ury = scale*ab[1], scale*ab[2], scale*ab[3], scale*ab[4]
local dx = (c_urx - a_urx - a_llx + c_llx)/2
- local dd = (c_urx-c_llx)*ita_cor
- -- we can use predefined tables for { special, red } ... saves space
+ local dd = (c_urx - c_llx)*ita_cor
if a_ury < 0 then
- local dy = cap_lly-a_lly
+ -- local dy = cap_lly-a_lly
if trace then
t.commands = {
push,
{"right", dx-dd},
- {"down", -dy}, -- added
+ -- {"down", -dy}, -- added
red,
{"slot", 1, acc},
black,
@@ -183,7 +174,7 @@ function vf.aux.compose_characters(g) -- todo: scaling depends on call location
t.commands = {
push,
{"right", dx-dd},
- {"down", -dy}, -- added
+ -- {"down", -dy}, -- added
{"slot", 1, acc},
pop,
{"slot", 1, chr},
@@ -236,6 +227,13 @@ function vf.aux.compose_characters(g) -- todo: scaling depends on call location
end
end
chars[i] = t
+ local d = { }
+ for k, v in pairs(descs[chr]) do
+ d[k] = v
+ end
+ d.name = c.adobename or "unknown"
+ -- d.unicode = i
+ descs[i] = d
end
end
end
diff --git a/tex/context/base/font-ini.lua b/tex/context/base/font-ini.lua
index a3eefa9db..5db2973a1 100644
--- a/tex/context/base/font-ini.lua
+++ b/tex/context/base/font-ini.lua
@@ -18,6 +18,7 @@ fonts = fonts or { }
fonts.trace = false -- true
fonts.mode = 'base'
fonts.private = 0xE000
+fonts.verbose = false -- more verbose cache tables
fonts.methods = {
base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
@@ -45,24 +46,20 @@ fonts.define.specify.synonyms = fonts.define.specify.synonyms or { }
-- tracing
-do
+fonts.color = fonts.color or { }
- fonts.color = fonts.color or { }
+fonts.color.trace = false
- fonts.color.trace = false
+local attribute = attributes.numbers['color'] or 7 -- we happen to know this -)
+local mapping = attributes.list[attribute]
- local attribute = attributes.numbers['color'] or 7 -- we happen to know this -)
- local mapping = attributes.list[attribute]
-
- local set_attribute = node.set_attribute
- local unset_attribute = node.unset_attribute
-
- function fonts.color.set(n,c)
- -- local mc = mapping[c] if mc then unset_attribute((n,attribute) else set_attribute(n,attribute,mc) end
- set_attribute(n,attribute,mapping[c] or -1) -- also handles -1 now
- end
- function fonts.color.reset(n)
- unset_attribute(n,attribute)
- end
+local set_attribute = node.set_attribute
+local unset_attribute = node.unset_attribute
+function fonts.color.set(n,c)
+-- local mc = mapping[c] if mc then unset_attribute((n,attribute) else set_attribute(n,attribute,mc) end
+ set_attribute(n,attribute,mapping[c] or -1) -- also handles -1 now
+end
+function fonts.color.reset(n)
+ unset_attribute(n,attribute)
end
diff --git a/tex/context/base/font-ini.mkii b/tex/context/base/font-ini.mkii
index f3f40160b..9b9f5ac83 100644
--- a/tex/context/base/font-ini.mkii
+++ b/tex/context/base/font-ini.mkii
@@ -1,6 +1,7 @@
%D \module
%D [ file=font-ini,
-%D version=2007.01.10,
+%D version=1998.09.11, % (second)
+%D version=2001.02.20, % (third)
%D title=\CONTEXT\ Font Macros,
%D subtitle=Initialization,
%D author=Hans Hagen,
@@ -11,17 +12,3495 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\writestatus{loading}{Context Font Macros (ini)}
+
\unprotect
-% not that efficient but inheritance is seldom used (untested)
+% \def\fontrange#1%
+% {\dofontrange{#1 =\bodyfontsize}}
+%
+% \def\dofontrange#1%
+% {\dodofontrange#1 \relax}% \fontstringA
+%
+% \def\dodofontrange#1 #2 %
+% {\ifdim\bodyfontsize#2%
+% #1\expandafter\gobbleuntilrelax
+% \else
+% \expandafter\dodofontrange
+% \fi}
+%
+% \definefont
+% [crap]
+% [\fontrange
+% {Regular <10pt
+% RegularBold <12pt
+% RegularSlanted <15pt
+% Regular} sa 1]
+%
+% may be better:
+%
+% \definefontrange
+% [crap]
+% [Regular <10pt
+% RegularBold <12pt
+% RegularSlanted <15pt]
+% [Regular sa 1]
+%
+%
+% \dostepwiserecurse{2}{15}{1}
+% {{\switchtobodyfont[\recurselevel pt]\crap test}\endgraf}
+
+% adapted, else wrong interlinespace
+
+\def\setfontparameters
+ {\synchronizefontsfalse
+ \the\everybodyfont
+ \synchronizefontstrue}
+
+% handy
+
+\newcounter\pushedfont
+
+\def\savefont
+ {\edef\savedfont{\the\font}%
+ \pushmacro\savedfont
+ \pushmacro\currentregime
+ \pushmacro\charactermapping
+ \pushmacro\characterencoding}
+
+\def\restorefont
+ {\popmacro\characterencoding
+ \popmacro\charactermapping
+ \popmacro\currentregime
+ \popmacro\savedfont
+ \savedfont}
+
+\def\pushcurrentfont
+ {\edef\popcurrentfont
+ {\noexpand\def\noexpand\fontbody{\fontbody}%
+ \noexpand\def\noexpand\fontstyle{\fontstyle}%
+ \noexpand\dosetcurrentfontalternative{\fontalternative}%
+ \noexpand\dosetcurrentfontsize{\fontsize}%
+ \noexpand\synchronizefont}}
+
+% \definetypeface[one][rm][serif][computer-roman][default]
+% \definetypeface[two][rm][serif][computer-roman][default][rscale=.9]
+%
+% {\one \bf test \two test}
+% {\one \bf test \pushcurrentfont \two \popcurrentfont test}
+
+%D \macros
+%D {definedfont,startfont,doiffontcharelse}
+%D
+%D A couple of relatively new macros:
+
+\newevery \everydefinedfont \relax
+
+\def\dodefinedfont[#1]%
+ {\iffirstargument\definefont[\string\thedefinedfont][#1]\fi
+ \csname\string\thedefinedfont\endcsname % can be \relax
+ \the\everydefinedfont} % hm, redundant
+
+\unexpanded\def\definedfont
+ {\dosingleempty\dodefinedfont}
+
+\unexpanded\def\startfont
+ {\bgroup\definedfont}
+
+\def\stopfont
+ {\egroup}
+
+\def\doiffontcharelse#1#2%
+ {\bgroup
+ \definedfont[#1]%
+ \iffontchar\font#2\relax
+ \egroup\expandafter\firstoftwoarguments
+ \else
+ \egroup\expandafter\secondoftwoarguments
+ \fi}
+
+%%% message 14 added
+
+\startmessages dutch library: fonts
+ title: korps
+ 1: codering --
+ 2: variant -- wordt geladen
+ 3: onbekende variant --
+ 4: korps -- is niet gedefinieerd
+ 5: stijl -- is niet gedefinieerd
+ 6: -- wordt geladen
+ 7: onbekend formaat --
+ 8: stijl -- gedefinieerd
+% 9: mapping -- is geladen
+ 10: onbekende font file --
+ 14: korps -- is gedefinieerd (kan beter globaal plaatsvinden)
+\stopmessages
+
+\startmessages english library: fonts
+ title: bodyfont
+ 1: coding --
+ 2: variant -- is loaded
+ 3: unknown variant --
+ 4: bodyfont -- is not defined
+ 5: style -- is not defined
+ 6: -- is loaded
+ 7: unknown format --
+ 8: style -- defined
+% 9: mapping -- is loaded
+ 10: unknown font file --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages german library: fonts
+ title: Fliesstext
+ 1: Kodierung --
+ 2: Variante -- ist geladen
+ 3: Unbekannte Variante --
+ 4: Fliesstext -- ist nicht definiert
+ 5: Stil -- ist nicht definiert
+ 6: -- ist geladen
+ 7: unbekanntes Format --
+ 8: Stil -- definiert
+% 9: Map -- ist geladen
+ 10: unbekanntes Font --
+ 14: Fliesstext -- wurde definiert (besser waere globale Definition)
+\stopmessages
+
+\startmessages czech library: fonts
+ title: zakladnifont
+ 1: kodovani --
+ 2: varianta -- je nactena
+ 3: neznama varianta --
+ 4: zakladni font -- neni definovan
+ 5: styl -- neni definovan
+ 6: -- je nacten
+ 7: neznamy format --
+ 8: styl -- definovan
+% 9: mapovani -- je nacteno
+ 10: neznamy font --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages italian library: fonts
+ title: font del corpo
+ 1: codifica --
+ 2: variante -- caricata
+ 3: variante sconosciuta --
+ 4: corpo del testo -- non definito
+ 5: stile -- non definito
+ 6: -- caricato
+ 7: formato sconosciuto --
+ 8: stile -- definito
+% 9: mappatura -- caricata
+ 10: file di font sconosciuto --
+ 14: corpo del testo -- definito (sarebbe meglio globale)
+\stopmessages
+
+\startmessages norwegian library: fonts
+ title: hovedfont
+ 1: koding --
+ 2: variant -- er lest inn
+ 3: ukjent variant --
+ 4: hovedfont -- er ikke definert
+ 5: stil -- er ikke definert
+ 6: -- er lest inn
+ 7: ukjent format --
+ 8: stil -- definert
+% 9: avbildning -- er lest inn
+ 10: ukjent fontfil --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages romanian library: fonts
+ title: corp de litere
+ 1: codificarea --
+ 2: varianta -- este incarcata
+ 3: varianta necunoscuta --
+ 4: corpul de litere -- nu este definit
+ 5: stilul -- nu este definit
+ 6: -- este incarcat
+ 7: format necunoscut --
+ 8: stilul -- definit
+% 9: maparea -- este incarcat
+ 10: fisier font necunoscut --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages french library: fonts
+ title: corps de texte
+ 1: encodage --
+ 2: la variante -- est chargée
+ 3: variante -- inconnue
+ 4: policecorps -- n'est pas définie
+ 5: le style -- n'est pas défini
+ 6: -- est chargé
+ 7: format -- inconnu
+ 8: style -- défini
+% 9: mapping -- is loaded
+ 10: fichier de police -- inconnu
+ 14: policecorps -- est défini (une définition globale pourrait être plus adéquat)
+\stopmessages
+
+%D This module is one of the oldest modules of \CONTEXT. The
+%D macros below evolved out of the \PLAIN\ \TEX\ macros and
+%D therefore use a similar naming scheme (\type{\rm},
+%D \type{\bf}, etc). This module grew out of our needs. We
+%D started with the \PLAIN\ \TEX\ definitions, generalized the
+%D underlaying macros, and extended those to a level at which
+%D probably no one will ever recognize them.
+%D
+%D In 2001 we ran into a couple of projects where more than
+%D one combined set of fonts was involved in a document. To
+%D make definitions more readable, as well as to overcome the
+%D problem of ever growing file name lists, and also because
+%D we needed to scale fonts relative to each other, the low
+%D level implementation was partly rewritten. Global
+%D font assignments, relative scaling, font classes and alike
+%D were added then. At the same time some macros were made a
+%D bit more readable, and math support was extended to the
+%D larger sizes.
+%D
+%D One important characteristic of the font mechanism presented
+%D here is the postponing of font loading. This makes it
+%D possible to distribute \type{fmt} files without bothering
+%D about the specific breed of \type{tfm} files.
+%D
+%D Another feature implemented here is the massive switching
+%D from roman to {\ss sans serif}, {\tt teletype} or else. This
+%D means one doesn't have to take care of all kind of relations
+%D between fonts.
+%D
+%D \page[bigpreference]
+
+%D \macros
+%D {rm,ss,tt,hw,cg}
+%D
+%D Fonts are defined in separate files. When we define a font,
+%D we distinguish between several styles. In most cases we will
+%D use:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC roman regular serif \NC \type{\rm} \NC\FR
+%D \NC sansserif sans support \NC \type{\ss} \NC\MR
+%D \NC type teletype mono \NC \type{\tt} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D The number of styles is not limited to these three. When
+%D using Lucida Bright we can for instance also define:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC handwritten \NC \type{\hw} \NC\FR
+%D \NC calligraphic \NC \type{\cg} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Anyone who feels the need, can define additional ones, like
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC faxfont \NC \type{\ff} \NC\FR
+%D \NC blackboard \NC \type{\bb} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Or even
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC hebrew \NC \type{\hb} \NC\SR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Styles are grouped in font sets. At the moment there are
+%D three main sets defined:
+%D
+%D \startlinecorrection
+%D \starttable[|l|l||]
+%D \HL
+%D \NC Computer Modern Roman \NC Knuth \NC \type{cmr} \NC\FR
+%D \NC Lucida Bright \NC Bigelow \& Holmes \NC \type{lbr} \NC\MR
+%D \NC Standard Postscript Fonts \NC Adobe \NC \type{pos} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D There are also some Computer Modern Roman alternatives:
+%D
+%D \startlinecorrection
+%D \starttable[|l|l||]
+%D \HL
+%D \NC Computer Modern Roman \NC Knuth \& Sauter \NC \type{sau} \NC\FR
+%D \NC Euler fonts \NC Zapf \NC \type{eul} \NC\MR
+%D \NC Computer Modern Concrete \NC Knuth \& Zapf \NC \type{con} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D All these definitions are ordered in files with names like
+%D \type{font-cmr} and \type{font-pos}, where the last three
+%D characters specify the name as known to \CONTEXT.
+%D
+%D Within such a font set (\type{cmr}) and style (\type{\rm})
+%D we can define a number of text font alternatives:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC typeface \NC \type{\tf} \NC\FR
+%D \NC boldface \NC \type{\bf} \NC\MR
+%D \NC slanted \NC \type{\sl} \NC\MR
+%D \NC italic \NC \type{\it} \NC\MR
+%D \NC boldslanted \NC \type{\bs} \NC\MR
+%D \NC bolditalic \NC \type{\bi} \NC\MR
+%D \NC smallcaps \NC \type{\sc} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+
+%D For old stylish Frans Goddijn we have:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC oldstyle \NC \type{\os} \NC\SR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D The availability of these alternatives depends on the
+%D completeness of a font family and of course the definitions
+%D in the font files.
+%D
+%D But let's not forget math. In addition to the previous \TEX\
+%D families (the mysterious \type{\fam}'s) we've got some more:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC Math Roman \NC \type{\mr} \NC\FR
+%D \NC Math Italic \NC \type{\mi} \NC\MR
+%D \NC Math Symbol \NC \type{\sy} \NC\MR
+%D \NC Math Extra \NC \type{\ex} \NC\MR
+%D \NC Math A \NC \type{\ma} \NC\MR
+%D \NC Math B \NC \type{\mb} \NC\MR
+%D \NC Math C \NC \type{\mc} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Users can call for specific fonts in many ways. Switches to
+%D other typefaces, like the switch from normal to bold, are as
+%D intuitive as possible, which means that all dependant fonts
+%D also switch. One can imagine that this takes quite some
+%D processing time.
+%D
+%D Internally fonts are stored as combination of size, style
+%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}.
+%D Users are not confronted with sizes, but use the style or
+%D style+alternative to activate them.
+%D
+%D During the definition of a bodyfont one can also declare the
+%D available larger alternatives:
+%D
+%D \starttyping
+%D \tf \tfa \tfb \tfc ...
+%D \bf \bfa \bfb \bfc ...
+%D \sl \sla \slb \slc ...
+%D \stoptyping
+%D
+%D The smaller ones are automatically supplied and derived from
+%D the the bodyfont environment.
+%D
+%D \starttyping
+%D \tfx \tfxx
+%D \bfx \bfxx
+%D \slx \slxx
+%D \stoptyping
+%D
+%D There are only two smaller alternatives per style. The
+%D larger alternatives on the other hand have no limitations.
+%D
+%D These larger alternatives are mostly used in chapter and
+%D section titles or on title pages. When one switches to a
+%D larger alternative, the bold an other ones automatically
+%D adapt themselves:
+%D
+%D \startbuffer
+%D \tfd Hi \bf there\sl, here \tfb I \bf am
+%D \stopbuffer
+%D
+%S \startnarrower
+%D \typebuffer
+%S \stopnarrower
+%D
+%D therefore becomes:
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D Maybe this mechanism isn't always as logic, but as said
+%D before, we tried to make it as intuitive as possible.
+%D
+%D So a specific kind of glyph can be characterized by:
+%D
+%D \startnarrower
+%D family (cmr) + bodyfont (12pt) + style (rm) + alternative (bf) + size (a)
+%D \stopnarrower
+%D
+%D The last component (the size) is optional.
+%D
+%D We introduced \type{\tf} as command to call for the current
+%D normally sized typeface. This commands results in roman,
+%D sans serif, teletype or whatever style is in charge. Such
+%D rather massive switches of style sometimes take more
+%D processing time than comfortable. Of course there is a
+%D workaround for this: we can call fonts directly by means of
+%D commands like:
+%D
+%D \starttyping
+%D \rmtf \sssl \tttf \rmbsa
+%D \stoptyping
+%D
+%D One should realize that this fast calls have limitations,
+%D they lack for instance automatic super- and subscript
+%D support.
+%D
+%D This leaves us two more commands: \type{\tx} and
+%D \type{\txx}. These activate a smaller and even more smaller
+%D font than the current one and adapt themselves to the
+%D current alternative, so when \type{\bf} is active,
+%D \type{\tx} gives a smaller boldface, which in turn can be
+%D called directly by \type{\bfx}.
+%D
+%D These two smaller alternatives are specified by the bodyfont
+%D environment and therefore not necessarily have similar sizes
+%D as \type{\scriptsize} and \type{\scriptscriptsize}. The main
+%D reason for this incompatibility (which can easily be undone)
+%D lays in the fact that we often want a bit bigger characters
+%D than in math mode. In \CONTEXT\ for instance the \type{\tx}
+%D and \type{\txx} commands are used for surrogate
+%D \cap{smallcaps} which support both nesting and alternatives,
+%D like in {\bf\cap{a \cap{small} world}}, which was typeset by
+%D
+%D \starttyping
+%D \bf\cap{a \cap{small} world}
+%D \stoptyping
+%D
+%D And compare $\rm \scriptstyle THIS$ with the slightly larger
+%D \cap{THIS}: \ruledhbox{$\rm \scriptstyle scriptstyle: THIS$}
+%D or \ruledhbox{\cap{x style: THIS}} makes a big difference.
+
+%D The \type{x..d} sizes should be used grouped. If you
+%D don't group them, i.e. call them in a row, \CONTEXT\ will
+%D not be able to sort out your intention (\type {x} inside
+%D \type {d} inside \type {x}. etc.). The following table
+%D demonstrates this:
+%D
+%D \def\FontState{\setstrut\ruledhbox{\strut Hello}}
+%D
+%D \starttabulate[|||||]
+%D \HL
+%D \NC \rlap{\quad\bf grouped} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
+%D \HL
+%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
+%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
+%D \NC \type{\tf} \NC \tf \FontState \NC \tf \tx \FontState \NC \tf \txx \FontState \NC \NR
+%D \NC \type{\tfa} \NC \tfa \FontState \NC \tfa \tx \FontState \NC \tfa \txx \FontState \NC \NR
+%D \NC \type{\tfb} \NC \tfb \FontState \NC \tfb \tx \FontState \NC \tfb \txx \FontState \NC \NR
+%D \NC \type{\tfc} \NC \tfc \FontState \NC \tfc \tx \FontState \NC \tfc \txx \FontState \NC \NR
+%D \NC \type{\tfd} \NC \tfd \FontState \NC \tfd \tx \FontState \NC \tfd \txx \FontState \NC \NR
+%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
+%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
+%D \HL
+%D \stoptabulate
+%D
+%D \blank
+%D
+%D \starttabulate[|||||]
+%D \HL
+%D \NC \rlap{\quad\bf stacked} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
+%D \HL
+%D \NC \type{\tfx}
+%D \NC \tfx \FontState
+%D \NC \tfx \tx \FontState
+%D \NC \tfx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfxx}
+%D \NC \tfx\tfxx \FontState
+%D \NC \tfx\tfxx \tx \FontState
+%D \NC \tfx\tfxx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tf}
+%D \NC \tfx\tfxx\tf \FontState
+%D \NC \tfx\tfxx\tf \tx \FontState
+%D \NC \tfx\tfxx\tf \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfa}
+%D \NC \tfx\tfxx\tf\tfa \FontState
+%D \NC \tfx\tfxx\tf\tfa \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfb}
+%D \NC \tfx\tfxx\tf\tfa\tfb \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfc}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfd}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfx}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfxx}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \txx \FontState
+%D \NC \NR
+%D \HL
+%D \stoptabulate
+
+%D \macros
+%D {mf}
+%D
+%D Math fonts are a species in their own. They are tightly
+%D hooked into smaller and even smaller ones of similar breed
+%D to form a tight family. Let's first see how these are
+%D related:
+%D
+%D \startbuffer
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\rm 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\rm 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\tf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\tf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\bf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\bf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\sl 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\sl 6x^2$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Gives both an expected and unexpected result:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D We see here that the character shapes change accordingly to
+%D the current family, but that the symbols are always typeset
+%D in the font assigned to \type{\fam0}.
+%D
+%D \startbuffer
+%D $\tf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\sl\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bs\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\it\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bi\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D In this example we see a new command \type{\mf} surface
+%D which means as much as {\em math font}. This commands
+%D reactivates the last font alternative and therefore equals
+%D \type{\bf}, \type{\sl} etc. but by default it equals
+%D \type{\tf}:
+
+\unexpanded\def\mf
+ {\dodosetmathfont\fontalternative
+ \csname\fontalternative\endcsname}
+
+%D The previous example was typeset saying:
+%D
+%D \typebuffer
+%D
+%D Beware: the exact location of \type{\mf} is not that
+%D important, we could as well has said
+%D
+%D \startbuffer
+%D $\bf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = \mf 6x^2$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is due to the way \TEX\ handles fonts in math mode.
+%D
+%D Of course we'll have to redefine \type{\mf} every time we
+%D change the current \type{\fam}.
+
+%D \macros
+%D {mbox,enablembox,mathop}
+%D
+%D Now how can we put this to use? Will the next sequence
+%D give the desired result?
+%D
+%D \startbuffer
+%D $\bf x^2 + \hbox{\mf whatever} + \sin(2x)$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D It won't!
+%D
+%D \startvoorbeeld
+%D \let\mathop=\normalmathop \getbuffer
+%D \stopvoorbeeld
+%D
+%D The reason for this is that \type{\sin} is defined as:
+%D
+%D \starttyping
+%D \def\sin{\mathop{\rm sin}\nolimits}
+%D \stoptyping
+%D
+%D We can fix this by defining
+
+\let\normalmathop\mathop
+
+\unexpanded\def\mathop
+ {\normalmathop
+ \bgroup
+ \let\rm\mf
+ \let\next=}
+
+%D We can fix arbitrary horizontal boxes by redefining the
+%D \TEX\ primitive \type{\hbox}:
+%D
+%D \starttyping
+%D \let\normalhbox=\hbox
+%D
+%D \def\hbox{\ifmmode\mbox\else\normalhbox\fi}
+%D \stoptyping
+%D
+%D with
+%D
+%D \starttyping
+%D \def\mbox#1#%
+%D {\normalhbox#1\bgroup\mf\let\next=}
+%D \stoptyping
+%D
+%D or more robust, that is, also accepting \type{\hbox\bgroup}:
+%D
+%D \starttyping
+%D \def\mbox%
+%D {\normalhbox\bgroup\mf
+%D \dowithnextbox{\flushnextbox\egroup}%
+%D \normalhbox}
+%D \stoptyping
+%D
+%D And now:
+%D
+%D \startbuffer
+%D $\bf x^2 + \hbox{whatever} + \sin(2x)$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Indeed gives:
+%D
+%D \startvoorbeeld
+%D \enablembox\getbuffer
+%D \stopvoorbeeld
+%D
+%D But, do we want this kind of trickery to be activated? No,
+%D simply because we cannot be sure of incompatibilities,
+%D although for instance unboxing goes ok. Therefore we
+%D introduce:
+
+% best can go to math-ini and make \mf a hook then
+
+% better use \dowithnextboxcontent
+
+\def\normalmbox
+ {\normalhbox\bgroup\mf
+ \dowithnextbox{\flushnextbox\egroup}\normalhbox}
+
+% to test:
+%
+% \def\normalmbox
+% {\dowithnextboxcontent\mf\flushnextbox\normalhbox}
+
+\def\mbox
+ {\ifmmode\normalmbox\else\normalhbox\fi}
+
+\def\enablembox
+ {\appendtoks
+ \ifx\normalhbox\undefined\let\normalhbox\hbox\fi
+ \let\hbox\mbox
+ \to\everymathematics}
+
+%D So in fact one can enable this feature if needed. I would say:
+%D go along, but use grouping if needed!
+
+%D \macros
+%D {mrfam,mifam,syfam,exfam,
+%D bsfam,bifam,scfam,tffam,
+%D mafam,mbfam,msfam}
+%D
+%D After this short mathematical excursion, we enter the world
+%D of fonts and fontswitching. We start with something very
+%D \TEX: \type{\fam} specified font families. \TEX\ uses
+%D families for managing fonts in math mode. Such a family has
+%D three members: text, script and scriptscript: $x^{y^z}$. In
+%D \CONTEXT\ we take a bit different approach than \PLAIN\
+%D \TEX\ does. \PLAIN\ \TEX\ needs at least four families for
+%D typesetting math. We use those but give them symbolic names.
+
+\chardef\mrfam = 0 % (Plain TeX) Math Roman
+\chardef\mifam = 1 % (Plain TeX) Math Italic
+\chardef\syfam = 2 % (Plain TeX) Math Symbol
+\chardef\exfam = 3 % (Plain TeX) Math Extra
+
+%D \PLAIN\ \TEX\ also defines families for {\it italic}, {\sl
+%D slanted} and {\bf bold} typefaces, so we don't have to
+%D define them here.
+
+\ifx\itfam\undefined
+
+\chardef\itfam = 4 % (Plain TeX) Italic
+\chardef\slfam = 5 % (Plain TeX) Slanted
+\chardef\bffam = 6 % (Plain TeX) Boldface
+
+\fi
+
+%D Family~7 in \PLAIN\ \TEX\ is not used in \CONTEXT, because
+%D we do massive switches from roman to sans serif, teletype or
+%D other faces.
+
+\ifx\ttfam\undefined
+
+\chardef\ttfam = 7 % (Plain TeX) can be reused!
+
+\fi
+
+%D We define ourselves some more families for {\bs bold
+%D slanted}, {\bi bold italic} and {\sc Small Caps}, so
+%D we can use them in math mode too. Instead of separate
+%D families for {\ss sans serif} and \type{teletype} we use the
+%D more general \type{\tffam}, which stands for typeface.
+
+\chardef\bsfam = 8 % (ConTeXt) BoldSlanted
+\chardef\bifam = 9 % (ConTeXt) BoldItalic
+\chardef\scfam = 10 % (ConTeXt) SmallCaps
+\chardef\tffam = 11 % (ConTeXt) TypeFace
+
+%D Because Taco needs a few more math families, we reuse
+%D family~7 for all those typefaces that have no related
+%D family, and therefore are grouped into one.
+
+\chardef\nnfam = 7 % (ReUsed) NoName
+
+%D Normally \type{\mrfam} equals \type{\tffam}, but a more
+%D distinctive alternatives are possible, for instance the
+%D Euler and Concrete Typefaces.
+%D
+%D After having defined all those in nature non||mathematical
+%D families, we define ourselves some real math ones. These are
+%D needed for the \AMS\ Symbol Fonts and Extended Lucida
+%D Bright.
+
+\chardef\mafam = 12 % (ConTeXt) Math A Fam (AmsTeX A)
+\chardef\mbfam = 13 % (ConTeXt) Math B Fam (AmsTeX B)
+\chardef\mcfam = 14 % (ConTeXt) Math C Fam (MathTime)
+\chardef\mdfam = 15 % (ConTeXt) Math D Fam (MathTime)
+
+%D Because there are 16~families and because \type{\ttfam}
+%D is reused, at the moment we have no so many families
+%D left. By default, we map any newly defined family on the
+%D last one (F).
+
+\def\newfam#1{\chardef#1=15 }
+
+%D This hack is also needed because in \ETEX\ we are going
+%D to reuse the \type {\newfam} allocation counter.
+
+%D To ease the support of font packages, we als define
+%D shortcuts to these familynames. This is necessary because
+%D the family names are in fact \type{\chardef}'s, which means
+%D that we're dealing with numbers (one can check this by
+%D applying \type{\showthe} and \type{\show}). In the
+%D specification of math symbols however we need hexadecimal
+%D numbers, so we have to convert the \type{\fam}'s value.
+
+\edef\hexmrfam {\hexnumber\mrfam} \edef\hexbsfam {\hexnumber\bsfam}
+\edef\hexmifam {\hexnumber\mifam} \edef\hexbifam {\hexnumber\bifam}
+\edef\hexsyfam {\hexnumber\syfam} \edef\hexscfam {\hexnumber\scfam}
+\edef\hexexfam {\hexnumber\exfam} \edef\hextffam {\hexnumber\tffam}
+\edef\hexitfam {\hexnumber\itfam} \edef\hexmafam {\hexnumber\mafam}
+\edef\hexslfam {\hexnumber\slfam} \edef\hexmbfam {\hexnumber\mbfam}
+\edef\hexbffam {\hexnumber\bffam} \edef\hexmcfam {\hexnumber\mcfam}
+\edef\hexnnfam {\hexnumber\nnfam} \edef\hexmdfam {\hexnumber\mdfam}
+
+%D \macros
+%D {uchar}
+%D
+%D This macro prepares \CONTEXT\ for \UNICODE\ support. By
+%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
+
+%D We define some (very private) constants to improve speed,
+%D memory usage and consistency.
+
+\def\@size@ {@f@si@} % bodyfont size prefix (12pt etc)
+\def\@style@ {@f@st@} % full style prefix (roman etc)
+\def\@shortstyle@ {@f@sh@} % short style prefix (rm etc)
+\def\@letter@ {@f@le@} % first alternative typeface
+\def\@noletter@ {@f@no@} % second alternative typeface
+
+%D The families can be grouped into math specific ones and
+%D more text related families, although text ones can be
+%D mapped onto the math ones to get for instance bold math.
+%D
+%D Both groups of families are handles by a couple of token
+%D list tagged as strategies. This implementation makes
+%D implementing extensions more comfortable.
+
+\newtoks \textstrategies
+\newtoks \mathstrategies
+\newtoks \symbstrategies
+
+\newif\ifsynchronizemathfonts \synchronizemathfontstrue
+
+\def\synchronizetext % stylish text in mmode
+ {\ifsynchronizemathfonts\the\textstrategies\fi} % \if...\fam\minusone\fi}
+
+\def\synchronizemath % math stuff in mmode
+ {\ifsynchronizemathfonts\the\mathstrategies\fi} % \if...\fam\minusone\fi}
+
+\def\synchronizesymb % stylish math stuff in mmode
+ {\ifsynchronizemathfonts\the\symbstrategies\fi} % \if...\fam\minusone\fi}
+
+%D By not setting the family we can append a font switch to \type
+%D {\everymath}. On the other hand, one never knows in what family
+%D state the strategies brought us.
+%D
+%D \starttyping
+%D {\bfa $\the\fam$} {\bfa \everymath{} $\the\fam$}
+%D \stoptyping
+
+%D \macros
+%D {textonly}
+%D
+%D We can inhibit this slow||downer with:
+
+\def\textonly{\synchronizemathfontsfalse} % document this
+
+\appendtoks
+ \dosettextfamily\c!tf
+ \dosettextfamily\c!bf
+ \dosettextfamily\c!sl
+ \dosettextfamily\c!it
+ \dosettextfamily\c!bs
+ \dosettextfamily\c!bi
+ \dosettextfamily\c!sc
+\to \textstrategies
+
+\def\dosettextfamily#1% better pass fontbody to dodoset
+ {\let\savedfontbody\fontbody
+ \let\fontfamily#1%
+ \let\fontbody\scriptscriptface\dodosettextfamily\scriptscriptfont
+ \let\fontbody\scriptface \dodosettextfamily \scriptfont
+ \let\fontbody\textface \dodosettextfamily \textfont
+ \let\fontbody\savedfontbody}
+
+% \def\s!nullfont{nullfont}
+
+\def\dodosettextfamily
+ {\ifx\fontclass\empty
+ \@EA\dodosettextfamilyA
+ \else
+ \@EA\dodosettextfamilyB
+ \fi}
+
+\def\dodosettextfamilyA#1%
+ {\ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname \fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
+ \csname \fontbody\c!mm\fontfamily\endcsname \else
+ \ifcsname \fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody\c!rm\fontfamily\fontsize\endcsname \else
+ \ifcsname \fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
+ \csname \fontbody\c!rm\fontfamily\endcsname \else
+ \nullfont \autofontsizetrue
+ \fi\fi\fi\fi
+ #1\csname\fontfamily\s!fam\endcsname\font}
+
+\def\dodosettextfamilyB#1%
+ {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
+ \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \else
+ \ifcsname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
+ \csname\fontclass\fontbody\c!rm\fontfamily\endcsname \else
+ \dodosettextfamilyA#1%
+ \fi\fi\fi\fi
+ #1\csname\fontfamily\s!fam\endcsname\font}
+
+\def\mrfallback{\c!rm\c!tf}
+
+\appendtoks
+ \dosetmathfamily\mrfam\textface\scriptface\scriptscriptface\c!mr\mrfallback
+ \dosetmathfamily\mifam\textface\scriptface\scriptscriptface\c!mi\empty
+ \dosetmathfamily\syfam\textface\scriptface\scriptscriptface\c!sy\empty
+ \dosetmathfamily\exfam\textface\textface \textface \c!ex\empty
+ \dosetmathfamily\mafam\textface\scriptface\scriptscriptface\c!ma\empty
+ \dosetmathfamily\mbfam\textface\scriptface\scriptscriptface\c!mb\empty
+ \dosetmathfamily\mcfam\textface\scriptface\scriptscriptface\c!mc\empty
+% \dosetmathfamily\mdfam\textface\scriptface\scriptscriptface\c!md\empty
+ \dosetmathfamily\nnfam\textface\scriptface\scriptscriptface\c!nn\empty
+\to \mathstrategies
+
+\appendtoks
+ \dosetskewchar\mifam\defaultskewcharmi % implemented later on
+ \dosetskewchar\syfam\defaultskewcharsy % implemented later on
+\to \mathstrategies
+
+\def\dosetmathfamily#1#2#3#4#5#6%
+ {\let\savedfontbody\fontbody % op hoger plan
+ \let\fontfamily#5%
+ \let\backfamily#6%
+ \let\fontbody #4\dodosetmathfamily\scriptscriptfont#1%
+ \let\fontbody #3\dodosetmathfamily \scriptfont#1%
+ \let\fontbody #2\dodosetmathfamily \textfont#1%
+ \let\fontbody\savedfontbody}
+
+\def\dodosetmathfamily
+ {\ifx\fontclass\empty
+ \@EA\dodosetmathfamilyA
+ \else
+ \@EA\dodosetmathfamilyB
+ \fi}
+
+\def\dodosetmathfamilyA#1#2%
+ {\ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname \fontbody\c!mm\fontfamily \endcsname \autofontsizetrue
+ \csname \fontbody\c!mm\fontfamily \endcsname \else
+ \ifcsname \fontbody \backfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody \backfamily\fontsize\endcsname \else
+ \ifcsname \fontbody \backfamily \endcsname \autofontsizetrue
+ \csname \fontbody \backfamily \endcsname \else
+ \nullfont \autofontsizetrue
+ \fi\fi\fi\fi
+ #1#2\font}
+
+\def\dodosetmathfamilyB#1#2%
+ {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody\c!mm\fontfamily \endcsname \autofontsizetrue
+ \csname\fontclass\fontbody\c!mm\fontfamily \endcsname \else
+ \ifcsname\fontclass\fontbody \backfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody \backfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody \backfamily \endcsname \autofontsizetrue
+ \csname\fontclass\fontbody \backfamily \endcsname \else
+ \dodosetmathfamilyA#1#2%
+ \fi\fi\fi\fi
+ #1#2\font}
+
+\appendtoks
+ \dosetsymbfamily\mrfam\textface\scriptface\scriptscriptface\c!mr
+ \dosetsymbfamily\mifam\textface\scriptface\scriptscriptface\c!mi
+ \dosetsymbfamily\syfam\textface\scriptface\scriptscriptface\c!sy
+ \dosetsymbfamily\exfam\textface\textface \textface \c!ex
+ \dosetsymbfamily\mafam\textface\scriptface\scriptscriptface\c!ma
+ \dosetsymbfamily\mbfam\textface\scriptface\scriptscriptface\c!mb
+ \dosetsymbfamily\mcfam\textface\scriptface\scriptscriptface\c!mc
+% \dosetsymbfamily\mdfam\textface\scriptface\scriptscriptface\c!md % also ?
+\to \symbstrategies
+
+\def\dosetsymbfamily#1#2#3#4#5%
+ {\let\savedfontbody\fontbody
+ \let\fontfamily#5%
+ \let\fontbody #4\dodosetsymbfamily\scriptscriptfont#1%
+ \let\fontbody #3\dodosetsymbfamily \scriptfont#1%
+ \let\fontbody #2\dodosetsymbfamily \textfont#1%
+ \let\fontbody\savedfontbody}
+
+\def\dodosetsymbfamily#1#2%
+ {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ \csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ #1#2\font
+ \else\ifcsname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ \csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ #1#2\font
+ \fi\fi}
+
+%D All used styles, like rm, ss and tt, are saved in a comma
+%D separated list. Appart from practical limitations one can
+%D define as many styles as needed.
+
+\let\stylelist=\empty
+
+\def\fontsizelist{\s!text,\s!script,\s!scriptscript,\c!x,\c!xx,\c!big,\c!small}
+
+%D \macros
+%D {magfactor,magfactorhalf}
+%D
+%D There are several ways to specify a font. Three of them are
+%D pure \TeX\ ones, the fourth one is new:
+%D
+%D \starttyping
+%D \font\name=cmr12
+%D \font\name=cmr12 at 10pt
+%D \font\name=cmr12 scaled \magstep2
+%D \font\name=cmr12 sa 1.440
+%D \stoptyping
+%D
+%D The non||\TEX\ alternative \type{sa} stands for {\em scaled
+%D at}. This means as much as: scale the bodyfontsize with this
+%D factor. The value 1.440 in this example is derived
+%D from the \type{\magstep}'s as mentioned in
+%D \in{table}[tab:magstep]. We therefore introduce
+%D \type{\magfactor} as an alternative for \type{\magstep}.
+%D
+%D \placetable[here][tab:magstep]
+%D {Factors to be used with \type{sa.}}
+%D \starttable[|c|c|c|]
+%D \HL
+%D \NC \bf magstep \NC \bf equivalent \NC \bf factor \NC\SR
+%D \HL
+%D \NC 1 \NC \type{\magfactor1} \NC 1.200 \NC\FR
+%D \NC 2 \NC \type{\magfactor2} \NC 1.440 \NC\MR
+%D \NC 3 \NC \type{\magfactor3} \NC 1.728 \NC\MR
+%D \NC 4 \NC \type{\magfactor4} \NC 2.074 \NC\MR
+%D \NC 5 \NC \type{\magfactor5} \NC 2.488 \NC\LR
+%D \HL
+%D \stoptable
+
+\def\magstep#1% \relax removed, otherwise space after it sticks, else added
+ {\ifcase#1 \@m\or1200\or1440\or1728\or2074\or2488\or\@m\fi}
+
+\def\magstephalf
+ {1095}
+
+\def\magfactor#1%
+ {\ifcase#1 1.000\or1.200\or1.440\or1.728\or2.074\or2.488\or1\fi}
+
+\def\magfactorhalf
+ {1.095}
+
+%D These macros enable the use of definitions like \type{sa
+%D \magfactor3} which saves us both (mis|)|calculations and
+%D potential mistypings.
+%D
+%D Because \type {sa} (scaled at) and \type {mo} (mapped on)
+%D are not low level \TEX\ supported alternatives, we have to
+%D test for it ourselves. In doing so, we need an auxiliary
+%D \DIMENSION. We cannot use \type{\scratchdimen} because font
+%D loading can happen at any moment due to postponed loading.
+%D We could instead have used dirty grouping tricks, but this
+%D one works too.
+
+\let\defaultrelativefontsize \plusone
+\let\localrelativefontsize \plusone
+\def\localabsolutefontsize {\fontbody}
+
+\let\relativefontsize \defaultrelativefontsize
+
+\def\saverelativefontsize#1#2% #1=rm|ss|.. #2=waarde
+ {\setxvalue{\fontclass#1\s!rscale}{#2}}
+
+\def\checkrelativefontsize#1%
+ {\edef\relativefontsize
+ {\ifcsname\fontclass#1\s!rscale\endcsname
+ \csname\fontclass#1\s!rscale\endcsname
+ \else
+ \defaultrelativefontsize
+ \fi}}
+
+%D We also save:
+
+\def\savemathtextstyle#1% #1=rm|ss|..
+ {\doifsomething{#1}{\setxvalue{\fontclass\c!mm\s!text}{#1}}}
+
+\def\currentmathtextstyle % we default to empty !
+ {\executeifdefined{\fontclass\c!mm\s!text}\empty}
+
+%D Scaling macros:
+
+\newdimen\scaledfont
+
+\let\somefontspec\empty
+
+\def\@fs@{@fs@}
+
+% \def\parsefontspec#1%
+% {\xdef\somefontspec{#1\space\relax}%
+% \@EA\doparsefontspec\somefontspec]% =>#1 \relax]
+% \donoparsefontspec}
+%
+% but, better:
+
+\let\somefontname\empty
+
+\def\parsefontspec#1%
+ {\xdef\somefontspec{#1\space}%
+ \@EA\doparsefontspec\somefontspec\relax]% =>#1 \relax]
+ \donoparsefontspec}
+
+\def\doparsefontspec#1 #2%
+ {\def\somefontname{#1}%
+ \ifx\somefontname\empty % space before fontname
+ \@EA\doparsefontspec
+ \else\ifx#2\relax
+ \@EAEAEA\setnaturalfontspec
+ \else
+ \@EAEAEA\setforcedfontspec
+ \fi\fi
+ #2}
+
+\def\setnaturalfontspec#1]%
+ {\@fs@scaled\plusthousand\relax}
+
+\def\setforcedfontspec#1 #2\relax]%
+ {\csname\@fs@#1\endcsname#2\relax}
+
+\def\@fs@scaled
+ {\afterassignment\do@fs@scaled\scratchcounter}
+
+\def\do@fs@scaled#1\relax
+ {\scaledfont\number\scratchcounter\points
+ \scaledfont\localrelativefontsize\scaledfont
+ \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi
+ \scratchcounter\scaledfont % \scaledfont is now pretty large
+ \advance\scratchcounter \medcard
+ \divide\scratchcounter \maxcard
+ \xdef\somefontspec{ scaled \the\scratchcounter}}
+
+\def\@fs@at
+ {\afterassignment\do@fs@at\scaledfont}
+
+\def\do@fs@at#1\relax
+ {\scaledfont\localrelativefontsize\scaledfont
+ \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi
+ \xdef\somefontspec{ at \the\scaledfont}}
+
+\def\@fs@sa
+ {\scaledfont\localabsolutefontsize
+ \setsamofontspec}
+
+\def\@fs@mo
+ {\scaledfont\setmappedfontsize\localabsolutefontsize
+ \setsamofontspec}
+
+\def\setsamofontspec#1\relax
+ {\checkfontscale#1\end\scaledfont
+ \scaledfont\localrelativefontsize\scaledfont
+ \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi
+ \xdef\somefontspec{ at \the\scaledfont}}
+
+\def\getfontparameters
+ {\expandafter\dogetfontparameter\@@fontdata,]=,}
+
+\def\getglobalfontparameters
+ {\expandafter\dogetglobalfontparameter\@@fontdata,]=,}
+
+\def\dogetfontparameter#1=#2,%
+ {\if]#1\else
+ \expandafter\def\csname\??ff\@@fontfile#1\endcsname{#2}%
+ \expandafter\dogetfontparameter
+ \fi}
+
+\def\dogetglobalfontparameter#1=#2,%
+ {\if]#1\else
+ \expandafter\gdef\csname\??ff\@@fontfile#1\endcsname{#2}%
+ \expandafter\dogetglobalfontparameter
+ \fi}
+
+\let\@@fontencoding\empty
+\let\@@fontmapping \empty
+\let\@@fonthandling\empty
+\let\@@fontfeatures\empty
+\let\@@skewchar \empty
+\let\@@hyphenchar \empty % todo, will go to encoding
+
+%D This brings down maps processing from 466 to 309 seconds
+%D ($-33$\%) and mfonts from 42 to 34 seconds ($-15$\%).
+
+\newif\ifskipfontcharacteristics \skipfontcharacteristicstrue
+
+%D When fontclasses are used, we define the font global,
+%D since namespaces are used. Otherwise we parse the specs
+%D each time.
+
+% wrong: this way we cannot set encoding etc
+%
+% \def\donoparsefontspec#1%
+% {\edef\fontfile{\truefontname\somefontname}%
+% \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi
+% \edef\lastfontname{\fontfile\somefontspec}%
+% \ifx\fontclass\empty\else\global\fi
+% \expandafter\font\csname#1\endcsname\lastfontname\relax
+% \relax}
+
+\let\fontfile\s!unknown
+
+\ifx\checkfontfilename\undefined \let\checkfontfilename\relax \fi
+
+% \definefontsynonym
+% [blabla]
+% [name:Latin Modern Something]
+% \definefontsynonym
+% [blabla]
+% [file:texnansi-lmr10]
+% [encoding=texnansi]
+% \definedfont[blabla] test \currentencoding/\fontfile \par
+% \definefontsynonym
+% [blabla]
+% [texnansi-lmtt10]
+% [encoding=texnansi]
+% \definedfont[blabla] test \currentencoding/\fontfile \par
+% \definefontsynonym
+% [blabla]
+% [ec-lmtt10]
+% [encoding=ec]
+% \definedfont[blabla] test \currentencoding/\fontfile \par
+
+\beginOLDTEX
+
+ \def\checkfontfilename
+ {\expandafter\docheckfontfilename\fontfile:\empty:\empty\relax}
+
+ \def\docheckfontfilename#1:#2:#3#4\relax
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \ifx\!!stringb\empty
+ \edef\checkedfontfile{\!!stringa}%
+ \else\ifx\!!stringa\v!file
+ \edef\checkedfontfile{"\!!stringb"}%
+ \else\ifx\!!stringa\v!name
+ \edef\checkedfontfile{"\!!stringb"}%
+ \else
+ \edef\checkedfontfile{\!!stringb}%
+ \fi\fi\fi}
+
+\endOLDTEX
+
+% \definefontfeature[default] [liga=yes,texligatures=yes,texquotes=yes]
+% \definefontfeature[default-caps][liga=yes,texligatures=yes,texquotes=yes,smcp=yes,script=latn]
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular][features=default]
+% \definefontsynonym[SerifCaps][palatinonova-regular][features=default-caps] % also sets Serif
+% \stoptypescript
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular*default]
+% \definefontsynonym[SerifCaps] [palatinonova-regular*default-caps]
+% \stoptypescript
+
+% \definetypeface[mainface][rm][serif][palatino-nova-regular][default] \setupbodyfont[mainface]
+%
+% \starttext
+% ``Test'' -- --- ff fi fl \sc ``Test'' -- --- ff fi fl
+% \stoptext
+
+% \starttext
+% \definefont
+% [blabla]
+% [name:Latin Modern Something]
+% \definefont
+% [blabla]
+% [file:texnansi-lmr10]
+% \blabla test
+% \definefont
+% [blabla]
+% [texnansi-lmtt10]
+% \blabla test
+% \stoptext
+
+% \starttext
+%
+% \setupcolors[state=start]
+%
+% \definefontfeature
+% [default-base]
+% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes]
+% \definefontfeature
+% [default-node]
+% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,mode=node]
+% \definefontfeature
+% [default-none]
+% [script=latn,language=dflt,liga=yes,kern=no, tlig=yes,trep=yes]
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:lmroman12regular*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:lmroman12regular*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:lmroman12regular*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \blank
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:texgyrepagella*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:texgyrepagella*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:texgyrepagella*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \blank
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:palatinonovaregular*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:palatinonovaregular*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:palatinonovaregular*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:OfficinaSerifBookITC*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:OfficinaSerifBookITC*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:OfficinaSerifBookITC*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \definefontfeature[superdefault][default][compose=yes]
+%
+% {\font\oeps=name:lmroman10regular*default at 30pt \oeps test \char7683}
+% {\font\oeps=name:lmroman10regular*superdefault at 30pt \oeps test \char7683}
+%
+% \stoptext
+
+% xetex / todo: disable default features ! file:, name:, [], "" etc etc
+
+\beginXETEX
+
+ % for some reason xetex does not support [filename] for tfm files and
+ % quotes also behave kind of strange " vs ' vs [ vs ...
+
+ % we need to use the specs,
+ %
+ % \font\myfont = msam7 % ok
+ % \font\myfont = "msam7" % also ok
+ % \font\myfont = "msam7" at 8pt % error
+
+ \ifx\suppressfontnotfounderror\undefined
+
+ \newcount\xetexsavedinteractionmode
+ \newbox \xetexcrappyhackbox
+
+ \def\doiffoundxetexfontelse#1#2%
+ {\xetexsavedinteractionmode\interactionmode
+ \batchmode
+ \setbox\xetexcrappyhackbox\vbox{\par}% resets error count
+ \font\xetextempfont=#2\somefontspec\relax
+ \edef\xetextempfont{\fontname\xetextempfont}%
+ \ifx\xetextempfont\nullfontname
+ \interactionmode\xetexsavedinteractionmode
+ %\writestatus\m!fonts{fails #1: #2 (\xetextempfont)}%
+ \expandafter\secondoftwoarguments
+ \else
+ \interactionmode\xetexsavedinteractionmode
+ %\writestatus\m!fonts{succeeds #1: #2 (\xetextempfont)}%
+ \expandafter\firstoftwoarguments
+ \fi}
+
+ \else
+
+ \def\doiffoundxetexfontelse#1#2%
+ {\suppressfontnotfounderror\plusone
+ \font\xetextempfont=#2\somefontspec\relax
+ \suppressfontnotfounderror\zerocount
+ \edef\xetextempfont{\fontname\xetextempfont}%
+ \ifx\xetextempfont\nullfontname
+ %\writestatus\m!fonts{fails #1: #2 (\xetextempfont)}%
+ \expandafter\secondoftwoarguments
+ \else
+ %\writestatus\m!fonts{succeeds #1: #2 (\xetextempfont)}%
+ \expandafter\firstoftwoarguments
+ \fi}
+
+ \fi
+
+ \def\docheckfontfilenameprefix#1:#2:#3#4\relax
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \ifx\!!stringb\empty
+ % no prefix
+ \let\checkedfontfile\!!stringa
+ \doiffoundxetexfontelse{1a}{\checkedfontfile\checkedfontfeatures}
+ {\edef\checkedfontfile{\checkedfontfile\checkedfontfeatures}}
+ {\doiffoundxetexfontelse{1b}{"\checkedfontfile\checkedfontfeatures"}
+ {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
+ {\doiffoundxetexfontelse{1c}{"[\checkedfontfile]\checkedfontfeatures"}
+ {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+ {}}}%
+ \else\ifx\!!stringa\v!file
+ % force file, only file check when no spaces
+ \let\checkedfontfile\!!stringb
+ \doiffoundxetexfontelse{2b}{"[\checkedfontfile]\checkedfontfeatures"}
+ {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+ {\doiffoundxetexfontelse{2c}{"\checkedfontfile\checkedfontfeatures"}
+ {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
+ {}}%
+ \else\ifx\!!stringa\v!name
+ % force name, always lookup by xetex itself, "" forces otf/ttf/type1
+ \edef\checkedfontfile{"\!!stringb\checkedfontfeatures"}%
+ \else
+ % whatever, maybe even xetex spec, forget about features
+ \edef\checkedfontfile{"\!!stringa\!!stringb"}%
+ \fi\fi\fi}
+
+ \def\checkfontfilename% -- todo: integrate so that we call do.. directly
+ {\expandafter\docheckfontfilename\fontfile*\empty*\relax}
+
+ \def\docheckfontfilename#1*#2#3*#4\relax % class overrules file
+ {\edef\checkedfontfeatures
+ {\expandafter\ifx\csname\fontclass\s!features\endcsname\empty
+ \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
+ \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away
+ \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
+ \else
+ \csname\fontclass\s!features\endcsname
+ \fi\fi}%
+ \ifx\checkedfontfeatures\empty
+ % done
+ \else
+ \edef\checkedfontfeatures{\executeifdefined{\??fa\checkedfontfeatures}\empty}%
+ \ifx\checkedfontfeatures\empty
+ % done
+ \else
+ \let\convertedfontfeatures\empty
+ \processcommacommand[\checkedfontfeatures]\doconvertfontfeatures % raw
+ \ifx\convertedfontfeatures\empty
+ \let\checkedfontfeatures\empty
+ \else
+ \edef\checkedfontfeatures{:\convertedfontfeatures}%
+ \fi
+ \fi
+ \fi
+ \docheckfontfilenameprefix#1:\empty:\empty\relax
+ \doshowcheckedfontfeatures}
+
+ \def\dodoconvertfontfeatures#1=#2#3=#4\relax
+ {\ifx#2\empty
+ % invalid feature
+ \else\ifcsname @xtx@#1@#2#3\endcsname
+ \expandafter\ifx\csname @xtx@#1@#2#3\endcsname\empty\else
+ \edef\convertedfontfeatures{\convertedfontfeatures\csname @xtx@#1@#2#3\endcsname;}%
+ \fi
+ \else
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2#3}%
+ \edef\convertedfontfeatures
+ {\convertedfontfeatures
+ \ifx\!!stringb\v!yes
+ +\!!stringa
+ \else\ifx\!!stringb\v!no
+ -\!!stringa
+ \else
+ \!!stringa=\!!stringb
+ \fi\fi;}%
+ \fi\fi}
+
+ \def\doconvertfontfeatures#1%
+ {\dodoconvertfontfeatures#1=\empty=\relax}
+
+ \def\remapfontfeature #1 #2 #3 {\setevalue{@xtx@#1@#2}{#3}}
+
+ % this may move to another file, maybe font-xtx
+
+ \remapfontfeature tlig yes mapping=tlig
+ %remapfontfeature tlig no mapping=
+ \remapfontfeature trep yes {}
+ \remapfontfeature trep no {}
+ \remapfontfeature texligatures yes mapping=tlig
+ %remapfontfeature texligatures no mapping=
+ %remapfontfeature texquotes yes mapping=tex-text
+ %remapfontfeature texquotes no mapping=
+
+\endXETEX
+
+\let\doshowcheckedfontfeatures\relax
+
+\def\showcheckedfontfeatures
+ {\def\doshowcheckedfontfeatures{\writestatus\m!fonts{checked: \checkedfontfile}}}
+
+\def\checkedfontfile{\fontfile} % default
+
+\newtoks\everydefinefont
+
+\def\donoparsefontspec % #1 == \cs
+ {\edef\fontfile{\truefontname\somefontname}%
+ \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi
+ \updatefontparameters
+ \checkfontfilename
+ \edef\lastfontname{\checkedfontfile\somefontspec}%
+ \ifx\fontclass\empty
+ \expandafter\definefontlocal
+ \else
+ \expandafter\definefontglobal
+ \fi} % #1 == \cs
+
+\def\definefontlocal#1%
+ {\expandafter\edef\csname#1\endcsname % ! ! ! ! not needed in luatex ! ! ! !
+ {\noexpand\csname#1:\endcsname
+ \noexpand\reactivatefont{\somefontname}{\fontfile}}%
+ \expandafter\font\csname#1:\endcsname\lastfontname\relax
+ \expandafter\let\expandafter\lastrawfontcall\csname#1:\endcsname
+ \the\everydefinefont}
+
+\def\definefontglobal#1% stores \somefontname=Mono and \fontfile=cmtt10
+ {\expandafter\xdef\csname#1\endcsname % ! ! ! ! not needed in luatex ! ! ! !
+ {\noexpand\csname#1:\endcsname
+ \noexpand\reactivatefont{\somefontname}{\fontfile}}%
+ \global\expandafter\font\csname#1:\endcsname\lastfontname\relax
+ \expandafter\let\expandafter\lastrawfontcall\csname#1:\endcsname
+ \the\everydefinefont}
+
+\def\reactivatefont#1#2%
+ {\def\somefontname{#1}%
+ \def\fontfile {#2}%
+ \updatefontparameters}
+
+% can be handy for tracing purposes
+%
+% \def\reportfontdefinition
+% {\bgroup
+% \expanded{\infofont
+% [\lastfontidentifier
+% ->\newfontidentifier
+% ->\fontname\csname\newfontidentifier\endcsname]}%
+% \endgraf
+% \egroup}
+
+%D An additional the second \type {\font} definition can
+%D prevent fuzzy font refs
+%D
+%D \starttyping
+%D \expandafter\font\csname\dummyfontname\endcsname\lastfontname
+%D \stoptyping
+%D
+%D but somehow they changed \TEX\ so that it does not matter
+%D any more.
+
+\def \defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone
+\edef\nullfontname {\fontname\nullfont}
+\edef\dummyfontname {font\strippedcsname\\}
+
+\beginXETEX
+ \def\defaultfontfile{lmtypewriter10-regular}
+\endXETEX
+
+%D \macros
+%D {everyfont,everyfontswitch}
+%D
+%D For special purposes, we provide a hook.
+
+% \newevery \everyfont \relax
+% \newevery \everyfontswitch \relax
+
+% safer but sometimes introducing newlines in the log
+%
+% \batchmode
+% \font\lastloadedfont\fontfile\somefontspec\relax
+% \errorstopmode
+% \edef\lastfontname{\fontname\lastloadedfont}%
+% \ifx\lastfontname\nullfontname
+% \showmessage\m!fonts{10}{\fontfile}%
+% \expandafter\font\csname#1\endcsname=\defaultfontfile\somefontspec\relax
+% \else
+% \expandafter\let\csname#1\endcsname\lastloadedfont
+% \fi
+
+%D We also accept \type{sa a}||\type{sa d} as specification.
+
+\def\checkfontscale#1#2\end#3%
+ {#3\ifcsname\??ft\s!default\noexpand#1\endcsname
+ \csname\??ft\s!default\noexpand#1\endcsname\else#1#2%
+ \fi#3}
+
+%D The duplicate font definition, using the ever the same dummy
+%D font name, results in less fuzzy error messages. In the log
+%D file, for instance when overfull boxes are reported, the
+%D simple keyword `font' replaces the \TEX\ ordinated name. The
+%D latter can be too misleading, due to the fact that \TEX\ has
+%D a rather optimized font memory management. Thanks to Taco
+%D for helping me sort this out.
+
+%D \macros
+%D {definefontsynonym, doifelsefontsynonym,
+%D expandfontsynonym, truefontname, truefontdata}
+%D
+%D While looking for fonts, fontsynonyms are used for accessing
+%D the files!
+%D
+%D \starttyping
+%D \definefontsynonym[Serif][Lucida-Bright]
+%D \definefontsynonym[Lucida-Bright][lbr][encoding=texnansi]
+%D \stoptyping
+%D
+%D The definitions can be accessed by:
+%D
+%D \startlines
+%D name: \type {\truefontname{Lucida-Bright}}
+%D data: \type {\truefontdata{\truefontname{Lucida-Bright}}}
+%D \stoplines
+
+% \def\definefontsynonym
+% {\dotripleempty\dodefinefontsynonym}
+%
+% \def\dodefinefontsynonym[#1][#2][#3]%
+% {\@EA\edef\csname\??ff\fontclass#1\endcsname{#2}%
+% \ifthirdargument
+% \edef\@@fontdata{#3}%
+% \ifx\@@fontdata\empty \else
+% \edef\@@fontfile{#2}%
+% \ifx\fontclass\empty
+% \getfontparameters
+% \else
+% \getglobalfontparameters
+% \fi
+% \fi
+% \fi}
+%
+% slightly faster, noticable when loading many typefaces,
+%
+% \testfeatureonce{5000}{\definefontsynonym[somefont][somename]} \end
+
+\def\classfont#1#2{#1#2} % \definefont[whatever][\classfont{xx}{yy} at 10pt]
+
+\beginOLDTEX
+
+\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontfile{#3}%
+ \@EA\let\csname\??ff\fontclass#1\endcsname\@@fontfile
+ \doifnextcharelse[\dodefinefontsynonym\donothing}
+
+\def\dodefinefontsynonym[#1]%
+ {\edef\@@fontdata{#1}%
+ \ifx\@@fontdata\empty \else \ifx\fontclass\empty
+ \getfontparameters
+ \else
+ \getglobalfontparameters
+ \fi \fi}
+
+\endOLDTEX
+
+% We need to move the feature into the filename else it may be
+% overloaded by another reference. For instance the definition of
+% a regular and caps variant can use the same font.
+
+% We could use an indirect method ... store in 'array' and refer to
+% slot.
+
+\beginNEWTEX
+
+\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontname{#1}%
+ \edef\@@fontfile{#3}%
+ \doifnextcharelse[\dodefinefontsynonym\nodefinefontsynonym}
+
+\def\nodefinefontsynonym
+ {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile}
+
+\def\dodefinefontsynonym[#1]%
+ {\edef\@@fontdata{#1}%
+ \ifx\@@fontdata\empty
+ \nodefinefontsynonym
+ \else
+ \ifx\fontclass\empty
+ \getfontparameters
+ \else
+ \getglobalfontparameters
+ \fi
+ \ifcsname\??ff\@@fontfile\s!features\endcsname
+ \@EA\edef\csname\??ff\fontclass\@@fontname\endcsname{\@@fontfile*\csname\??ff\@@fontfile\s!features\endcsname}%
+ \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined
+ \else
+ \nodefinefontsynonym
+ \fi
+ \fi}
+
+\endNEWTEX
+
+% \def\resetfontsynonym[#1]% fails
+% {\letbeundefined{\??ff\fontclass#1}\letbeundefined{\??ff#1}}
+
+\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
+
+\def\setupfontsynonym
+ {\dodoubleempty\dosetupfontsynonym}
+
+\def\dosetupfontsynonym[#1][#2]%
+ {\edef\@@fontdata{#2}%
+ \ifx\@@fontdata\empty \else
+ \edef\@@fontfile{#1}%
+ \ifx\fontclass\empty
+ \getfontparameters
+ \else
+ \getglobalfontparameters
+ \fi
+ \fi}
+
+\def\truefontdata#1#2%
+ {\ifcsname\??ff#1#2\endcsname
+ % raw(Regular) raw(key)
+ \csname\??ff#1#2\endcsname
+ \else\ifcsname\??ff\fontclass#1\endcsname
+ % exp(palatino Regular) raw(key)
+ \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
+ \else\ifcsname\??ff#1\endcsname
+ % exp(Regular) raw(key)
+ \expandafter\truefontdata\csname\??ff#1\endcsname#2%
+ \else\ifcsname\??ff#2\endcsname
+ % raw(key)
+ \csname\??ff#2\endcsname
+ \fi\fi\fi\fi}
+
+\beginOLDTEX
+
+\def\truefontname#1%
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ \@EA\truefontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+\endOLDTEX
+
+\beginNEWTEX
+
+% simple version
+%
+% \def\truefontname#1%
+% {\@EA\dotruefontname#1*\relax}
+%
+% \def\dotruefontname#1*#2\relax
+% {\ifcsname\??ff\fontclass#1\endcsname
+% \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+% \else\ifcsname\??ff#1\endcsname
+% \@EA\truefontname\csname\??ff#1\endcsname
+% \else
+% #1%
+% \fi\fi}
+%
+% last counts
+%
+% \def\truefontname#1%
+% {\@EA\dotruefontname#1*\empty*\relax}
+%
+% \def\dotruefontname#1*#2#3*#4\relax
+% {\ifcsname\??ff\fontclass#1\endcsname
+% \ifx#2\empty
+% \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+% \else
+% \@EA\truefontname\csname\??ff\fontclass#1\endcsname*#2#3%
+% \fi
+% \else\ifcsname\??ff#1\endcsname
+% \ifx#2\empty
+% \@EA\truefontname\csname\??ff#1\endcsname
+% \else
+% \@EA\truefontname\csname\??ff#1\endcsname*#2#3%
+% \fi
+% \else
+% \ifx#2\empty
+% #1%
+% \else
+% #1*#2#3%
+% \fi
+% \fi\fi}
+%
+% first counts
+
+\def\truefontname#1%
+ {\@EA\dotruefontname#1*\empty*\relax}
+
+\def\dotruefontname#1*#2#3*#4\relax
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \ifx#2\empty
+ \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+ \else
+ \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname*#2#3%
+ \fi
+ \else\ifcsname\??ff#1\endcsname
+ \ifx#2\empty
+ \@EA\truefontname\csname\??ff#1\endcsname
+ \else
+ \@EA\redotruefontname\csname\??ff#1\endcsname*#2#3%
+ \fi
+ \else
+ #1\ifx#2\empty\else*#2#3\fi
+ \fi\fi}
+
+\def\redotruefontname#1%
+ {\@EA\dodotruefontname#1*\relax}
+
+\def\dodotruefontname#1*#2\relax
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ \@EA\redotruefontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+\endNEWTEX
+
+\def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1)
+ {\ifcsname\??ff\fontclass#2\endcsname
+ \expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}%
+ \fi}
+
+\def\doifelsefontsynonym#1%
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% \definetypeface[palatino][rm][serif][palatino,allbold][default]
+%
+% \startfontclass[palatino]
+% \definefontsynonym [Serif] [SerifBold]
+% \definefontsynonym [SerifItalic] [SerifBoldItalic]
+% \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
+% \definefontsynonym [SerifCaps] [SerifBold]
+% \stopfontclass
+%
+% \setupbodyfont[palatino]
+
+\def\startfontclass
+ {\dosingleempty\dostartfontclass}
+
+\def\dostartfontclass[#1]%
+ {\pushmacro\fontclass
+ \doifelse{#1}{\v!each}
+ {\let\fontclass\empty}
+ {\doifsomething{#1}{\def\fontclass{#1}}}}
+
+\def\stopfontclass
+ {\popmacro\fontclass}
+
+%D \macros
+%D {tracedfontname}
+%D
+%D A goody:
+
+\def\tracedfontencoding#1%
+ {\ifcsname\??ff#1\s!encoding\endcsname
+ \space[\csname\??ff#1\s!encoding\endcsname]%
+ \fi}
+
+\def\tracedfontname#1%
+ {\ifcsname\??ff\fontclass#1\endcsname
+ #1\tracedfontencoding{\fontclass#1}\space->\space
+ \@EA\tracedfontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ #1\tracedfontencoding{#1}\space->\space
+ \@EA\tracedfontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+%D \macros
+%D {getfontfileparameters}
+%D
+%D For special purposes, one can use the next macro to
+%D access font file characteristics, for instance:
+%D
+%D \starttyping
+%D \getfontfileparameters{Regular}
+%D \stoptyping
+%D
+%D can result in:
+%D
+%D \starttyping
+%D \def\currentfontfileencoding{texnansi}
+%D \stoptyping
+
+% \def\@@currentfontfile{currentfontfile}
+%
+% \def\getfontfileparameters#1%
+% {\edef\fontdata{\truefontdata{\truefontname{#1}}}%
+% \expanded{\getparameters[\@@currentfontfile][\fontdata]}}
+
+\def\getfontfileparameters#1% can be simpler for mkii
+ {\edef\@@truefontname{\truefontname{#1}}%
+ \edef\currentfontfileencoding{\truefontdata\@@truefontname\s!encoding}%
+ \edef\currentfontfilemapping {\truefontdata\@@truefontname\s!mapping }%
+ \edef\currentfontfilehandling{\truefontdata\@@truefontname\s!handling}%
+ \edef\currentfontfilefeatures{\truefontdata\@@truefontname\s!features}}
+
+%D \macros
+%D {definefont}
+%D
+%D Before we implement the main definition macro, we first show
+%D one for local use:
+%D
+%D \starttyping
+%D \definefont[Some][LucidaBright at 100pt] \Some some
+%D \definefont[More][LucidaBright scaled 3000] \More more
+%D \definefont[Nice][LucidaBright mp 2] \Nice nice
+%D \definefont[Text][LucidaBright sa 5.4] \Text last
+%D \stoptyping
+%D
+%D The implementation looks as follows:
+
+\def\definefont
+ {\dotripleempty\dodefinefont}
+
+\def\dodefinefont[#1][#2][#3]% [name][spec][1.6 | line=10pt | setup_id]
+ {\doifinstringelse{ }{#2}
+ {\ifthirdargument
+ \unexpanded\setvalue{#1}{\redodefinefont{#1}{#2}{#3}}%
+ \else
+ \unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}%
+ \fi}
+ {\definefont[#1][#2 sa *][#3]}}
+
+\def\redodefinefont#1#2#3%
+ {\dododefinefont{#1}{#2}%
+ \doifsetupselse{#3}
+ {\setups[#3]} % don't forget to document this !
+ {\setuplocalinterlinespace[#3]%
+ \setupspacing}} % needed ?
+
+\def\definefrozenfont
+ {\dotripleempty\dodefinefrozenfont}
+
+\def\dodefinefrozenfont[#1][#2][#3]%
+ {\dodefinefont[#1][#2][#3]%
+ \expandafter\let\csname\lastfontidentifier\expandafter\endcsname\csname\rawfontidentifier\endcsname}
+
+% \def\defineclassfont
+% {\doquadrupleempty\dodefineclassfont}
+%
+% \def\dodefineclassfont[#1][#2][#3][#4]% #2 = class
+% {\iffourthargument
+% \definefont[#1][#2#3][#4]%
+% %\else\ifthirdargument
+% % \definefont[#1][#2#3]%
+% \else
+% \definefont[#1][#2]%
+% \fi}
+
+%D The \type {*} makes the switch local, so that we can redefine a
+%D logical name and/or change the size in between.
+
+\newif\ifautofontsize \autofontsizetrue
+
+\let\lastfontidentifier\empty
+
+\def\rawfontidentifier{**\lastfontidentifier\fontsize**}
+\def\newfontidentifier{*\fontclass\lastfontidentifier\fontsize*}
+
+% 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%
+ {\edef\lastfontidentifier{#1}%
+ \let\localrelativefontsize\defaultrelativefontsize
+ \let\localabsolutefontsize\fontbody
+ \parsefontspec{#2}\rawfontidentifier
+ \let\localrelativefontsize\defaultrelativefontsize % not needed
+ \csname\rawfontidentifier\endcsname
+ \autofontsizefalse
+ \setfontcharacteristics
+ \the\everyfontswitch}
+
+\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine
+ {\edef\lastfontidentifier{#3}%
+ \ifcsname\newfontidentifier\endcsname\else
+ \def\localrelativefontsize{#1}%
+ \def\localabsolutefontsize{#2}%
+ \parsefontspec{#4}\newfontidentifier
+ \let\localrelativefontsize\defaultrelativefontsize % not needed
+ \fi
+ \csname\newfontidentifier\endcsname
+ \autofontsizefalse
+ %\edef\lastfontidentifier{#3}%
+ \ifskipfontcharacteristics \else
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+%D I considered checking for mistakenly use of \PLAIN's
+%D \type{\magstep}'s but although it would take only a few
+%D lines of code, this would not add to consistent use. I
+%D therefore removed this check.
+
+%D \macros
+%D {mapfontsize}
+%D
+%D For special purposes, like in math, you may want to use
+%D slightly different sizes than the ones given. This happens
+%D for instance with the Math Times fonts. Mapped font sizes
+%D can be specified by using the \type {mo} key instead of
+%D \type {sa} in font definitions.
+%D
+%D \startbuffer
+%D \mapfontsize[10pt][11pt]
+%D \mapfontsize[11pt][12pt]
+%D \mapfontsize[12pt][13pt]
+%D
+%D \definefont[test][Serif]\test TEST \par
+%D \definefont[test][Serif sa 5]\test TEST \par
+%D \definefont[test][Serif mo 5]\test TEST \par
+%D \definefont[test][Serif sa d]\test TEST \par
+%D \definefont[test][Serif at 60pt]\test TEST \par
+%D \definefont[test][Serif scaled 6000]\test TEST \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startpacked
+%D \getbuffer
+%D \stoppacked
+
+\def\mapfontsize
+ {\dodoubleargument\domapfontsize}
+
+\def\domapfontsize[#1][#2]%
+ {\scratchdimen#1\relax % \relax is really needed here
+ \setvalue{\??ft*\the\scratchdimen}{#2}}
+
+\def\setmappedfontsize#1%
+ {\ifcsname\??ft*#1\endcsname
+ \csname\??ft*#1\endcsname
+ \else
+ #1%
+ \fi}
+
+%D \macros
+%D {getfontname}
+%D
+%D The names of the fonts can be called with the rather simple
+%D macro \type{\getfontname}. When for instance we pass
+%D \type{12ptrmtf} as argument, we get \getfontname{12ptrmtf}.
+
+\def\getfontname#1%
+ {\csname\??ft#1\endcsname}
+
+%D To be documented.
+
+\let\sizelist\empty
+
+\def\definefontsize[#1]% sneller met toks
+ {\addtocommalist{#1}\sizelist
+ \def\docommand##1%
+ {\def\dodocommand####1%
+ {\def\dododocommand########1%
+ %{\checkbodyfont{}{########1}{####1}{##1}}%
+ {\checkbodyfont{########1}{####1}{##1}}%
+ \processcommacommand[\stylelist]\dododocommand}%
+ \processcommacommand[\alternativelist]\dodocommand}%
+ \processcommacommand[\sizelist]\docommand}
+
+\def\alternativetextlist{\c!tf,\c!bf,\c!it,\c!sl,\c!bs,\c!bi,\c!sc}
+\def\alternativemathlist{\c!mr,\c!mi,\c!sy,\c!ex,\c!ma,\c!mb}
+
+\let\alternativelist\alternativetextlist % upward compatible
+
+%\definefontsize[\c!a] \definefontsize[\c!b]
+%\definefontsize[\c!c] \definefontsize[\c!d]
+
+%D \macros
+%D {currentfontscale,currentfontbodyscale}
+%D
+%D Sometimes we need to have access to the font scale
+%D including the \type{a}||\type{d} sizes. The next macro
+%D returns the current scaling factor. Take a look at
+%D \type {cont-log.tex} for an example of its use.
+
+\def\currentfontscale
+ {\csname\??ft\s!default
+ \ifcsname\??ft\s!default\xfontsize\endcsname \xfontsize \else
+ \ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi
+ \endcsname}
+
+\def\currentfontbodyscale
+ {\csname\??ft\s!default
+ \ifcsname\??ft\s!default\fontsize\endcsname \fontsize \else
+ \ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi
+ \endcsname}
+
+\setvalue{\??ft\s!default}{1}
+
+%D Both alternatives use \type {\xfontsize}, a macro that
+%D expands to the current size in terms of \type {a} \unknown
+%D \type {d}, nothing, or \type {x} \unknown \type {xx}.
+
+\def\xfontsize{\ifcase\currentxfontsize\fontsize\or\c!x\else\c!xx\fi}
+
+%D A typical use of this command is in commands that switch
+%D to another font bypassing the font mechanism:
+%D
+%D \starttyping
+%D \font\myfont=\truefontname{MyFont} at \currentfontscale\bodyfontsize
+%D \stoptyping
+
+%D Now we enter the area of font switching. The switching
+%D mechanism has to take care of several situations, like:
+%D
+%D \startitemize[packed]
+%D \item changing the overal document fonts (including margins,
+%D headers and footers)
+%D \item changing local fonts (only the running text)
+%D \item smaller and even more smaller alternatives (super-
+%D and subscripts)
+%D \stopitemize
+%D
+%D \TEX\ offers a powerfull family mechanism for super- and
+%D subscripts in math mode. In text mode however, we don't use
+%D families for the smaller alternatives, and therefore have
+%D to take care of it otherwise.
+
+%D \macros
+%D {definebodyfontenvironment,setupbodyfontenvironment}
+%D
+%D The relationship between the several sizes of a font, is
+%D defined by:
+%D
+%D \showsetup{definebodyfontenvironment}
+%D
+%D Later on we will see how these parameters are used, so for
+%D the moment we stick with an example:
+%D
+%D \starttyping
+%D \definebodyfontenvironment
+%D [12pt]
+%D [ text=12pt,
+%D script=9pt,
+%D scriptscript=7pt,
+%D x=10pt,
+%D xx=8pt,
+%D big=12pt,
+%D small=10pt]
+%D \stoptyping
+%D
+%D The first argument specifies the bodyfont size to which the
+%D settings apply. All second parameters are specified in
+%D dimensions and tell us more about related sizes.
+%D
+%D Afterwards, one can change values with
+%D
+%D \showsetup{setupbodyfontenvironment}
+%D
+%D Due to the fact that \type{\c!text} and \type{\s!text} can
+%D have a similar meaning, and therefore can lead to an
+%D unwanted loop, we temporary redefine \type{\c!text}. For
+%D the moment this in only place that some trickery is needed
+%D to fool the multilingual interface.
+%D
+%D When instead of a size the keyword \type{unknown} is
+%D passed, fractions (relations) are used instead of fixed
+%D sizes.
+
+\let\bodyfontenvironmentlist\empty
+
+\newcount\@@fontdefhack
+
+\def\@@beginfontdef
+ {\ifcase\@@fontdefhack
+ \let\k!savedtext \k!text \let\k!text \s!text
+ \let\k!k!savedtext \k!k!text \let\k!k!text \!!plusone
+ \let\k!saveddefault \k!default \let\k!default \s!default
+ \let\k!k!saveddefault\k!k!default \let\k!k!default \!!plusone
+ \fi
+ \advance\@@fontdefhack \plusone }
+
+\def\@@endfontdef
+ {\advance\@@fontdefhack \minusone
+ \ifcase\@@fontdefhack
+ \let\k!k!default\k!k!saveddefault
+ \let\k!default \k!saveddefault
+ \let\k!k!text \k!k!savedtext
+ \let\k!text \k!savedtext
+ \fi}
+
+\def\definebodyfontenvironment
+ {\dotripleempty\dodefinebodyfontenvironment}
+
+\def\dodefinebodyfontenvironment[#1][#2][#3]% class size settings
+ {\ifthirdargument
+ \@@beginfontdef
+ \doifelse{#2}\s!default
+ {\getparameters[\??ft\s!default][#3]}
+ {\normalizebodyfontsize#2\to\tempbodyfontsize
+ \addtocommalist\tempbodyfontsize\bodyfontenvironmentlist
+ \@EA\dododefinebodyfontenvironment\@EA[\tempbodyfontsize][#1][#3]}%
+ \@@endfontdef
+ \else
+ \definebodyfontenvironment[\fontclass][#1][#2]% change */*
+ \fi}
+
+\def\dododefinebodyfontenvironment[#1][#2][#3]% size class settings
+ {\@@beginfontdef
+ \doifundefined{\??ft#2#1\c!em} % \s!text goes wrong in testing because
+ {\def\docommand##1% % the 12pt alternative will called when
+ {\scratchdimen#1\relax % typesetting the test (or so)
+ \scratchdimen\csname\??ft\s!default##1\endcsname\scratchdimen
+ \normalizebodyfontsize\scratchdimen\to\tempbodyfontsize
+ \setevalue{\??ft#2#1##1}{\tempbodyfontsize}}%
+ \processcommacommand[\fontsizelist]\docommand
+ \copyparameters
+ [\??ft#2#1][\??ft\s!default]
+ [\c!interlinespace,\c!em]}%
+ \getparameters[\??ft#2#1][#3]%
+ \@@endfontdef
+ % new code, see remark
+ \ifloadingfonts \else % only runtime
+ \doifundefined{\@size@#1} % only once
+ {\letvalue{\@size@#1}\empty % prevent loop
+ \defineunknownfont{#1}}% % safeguard
+ \fi
+ % so far
+ \setvalue{\@size@#1}{\docompletefontswitch[#1]}}
+
+%D {\bf Remark:} We need to cover the following cases,
+%D otherwise users can get confused:
+%D
+%D \starttyping
+%D \setupbodyfont[23pt]
+%D
+%D \definebodyfontenvironment[23pt]
+%D \setupbodyfont[23pt]
+%D
+%D \definebodyfontenvironment[23pt]
+%D \definebodyfont[23pt][rm,ss,tt][default]
+%D \setupbodyfont[23pt]
+%D \stoptyping
+
+%D Beware: while some font defs can be global, the bodyfont
+%D environment checks local. This means that multiple local
+%D checks resulting in definitions are not that efficient.
+%D So, apart from an occasional switch, one should define an
+%D environment at the outer level.
+
+\def\checkbodyfontenvironment[#1]%
+ {\definebodyfontenvironment[\fontclass][#1][]}
+
+% original
+%
+% \def\setupbodyfontenvironment
+% {\dotripleempty\dosetupbodyfontenvironment}
+%
+% \def\dosetupbodyfontenvironment[#1][#2][#3]% class size settings
+% {\@@beginfontdef
+% \ifthirdargument
+% \getparameters[\??ft#1#2][#3]%
+% \else
+% \getparameters[\??ft#1][#2]%
+% \fi
+% \@@endfontdef}
+%
+% this one already catches both define/setup
+
+\def\setupbodyfontenvironment{\definebodyfontenvironment}
+
+% officially, but not needed (yet):
+%
+% \def\dosetupbodyfontenvironment[#1][#2][#3]% class size settings
+% {\ifthirdargument
+% \localbodyfontsize#2\relax
+% \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+% \doifundefinedelse{\??ft#1\normalizedbodyfontsize\c!em}
+% {\definebodyfontenvironment[#1][#2][#3]}%
+% {\getparameters[\??ft#1\normalizedbodyfontsize][#3]}%
+% \else
+% \localbodyfontsize#1\relax
+% \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+% \doifundefinedelse{\??ft\normalizedbodyfontsize\c!em}
+% {\definebodyfontenvironment[#1][#2]}%
+% {\getparameters[\??ft\normalizedbodyfontsize][#2]}%
+% \fi}
+
+%D Just a couple of interface macros:
+
+\def\bodyfontvariable#1%
+ {\??ft\ifcsname\??ft\fontclass#1\endcsname\fontclass\fi#1}
+
+\def\bodyfontcsname
+ {\csname\bodyfontvariable}
+
+\def\bodyfontinterlinespecs
+ {\bodyfontvariable{\normalizedbodyfontsize\c!interlinespace}}
+
+\def\bodyfontinterlinespace
+ {\csname\bodyfontinterlinespecs\endcsname}
+
+%D We default all parameters to the main bodyfont size (begin
+%D \type{#1}), so the next setup is valid too:
+%D
+%D \starttyping
+%D \definebodyfontenvironment[24pt]
+%D \stoptyping
+%D
+%D All parameters can be redefined when needed, so one does
+%D not have to stick to the default ones.
+
+%D \macros
+%D {definebodyfont}
+%D
+%D The next step in defining a bodyfont involves the actual font
+%D files, which can be recognized by their extension
+%D \type{tfm}. Installing those file is often beyond the
+%D scope of the user and up to the system administrator.
+%D
+%D \showsetup{definebodyfont}
+%D
+%D This commands takes three arguments: a (series of) bodyfont
+%D size(s), the style group to which the definitions belong,
+%D and an alternative, as specified by the \TEX\ (math) families,
+%D extended with~a, b~\unknown.
+%D
+%D We show two examples, that show all the alternative
+%D scaling options. The \type{\tfa} alternatives can be
+%D extended with \type{\bfa}, \type{\slb}, etc. or even
+%D \type{e} and higher alternatives.
+%D
+%D \starttyping
+%D \definebodyfont [12pt] [rm]
+%D [tf=cmr12,
+%D bf=cmbx12,
+%D it=cmti12,
+%D sl=cmsl12,
+%D bi=cmbxti10 at 12pt,
+%D bs=cmbxsl10 at 12pt,
+%D tfa=cmr12 scaled \magstep1,
+%D tfb=cmr12 scaled \magstep2,
+%D tfc=cmr12 scaled \magstep3,
+%D tfd=cmr12 scaled \magstep4,
+%D sc=cmcsc10 at 12pt]
+%D
+%D \definebodyfont [12pt,11pt,10pt,9pt,8pt] [rm]
+%D [tf=lbr sa 1,
+%D bf=lbd sa 1,
+%D it=lbi sa 1,
+%D sl=lbsl sa 1,
+%D bi=lbdi sa 1,
+%D bs=lbdi sa 1,
+%D tfa=lbr sa 1.200,
+%D tfb=lbr sa 1.440,
+%D tfc=lbr sa 1.728,
+%D tfd=lbr sa 2.074,
+%D sc=lbr sa 0.833]
+%D \stoptyping
+%D
+%D The second example shows that we can define more sizes at
+%D once. The main difference between these examples is that the
+%D Computer Modern Roman come in many design sizes. This means
+%D that there we cannot define them in bulk using \type{sa}.
+%D Instead of \type{rm} (roman) one can define \type{ss} (sans
+%D serif), \type{tt} (teletype), \type{hw} (hand written),
+%D \type{cg} (calygraphic) and whatever styles.
+%D
+%D The first argument may be a comma separated list. This,
+%D combined with specifications using \type{sa} can save a lot
+%D of typing. Although all arguments should be specified, we
+%D treat the second argument as optional.
+%D
+%D Defining a bodyfont involves two actions: defining the
+%D specific style related alternatives, like \type{\rma},
+%D \type{\bfa} and \type{\rmsla}, and storing the definitions
+%D of their bodyfont size related fonts. The first step is
+%D bodyfont independant but executed every time. This permits
+%D user definitions like \type{\tfw} or \type{\bfq} for real
+%D large alternatives.
+
+\def\definebodyfont
+ {\doquadrupleempty\redefinebodyfont}
+
+\def\redefinebodyfont[#1][#2][#3][#4]%
+ {\iffourthargument
+ \processcommacommand[#1]{\reredefinebodyfont[#2][#3][#4]}%
+ \else
+ \dodefinebodyfont[#1][#2][#3]%
+ \fi}
+
+\def\reredefinebodyfont[#1][#2][#3]#4%
+ {\pushmacro\fontclass
+ \doifelse{#4}\s!default
+ {\let\fontclass\empty}
+ {\def\fontclass{#4}}%
+ \definebodyfont[#1][#2][#3]%
+ \popmacro\fontclass}
+
+\def\dodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
+ {\ifthirdargument
+ \doifnumberelse{#1}
+ {\doifassignmentelse{#3}
+ {% [12pt] [style] [settings]
+ \doifundefined{#2}{\expanded{\definefontstyle[#2][#2]}}% new
+ \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}}
+ {% [12pt] [style] [identifier]
+ \dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier
+ {% [identifier] [style] [settings] % see ***
+ \setvalue{\s!default#1#2}##1##2{\expanded{\xdodefinebodyfont[##1][##2][#3]}}}%
+ \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.
+ \fi\fi}
+
+\def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
+ {%\writestatus{[#1]}{[#2][#3]}%
+ \checkrelativefontsize{#2}% rather new, inherit from other defs
+ \ifundefined{#2}\expanded{\definefontstyle[#2][#2]}\fi % new
+ \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}%
+ \let\relativefontsize\defaultrelativefontsize}
+
+\def\dododefinebodyfont#1#2#3% style defs body
+ {\checkbodyfontenvironment[#3]% just to be sure.
+ \processcommalist[#2]{\dodododefinebodyfont{#1}{#3}}}
+
+\def\dodododefinebodyfont#1#2#3% style body def
+ {\dododododefinebodyfont{#1}{#2}[#3]}
+
+\newif \ifresolvefontfile % protected by fontclass anyway
+
+\def\resolvefontname#1 {\truefontname{#1} }
+
+\def\iflocalclassfonts{\ifx\fontclass\empty}
+
+\def\dododododefinebodyfont#1#2[#3#4#5=#6]% style body def
+ {\ifundefined{#1#3#4#5}%
+ %\checkbodyfont{#2}{#1}{#3#4}{#5}% not \definefontsize[#5]
+ \checkbodyfont{#1}{#3#4}{#5}% not \definefontsize[#5]
+ \fi
+ \iflocalclassfonts
+ \letbeundefined{*\fontclass#2#1#3#4#5*}%
+ \scratchtoks{#6}%
+ \expanded{\unexpanded\noexpand\setvalue{#2#1#3#4#5}%
+ {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
+ {#2#1#3#4#5}{\the\scratchtoks}}}%
+ \else
+ %\expanded{\writestatus{defining}{[\fontclass][#2#1#3#4#5] \resolvefontname#6 }}%
+ \global\letbeundefined{*\fontclass#2#1#3#4#5*}%
+ \ifresolvefontfile
+ \unexpanded\setxvalue{\fontclass#2#1#3#4#5}%
+ {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
+ {#2#1#3#4#5}{\resolvefontname#6 }}%
+ \else
+ \scratchtoks{#6}%
+ \expanded{\unexpanded\noexpand\setgvalue{\fontclass#2#1#3#4#5}%
+ {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
+ {#2#1#3#4#5}{\the\scratchtoks}}}%
+ \fi
+ \fi}
+
+% \def\checkbodyfont#1#2#3#4% body style alt size / gdef % #4 can be empty
+% {\def\c!!mm{#2}%
+% \ifx\c!!mm\c!mm % prevents \max and alike (re)defs
+% \unexpanded\setgvalue {#2}{\setcurrentfontstyle {#2}}% \rm
+% \unexpanded\setgvalue {#3}{\setcurrentfontalternative {#3}}% \sl
+% \else
+% \unexpanded\setgvalue {#2#4}{\setcurrentfontstylesize {#2}{#4}}% \rma
+% \unexpanded\setgvalue {#3#4}{\setcurrentfontalternativesize {#3}{#4}}% \sla
+% \unexpanded\setgvalue {#2#3#4}{\setcurrentfontstylealternativesize{#2}{#3}{#4}}% \rmsla
+% \unexpanded\setgvalue {#2}{\setcurrentfontstyle {#2}}% \rm
+% \unexpanded\setgvalue {#3}{\setcurrentfontalternative {#3}}% \sl
+% \unexpanded\setgvalue {#2\c!x}{\setcurrentfontxstylealternative {#2}}% \rmx
+% \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxstylealternative {#2}}% \rmxx
+% \unexpanded\setgvalue {#3\c!x}{\setcurrentfontxalternative {#3}}% \slx
+% \unexpanded\setgvalue{#3\c!xx}{\setcurrentfontxxalternative {#3}}% \slxx
+% \unexpanded\setgvalue {#2#3}{\setcurrentfontstylealternative {#2}{#3}}% \rmsl
+% \fi}
+%
+% leaner
+
+\def\checkbodyfont#1% tests for ttsl mmbf
+ {\def\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
+
+\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 {#1}{\setcurrentfontstyle {#1}}% \mm
+ \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}}% \sl
+
+\def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty
+ {%\message{!t #1 #2 #3!}%
+ \unexpanded\setgvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% \rma
+ \unexpanded\setgvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% \sla
+ \unexpanded\setgvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \rmsla
+ \unexpanded\setgvalue {#1}{\setcurrentfontstyle {#1}}% \rm
+ \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}% \sl
+ \unexpanded\setgvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% \rmx
+ \unexpanded\setgvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% \rmxx
+ \unexpanded\setgvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% \slx
+ \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% \slxx
+ \unexpanded\setgvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}}% \rmsl
+
+\def\dodefinedefaultbodyfont[#1][#2][#3]% sizes styles identifier
+ {\def\dododefinedefaultbodyfont##1%
+ {\def\dodododefinedefaultbodyfont####1%
+ {\def\dododododefinedefaultbodyfont########1%
+ {\doifdefined{\s!default########1####1}
+ {% [12pt] [style] [identifier]
+ \getvalue{\s!default########1####1}{##1}{####1}}}%
+ \processcommalist[#3]\dododododefinedefaultbodyfont}%
+ \processcommalist[#2]\dodododefinedefaultbodyfont}%
+ \processcommalist[#1]\dododefinedefaultbodyfont}
+
+%D Unknown families are added to the family list! For the
+%D moment we also set the direct calls here. Some day a better
+%D solution will be implemented. The good news is that unknown
+%D fonts are defined automatically.
+
+\newif\ifdefiningunknownfont
+
+% \def\defineunknownfont#1%
+% {\let\c!savedtext\c!text
+% \let\c!text\s!text
+% \donefalse
+% \def\docommand##1%
+% {\doifdefined{\??ft\s!default##1}
+% {\donetrue
+% \scratchdimen#1\relax
+% \scratchdimen\csname\??ft\s!default##1\endcsname\scratchdimen
+% \normalizebodyfontsize\scratchdimen\to\!!stringa
+% \letvalue{\??ft#1##1}\!!stringa}}%
+% \processcommacommand[\fontsizelist]\docommand
+% \let\c!text\c!savedtext
+% \ifdone
+% \donefalse
+% \def\defineunknownbodyfont##1% see ***
+% %{\doifdefined{\s!default##1}
+% % {\donetrue\getvalue{\s!default##1}{#1}}}%
+% {\doifdefined{\s!default\s!default##1}
+% {\donetrue\getvalue{\s!default\s!default##1}{#1}{##1}}}%
+% \processcommacommand
+% [\stylelist]
+% \defineunknownbodyfont
+% \ifdone
+% \setvalue{\@size@#1}{\docompletefontswitch[#1]}%
+% \ifdefiningunknownfont \else
+% \definingunknownfonttrue
+% \def\defineunknownsubfont##1%
+% {\doifundefined{\@size@\getvalue{\??ft#1##1}}
+% {\defineunknownfont{\getvalue{\??ft#1##1}}}}%
+% \processcommacommand[\fontsizelist]\defineunknownsubfont
+% \definingunknownfontfalse
+% \fi
+% \fi
+% \ifdone
+% \showmessage\m!fonts{14}{#1}%
+% \fi
+% \fi}
+
+\def\dodefineunknownfont#1#2%
+ {\doifdefined{\??ft\s!default#2}
+ {\donetrue
+ \scratchdimen#1\relax
+ \scratchdimen\csname\??ft\s!default#2\endcsname\scratchdimen
+ \normalizebodyfontsize\scratchdimen\to\!!stringa
+ \letvalue{\??ft#1#2}\!!stringa}}
+
+% \def\dodefineunknownbodyfont#1#2% see ***
+% {\doifdefined{\s!default\s!default#2}
+% {\donetrue
+% \getvalue{\s!default\s!default#2}{#1}{#2}}}
+%
+% but ... it needs to be as follows:
+%
+% \def\dodefineunknownbodyfont#1#2% see ***
+% {\doifdefined{\s!default\fontclass#2}% was \s!default\s!default (related to change */*)
+% {\donetrue
+% \getvalue{\s!default\fontclass#2}{#1}{#2}}}
+%
+% eh ... this does not work so we revert back to:
+
+\def\dodefineunknownbodyfont#1#2% see ***
+ {\doifdefined{\s!default\s!default#2}% somehow related to */*
+ {\donetrue
+ \getvalue{\s!default\s!default#2}{#1}{#2}}}
+
+\def\dodefineunknownsubfont#1#2%
+ {\doifundefined{\@size@\getvalue{\??ft#1#2}}
+ {\donetrue
+ \defineunknownfont{\getvalue{\??ft#1#2}}}}
+
+\def\defineunknownfont#1%
+ {\let\c!savedtext\c!text
+ \let\c!text\s!text
+ \donefalse
+ \processcommacommand[\fontsizelist]{\dodefineunknownfont{#1}}%
+ \let\c!text\c!savedtext
+ \ifdone
+ \donefalse
+ \processcommacommand
+ [\stylelist]
+ {\dodefineunknownbodyfont{#1}}%
+ \ifdone
+ \donefalse
+ \setvalue{\@size@#1}{\docompletefontswitch[#1]}%
+ \ifdefiningunknownfont \else
+ \definingunknownfonttrue
+ \processcommacommand[\fontsizelist]{\dodefineunknownsubfont{#1}}%
+ \definingunknownfontfalse
+ \fi
+ \fi
+ \ifdone
+ \showmessage\m!fonts{14}{#1}%
+ \fi
+ \fi}
+
+% \def\defineunknownfontstyles#1%
+% {\def\defineunknownbodyfont##1% see ***
+% {\executeifdefined{\s!default\s!default##1}\gobbletwoarguments{#1}{##1}}%
+% \rawprocesscommacommand[\stylelist]\defineunknownbodyfont}
+
+%D These macros show that quite some definitions take place.
+%D Fonts are not loaded yet! This means that at format
+%D generation time, no font files are preloaded.
+
+%D A previous implementation used:
+%D
+%D \starttyping
+%D \type {\setvalue{name}{\donottest...}}
+%D \stoptyping
+%D
+%D instead of the more memory hungry:
+%D
+%D \starttyping
+%D \unexpanded\setvalue{name}{...}
+%D \stoptyping
+%D
+%D The first alternative saves about 500 hash entries (about
+%D 2.5\% of the total number of entries used. The second
+%D alternative is currently used, because that one can more
+%D easily be made \ETEX\ aware.
+
+%D \macros
+%D {everybodyfont,Everybodyfont,everyglobalbodyfont}
+%D
+%D Every change in bodyfont size has conseqences for the baseline
+%D distance and skips between paragraphs. These are initialized
+%D in other modules. Here we only provide the hooks that
+%D garantees their handling.
+
+% \ifx\everybodyfont\undefined % permits reloading
+% \newevery \everybodyfont \EveryBodyFont
+% \fi
+
+%D At the system level one can initialize thing like:
+%D
+%D \starttyping
+%D \appendtoks \setupspacing \to \everybodyfont
+%D \stoptyping
+%D
+%D While users can add their own non standard commands like:
+%D
+%D \starttyping
+%D \EveryBodyFont{\message{changing to bodyfont \the\bodyfontsize}}
+%D \stoptyping
+%D
+%D Personnaly I never felt the need for such extensions, but
+%D at least its possible.
+
+%D \macros
+%D {globalbodyfontsize,localbodyfontsize}
+%D
+%D Next we'll do the tough job of font switching. Here we
+%D have to distinguish between the global (overal) bodyfont
+%D size and the local (sometimes in the textflow) size. We
+%D store these dimensions in two \DIMENSION\ registers.
+
+\newdimen\globalbodyfontsize \globalbodyfontsize=12pt
+\newdimen\localbodyfontsize \localbodyfontsize =\globalbodyfontsize
+
+%D \macros
+%D {bodyfontsize}
+%D
+%D These two registers are not to be misused in calculations.
+%D For this purpose we keep a copy:
+
+\newdimen\bodyfontsize \bodyfontsize=\globalbodyfontsize
+
+%D \macros
+%D {outputresolution}
+%D
+%D Sometimes (to be honest: not in this module) we need to
+%D take the system resolution into account. Therefore we also
+%D define a macro:
+
+\def\outputresolution {600}
+
+%D \macros
+%D {bodyfontfactor,bodyfontpoints}
+%D
+%D For multiplication purposes we keep an auxiliary counter
+%D and macro (here the expansion is not explicitly needed):
+
+\newcount\bodyfontpoints \dimensiontocount\bodyfontsize\bodyfontpoints
+
+\edef\bodyfontfactor{\withoutpt\the\bodyfontsize}
+
+%D When we assign for instance 12pt to a \DIMENSION\ register
+%D the \type{\the}'d value comes out as 12.0pt, which is
+%D often not the way users specify the bodyfont size. Therefore
+%D we also store the normalized value.
+
+\chardef\fontdigits=1
+
+\def\normalizebodyfontsize#1\to#2%
+ {\scratchdimen#1\relax
+ \ifcase\fontdigits\advance\scratchdimen.5\points\fi
+ \@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\scratchdimen00\to#2}
+
+\def\donormalizedbodyfontsize#1.#2#3#4\to#5% \points ?
+ {\edef#5%
+ {#1%
+ \ifcase\fontdigits\or
+ \ifcase#2 \else.#2\fi % and not: \ifcase#2\else ...
+ \else
+ \ifcase#2#3 \else.#2\ifcase#3 \else#3\fi\fi % not: \ifcase#2#3\else ...
+ \fi
+ \s!pt}}
+
+\normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+
+%D To be internationalized:
+
+\def\korpsgrootte {\bodyfontsize}
+\def\korpspunten {\bodyfontpoints}
+
+%D some day.
+
+%D \macros
+%D {fontstyle,fontalternative,fontsize}
+%D
+%D Within a bodyfont, fonts can come in different sizes. For
+%D instance \type{\tf} is accompanied by \type{\tfa},
+%D \type{\tfb} etc. The first two characters denote the
+%D alternative, while the third character in these sequences
+%D represents the size. The actual size is saved in a macro
+%D
+%D The style, being roman (\type{\rm}), sans serif (\type{\ss})
+%D etc. is also available in a macro in \type{rm}, \type{ss}
+%D etc. form:
+
+\let\defaultfontalternative = \c!tf
+\let\defaultfontstyle = \empty
+\let\defaultfontsize = \empty
+
+\let\fontalternative = \defaultfontalternative
+\let\fontstyle = \defaultfontstyle
+\let\fontsize = \defaultfontsize
+
+%D {\em The following approach is obsolete.}
+%D
+%D All things related to fonts are grouped into files with
+%D names like \type{font-cmr}. These files are loaded by:
+
+\def\resetfontdefinitionfile[#1]%
+ {\letbeundefined{\c!file\f!fontprefix#1}}
+
+\newif\ifloadfontfileonce
+
+\def\doreadfontdefinitionfile#1#2% #1 = set/switch state
+ {\doifundefined{\c!file\f!fontprefix#2}%
+ {\ifloadfontfileonce
+ \letvalue{\c!file\f!fontprefix#2}\empty
+ \fi
+ \makeshortfilename[\truefilename{\f!fontprefix#2}]%
+ \startreadingfile
+ \readsysfile\shortfilename
+ {\showmessage\m!fonts2{#2}}
+ {\showmessage\m!fonts3{#2}}%
+ \stopreadingfile}}
+
+%D When \type {\loadfontfileoncetrue}, such files are
+%D only loaded once! This permits redundant loading, but at
+%D the same time forced grouping when we want continuously mix
+%D all kind of font, which of course is a kind of
+%D typographically sin. The \type{"} is made inactive if
+%D needed to prevent problems with loading files that use this
+%D character in numbers.
+
+\def\doswitchpoints[#1]%
+ {\expanded{\dodoswitchpoints{#1}}}
+
+\def\dodoswitchpoints#1%
+ {\doifundefined{\@size@#1}
+ {\defineunknownfont{#1}}%
+ %\defineunknownfontstyles{#1}%
+ \doifdefinedelse{\@size@#1}
+ {\getvalue{\@size@#1}%
+ \localbodyfontsize#1\relax
+ \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+ \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}}}
+
+%D \TEX\ loads font metric files like \type{cmr10.tfm} and
+%D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files
+%D are {\em preloaded}. This means that the font files are
+%D loaded, but not accessible yet by name. This is accomplished
+%D by saying:
+%D
+%D \starttyping
+%D \font\preloaded=cmr10 at 11pt
+%D \stoptyping
+%D
+%D and using the name \type{\preloaded} again and again, so
+%D fonts are indeed loaded, but unnamed, and therefore
+%D unaccessible. In \CONTEXT\ we don't preload fonts, not even
+%D the \PLAIN\ \TEX\ ones, although users can access them. Now
+%D why is this done?
+
+%D Defining fonts using \type{\definebodyfont} takes time, so we
+%D prefer to predefine at least the Computer Modern Roman
+%D fonts. However, loading all those fonts at definition time
+%D would take both time and space. But even worse, once fonts
+%D are loaded into memory, their encoding vector is fixed,
+%D which is a handicap when we want to distribute the compact
+%D \type{fmt} files. So what we want to do is defining fonts in
+%D a way that postpones the loading. We accomplish this by only
+%D loading the fonts when we switch to another bodyfont size.
+%D Among the other alternatives, such as loading the font at
+%D the moment of activation and redefining the activation
+%D macro afterwards, this proved to be the most efficient
+%D alternative.
+%D
+%D The next few macros take care of the one exeption on this
+%D scheme. When at format generation time we load the default
+%D font file, the one that defines the Computer Modern Fonts,
+%D we don't want the fonts metrics to end up in the format
+%D file, so we temporary prohibit loading. This means that at
+%D runtime we have to load the default bodyfont size just before
+%D we start typesetting.
+%D
+%D Therefore we have to signal the font switching macros that
+%D we are preloading fonts. As long as the next boolean is,
+%D true, no loading is done.
+
+\newif\ifloadingfonts \loadingfontstrue
+
+%D \macros
+%D {preloadfonts}
+%D
+%D Preloading is only called for once, during the startup
+%D sequence of a session. After the loading job is done, the
+%D macro relaxes itself and reset the signal.
+
+\def\preloadfonts % never called, needs a clean up
+ {\showmessage\m!fonts6{\normalizedbodyfontsize\normalspace\fontstyle}%
+ \global\loadingfontsfalse
+ \doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace
+ \global\let\preloadfonts\relax}
+
+% \prependtoks \preloadfonts \to \everydump % saves .1 s on a DELL P60 - 2GHZ
+
+%D Here comes the main font switching macros. These macros
+%D handle changes in size as well as returning to the global
+%D bodyfont size.
+
+\def\dosetfont#1#2% #1 = set/switch state
+ {\doifelse{#2}\v!global
+ {\restoreglobalbodyfont}
+ {\processcommacommand[#2]{\dodosetfont{#1}}% ##1 get also passed
+ \ifloadingfonts\else
+ \doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \fi}%
+ \chardef\currentxfontsize\zerocount}
+
+\def\dodosetfont#1#2% #1 = set/switch state | check fo rempty, else space
+ {\doifsomething{#2}{\dododosetfont{#1}{#2}{\showmessage\m!fonts4{#2}}}}
+
+\def\dododosetfont#1#2#3% #1 = set/switch state
+ {\doifnumberelse{#2}
+ {\dodododosetfont{#1}{#2}{#3}}
+ {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#2}}
+ {\edef\fontstep{\bodyfontcsname\normalizedbodyfontsize\interfaced{#2}\endcsname}%
+ \expanded{\dodododosetfont{#1}{\fontstep}}{#3}}
+ {\doifelse{#2}\v!reset
+ {\let\fontstyle\empty % new 31/7/2006
+ \let\fontsize \empty}
+ {\doifdefinedelse{\@style@#2}
+ {\edef\fontstyle{#2}}
+ {\doreadfontdefinitionfile{#1}{#2}}}}}}
+
+\def\dodododosetfont#1#2#3% #1 = set/switch state
+ {\scratchdimen#2\relax
+ \normalizebodyfontsize\scratchdimen\to\normalizedsetfont
+ \doifundefined{\@size@\normalizedsetfont}
+ {\defineunknownfont{#2}}%
+ \doifdefinedelse{\@size@\normalizedsetfont}
+ {\localbodyfontsize\normalizedsetfont
+ \let\normalizedbodyfontsize\normalizedsetfont}
+ {#3\dosetsubstitutefont{#1}{#2}}}
+
+%D In the previous macros we use \type{\currentxfontsize} to
+%D hold the current x||size of the font. This enables us to
+%D support for instance \type{\sl} inside a \type{\tx} switch.
+
+\chardef\currentxfontsize=0
+
+%D When users specify for instance a 13 point bodyfont while no
+%D such bodyfont is defined, the system automatically tries to
+%D find a best fit, that is the nearest smaller defined
+%D bodyfontzize. A smaller one is definitely better than a larger
+%D one, simply because otherwise a lot of overfull box messages
+%D are more probable to occur. By taking a value slightly
+%D smaller than half a point, we can use the next method.
+
+\def\dosetsubstitutefont#1#2% #1 = set/switch state
+ {\scratchdimen#2\relax
+ \advance\scratchdimen .499\points
+ \dimensiontocount\scratchdimen\scratchcounter
+ \advance\scratchcounter \minusone
+ \ifnum\scratchcounter>\plusthree
+ \dododosetfont{#1}{\the\scratchcounter\s!pt}{}%
+ \fi}
+
+% The following bunch of macros deals with the (run time)
+% expansion of names onto the definitions made by \type
+% {\definebodyfont}.
+
+% \let\fontbody \empty % ... 10pt 11pt 12pt ...
+% \let\fontstyle \empty % rm ss tt mm hw cg ...
+% \let\fontalternative\empty % tf bf sl it bs bi sc ...
+% \let\fontsize \empty % xy-abcd ...
+
+\def\defaultfontbody{\normalizedbodyfontsize}
+
+\let\fontbody\defaultfontbody
+
+\let\fontclass\empty \let\globalfontclass\fontclass
+
+\def\setcurrentfontclass#1%
+ {\edef\fontclass{#1}}
+
+\let\defaultfontstyle \c!rm
+\let\defaultfontalternative \c!tf
+\let\defaultfontsize \empty
+
+%D \macros
+%D {bigmath,nobigmath}
+%D
+%D We can inhibit this slow||downer with:
+
+% these can best be combined
+
+% 0=never 1=everymath 2=always
+
+\chardef\synchronizebigmathflag=1
+
+\appendtoks
+ \ifcase\synchronizebigmathflag
+ % never
+ \or
+ \synchronizebigmath
+ \or
+ % always
+ \fi
+\to \everymathematics
+
+\def\nobigmath{\chardef\synchronizebigmathflag 0 }
+\def\bigmath {\chardef\synchronizebigmathflag 2 \synchronizebigmath}
+
+\let\bigmathfontsize\empty
+
+\def\synchronizebigmath
+ {\ifx\bigmathfontsize\fontsize
+ % already in sync
+ \else
+ \let\bigmathfontsize\fontsize
+ \synchronizemath \synchronizetext
+ \fi}
+
+\def\checkbigmathsynchronization
+ {\ifcase\synchronizebigmathflag
+ % never
+ \or
+ \ifmmode \synchronizebigmath \fi
+ \or
+ \synchronizebigmath
+ \fi}
+
+%D So far for synchronisation.
+
+\def\dosetcurrentfontsize#1%
+ {\edef\fontsize{#1}%
+ \checkbigmathsynchronization}
+
+\def\dosetcurrentfontalternative#1%
+ {\edef\fontalternative{#1}%
+ \ifmmode % maybe no test, or actually, an option
+ \fam\csname\fontalternative\s!fam\endcsname
+ \fi}
+
+\def\setcurrentfont#1#2#3#4%
+ {%\message{[1 #1 #2 #3 #4]}%
+ \edef\fontbody{#1}%
+ \edef\fontstyle{#2}%
+ \dosetcurrentfontalternative{#3}%
+ \dosetcurrentfontsize{#4}%
+ \synchronizefont}
+
+\def\setcurrentfontbody#1%
+ {%\message{[2 #1]}%
+ \edef\fontbody{#1}%
+ \synchronizefont}
+
+% \def\setcurrentfontstyle#1%
+% {%\message{[3 #1]}%
+% \edef\fontstyle{#1}%
+% \ifmmode\mr\fi % otherwise \rm not downward compatible
+% \synchronizefont}
+%
+% For Taco: optional fall backs:
+
+\ifx\checkfontclass\undefined \let\checkfontclass\gobbleoneargument \fi % implemented in type-ini
-\def\mkdefinefontfeature#1#2#3%
- {\doifassignmentelse{#2}
- {\setevalue{\??fa#1}{#2}}
- {\let\!!stringa\empty
- \def\mkdodefinefontfeature##1{\edef\!!stringa{\ifx\!!stringa\empty\else\!!stringa,\fi##1}}%
- \processcommalist[#2]\mkdodefinefontfeature
- \setevalue{\??fa#1}{\ifx\!!stringa\empty\else\!!stringa,\fi#3}}}
+\def\setcurrentfontstyle#1%
+ {%\message{[3 #1]}%
+ \checkfontclass{#1}%
+ \edef\fontstyle{#1}%
+ \ifmmode\mr\fi % otherwise \rm not downward compatible
+ \synchronizefont}
+
+\def\setcurrentfontbodyalternative#1#2%
+ {%\message{[4 #1 #2]}%
+ \edef\fontbody{#1}%
+ \dosetcurrentfontalternative{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontalternative#1%
+ {%\message{[5 #1]}%
+ \dosetcurrentfontalternative{#1}%
+ \synchronizefont}
+
+\def\setcurrentfontsize#1%
+ {%\message{[6 #1]}%
+ \dosetcurrentfontsize{#1}%
+ \synchronizefont}
+
+\def\setcurrentfontstylealternative#1#2% \rmsl
+ {%\message{[7 #1 #2]}%
+ \edef\fontstyle{#1}%
+ \dosetcurrentfontalternative{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontstylesize#1#2% \rmsla
+ {%\message{[8 #1 #2]}%
+ \edef\fontstyle{#1}%
+ \dosetcurrentfontsize{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontalternativesize#1#2% \sla
+ {%\message{[9 #1 #2]}%
+ \dosetcurrentfontalternative{#1}%
+ \dosetcurrentfontsize{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontstylealternativesize#1#2#3% \rmsla
+ {%\message{[10 #1 #2 #3]}%
+ \edef\fontstyle{#1}%
+ \dosetcurrentfontalternative{#2}%
+ \dosetcurrentfontsize{#3}%
+ \synchronizefont}
+
+%D In principle one can assign alternative fallback routines.
+%D Some day we will.
+
+\newtoks\fontstrategies
+\newif\iftryingfont
+
+\let\fontstrategy\relax
+
+\def\synchronizefont
+ {\tryingfonttrue
+ \ifx\fontclass\empty\else
+ \global\let\fontstrategy\dofontclassstrategy
+ \the\fontstrategies \relax % \relax still needed ?
+ \fi
+ \iftryingfont
+ \global\let\fontstrategy\dofontstrategy
+ \the\fontstrategies \relax % \relax still needed ?
+ \fi
+ \ifskipfontcharacteristics
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+\def\dofontstrategy#1#2#3#4#5%
+ {\ifcsname#2#3#4#5\endcsname
+ #1\csname#2#3#4#5\endcsname \tryingfontfalse
+ \fi}
+
+\def\dofontclassstrategy#1#2#3#4#5%
+ {\ifcsname\fontclass#2#3#4#5\endcsname
+ #1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse
+ \fi}
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a
+ \fontbody \fontstyle \fontalternative \fontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- --- def % pt tt bf
+ \fontbody \fontstyle \fontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def --- % pt tt tf a
+ \fontbody \fontstyle \defaultfontalternative \fontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def def % pt tt tf
+ \fontbody \fontstyle \defaultfontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- def def def % pt rm tf
+ \fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % def def def def % rm tf
+ \defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+%D Let's synchronize:
+
+\newif\ifsynchronizefonts \synchronizefontstrue
+
+\prependtoks
+ \ifsynchronizefonts
+ \synchronizemath
+ \synchronizetext
+ \synchronizefont % problem: syncs last font
+ \fi
+\to \everybodyfont
+
+%D Setting the normal sized as well as the x and xx smaller
+%D sizes is accomplished by the next set of macros. When in
+%D math mode, the commands \type{\tx} and \type{\txx} are
+%D just a switch to the script and double script styles, but
+%D in text mode the values defined by the bodyfontenvironment are
+%D used. Here we also set \type{\currentxfontsize}.
+
+\def\dosetcurrentfontxxxalternative#1#2#3#4%
+ {\chardef\currentxfontsize#2\relax
+ \ifmmode
+ #4%
+ \else\ifcsname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname
+ \setcurrentfontbodyalternative{\bodyfontcsname\normalizedbodyfontsize#3\endcsname}{#1}%
+ \fi\fi}
+
+\def\setcurrentfontxalternative#1%
+ {\dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle
+ \let\tx\txx}
+
+\def\setcurrentfontxxalternative#1%
+ {\dosetcurrentfontxxxalternative{#1}2\c!xx\scriptscriptstyle
+ \let\tx\empty
+ \let\txx\empty}
+
+\def\checknestedxfontsize % option
+ {\ifcase\currentxfontsize\else\ifx\fontsize\empty\else
+ \chardef\currentxfontsize\zeropoint
+ \let\fontsize\empty
+ \let\tx\normaltx
+ \let\txx\normaltxx
+ \fi\fi}
+
+\def\setcurrentfontxalternative#1%
+ {\checknestedxfontsize
+ \dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle
+ \let\tx\txx}
+
+\def\setcurrentfontxxalternative#1%
+ {\checknestedxfontsize
+ \dosetcurrentfontxxxalternative{#1}2\c!xx\scriptscriptstyle
+ \let\tx\empty
+ \let\txx\empty}
+
+% This alterative is not really needed, but for old time's sake
+% we keep it there. We can speed it up when needed.
+
+% \def\setcurrentfontxstylealternative #1{\csname#1\endcsname\tfx}
+% \def\setcurrentfontxxstylealternative#1{\csname#1\endcsname\tfxx}
+
+\def\setcurrentfontxstylealternative #1{\csname#1\endcsname\tx}
+\def\setcurrentfontxxstylealternative#1{\csname#1\endcsname\txx}
+
+%D These macros also show us that when we call for \type{\tx},
+%D this macro is redefined to be \type{\txx}. Therefore calls
+%D like:
+%D
+%D \startbuffer
+%D {small \tx is \tx beautiful}
+%D {small \tx is \txx beautiful}
+%D {small \txx is \tx beautiful}
+%D {small \txx is \txx beautiful}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D result in:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D Setting the main size involves the style list and therefore
+%D takes a bit more time. Keep in mind that the fontsize is
+%D represented by a character or empty.
+
+\unexpanded\def\tx {\setcurrentfontxalternative \fontalternative}
+\unexpanded\def\txx{\setcurrentfontxxalternative\fontalternative}
+
+\let\normaltx \tx
+\let\normaltxx\txx
+
+%D \macros
+%D {definefontstyle}
+%D
+%D When setting of switching the overall style we can use the
+%D short identifier like rm and ss, but when defined we can
+%D also use more verbose names like roman or sansserif. Such
+%D names are defined by:
+%D
+%D \starttyping
+%D \definefontstyle [serif,rm] [rm]
+%D \definefontstyle [sansserif,ss] [ss]
+%D \stoptyping
+
+\def\dodefinefontstyle[#1][#2]%
+ {\rawdoifinsetelse{#2}{\stylelist}
+ {}%\debuggerinfo\m!fonts{unknown style #2}}
+ {\addtocommalist{#2}\stylelist
+ \showmessage\m!fonts8{#2\space (#1)}}%
+ % check kan hier
+ \def\docommand##1%
+ {\setvalue{\@shortstyle@##1}{#2}%
+ \setvalue{\@style@##1}{\csname#2\endcsname}}%
+ \processcommalist[#1]\docommand}
+
+\def\definefontstyle
+ {\dodoubleargument\dodefinefontstyle}
+
+\def\setfontstyle#1#2% #1:name (roman, romaan) #2:style (rm)
+ {\edef\fontstyle{#1}%
+ \setcurrentfontstyle\normalizedbodyfontsize}
+
+\chardef\defaultskewcharmi=127 % '177
+\chardef\defaultskewcharsy= 48 % '60
+
+% \def\dosetskewchar#1%
+% {\skewchar\font\ifx\@@fontskewchar\empty#1\else\@@fontskewchar\fi}
+
+\def\dosetskewchar#1#2%
+ {\ifx\@@fontskewchar\empty
+ \skewchar\textfont #1#2%
+ \skewchar\scriptfont #1#2%
+ \skewchar\scriptscriptfont#1#2%
+ \else
+ \skewchar\textfont #1\@@fontskewchar
+ \skewchar\scriptfont #1\@@fontskewchar
+ \skewchar\scriptscriptfont#1\@@fontskewchar
+ \fi}
+
+%D The previous macros show that it's is not always
+%D neccessary to define the whole bunch of fonts, take for
+%D instance the sequence:
+%D
+%D \starttyping
+%D \setupbodyfont
+%D [ams]
+%D
+%D \definebodyfont [24pt] [mm]
+%D [ma=msam10 at 24pt,
+%D mb=msbm10 at 24pt]
+%D
+%D \switchtobodyfont
+%D [24pt]
+%D
+%D This is a 24pt $\blacktriangleleft$
+%D \stoptyping
+%D
+%D Here we didn't define the 24 point bodyfont environment, so
+%D it's defined automatically. Of course one can always use the
+%D \TEX\ primitive \type{\font} to switch to whatever font
+%D needed.
+
+%D When asking for a complete font switch, for instance from 10
+%D to 12~points, the next macro does the job. First we
+%D normalize the size, next we define the current range of
+%D text, script and scriptscript sizes, then we set the text
+%D fonts and the math families and finally we activate the
+%D default typeface and also set the font specific parameters
+%D assigned to \type{\everybodyfont}
+
+\def\dosetbodyfontface#1#2%
+ {\edef#1{\bodyfontcsname\normalizedbodyfontsize#2\endcsname}}
+
+\def\docompletefontswitch[#1]%
+ {\bodyfontsize#1\relax
+ \dimensiontocount\bodyfontsize\bodyfontpoints
+ \edef\bodyfontfactor{\withoutpt\the\bodyfontsize}%
+ \normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+ \dosetbodyfontface \textface \s!text
+ \dosetbodyfontface \scriptface \s!script
+ \dosetbodyfontface \scriptscriptface \s!scriptscript}
+
+\docompletefontswitch[12pt] % init
+
+%D \macros
+%D {setupbodyfont,switchtobodyfont}
+%D
+%D The next two macros are user ones. With \type{\setupbodyfont}
+%D one can set the document bodyfont size, font family, style
+%D and/or options defined in files, for example:
+%D
+%D \starttyping
+%D \setupbodyfont[cmr,ams,12pt,roman]
+%D \stoptyping
+%D
+%D This command affects the document as a whole: text, headers
+%D and footers. The second macro however affects only the text:
+%D
+%D \starttyping
+%D \switchtobodyfont[10pt]
+%D \stoptyping
+%D
+%D So we've got:
+%D
+%D \showsetup{setupbodyfont}
+%D \showsetup{switchtobodyfont}
+%D
+%D Both macros look alike. The second one also has to take
+%D all kind of keywords into account.
+
+\ifx\saveinterlinespace \undefined \let\saveinterlinespace \relax \fi
+\ifx\restoreinterlinespace\undefined \let\restoreinterlinespace\relax \fi
+
+\chardef\bodyfontsetstate=0
+
+\definecomplexorsimple\setupbodyfont
+
+\def\simplesetupbodyfont
+ {\restoreglobalbodyfont
+ \saveinterlinespace}
+
+\def\complexsetupbodyfont[#1]%
+ {\doifsomething{#1}
+ {\dosetfont1{#1}%
+ \globalbodyfontsize\localbodyfontsize
+ \normalizebodyfontsize\globalbodyfontsize\to\normalizedglobalbodyfontsize
+ \let\globalfontstyle\fontstyle
+ \ifloadingfonts\else
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace
+ \fi}}
+
+\unexpanded\def\switchtobodyfont[#1]%
+ {\doifsomething{#1}
+ {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}}
+ {\setbodyfontstep{#1}} % so we have a fast [small] switch
+ {\dosetfont0{#1}}%
+ \the\everybodyfont}} % indeed needed in case nothing is executed
+
+%D The following alternative is meant for math||to||text
+%D switching and will be optimized.
+
+\def\fastswitchtobodyfont#1%
+ {\ifcsname\??ft\normalizedbodyfontsize#1\endcsname
+ \edef\futurebodyfontsize
+ {\csname\??ft\normalizedbodyfontsize#1\endcsname}%
+ \ifcsname\@size@\futurebodyfontsize\endcsname
+ \csname\@size@\futurebodyfontsize\endcsname
+ \localbodyfontsize\futurebodyfontsize\relax
+ \fi
+ \fi
+ \csname\@style@\fontstyle\endcsname
+ \the\everybodyfont}
+
+%D Because the last macro can appear in arguments or be assigned
+%D to parameters, we protect this one for unwanted expansion.
+
+\def\dodosetmathfont#1%
+ {\setcurrentfontalternative{#1}%
+ % \doifdefinedelse{#1\s!fam} % adapted
+ % {\edef\mffam{\getvalue{#1\s!fam}}}
+ % {\edef\mffam{\getvalue{\c!nn\s!fam}}}%
+ \textfont \mrfam\textfont \mffam
+ \scriptfont \mrfam\scriptfont \mffam
+ \scriptscriptfont\mrfam\scriptscriptfont\mffam}
+
+\def\domffam#1%
+ {\csname\ifcsname#1\s!fam\endcsname#1\else\c!nn\fi\s!fam\endcsname}
+
+\def\mffam
+ {\domffam\fontalternative}
+
+\def\dosetmathfont
+ {\def\rm{\fam\mrfam}\dodosetmathfont}
+
+\def\enableencodinginmath
+ {\appendtoks
+ \everyhbox{\mr\everyhbox\emptytoks}%
+ \everyvbox{\mr\everyvbox\emptytoks}%
+ \to \everymathematics} % was \everymath
+
+% \enableencodinginmath % too untested to enable by default
+
+%D \starttyping
+%D $\cases{& \ccaron}$ $x=\hbox{\ccaron $x=\hbox{\ccaron}$}$
+%D \stoptyping
+
+%D The font specific features are bound to the filename.
\def\updatefontparameters
{\edef\@@fontencoding{\truefontdata\fontfile \s!encoding}%
@@ -52,6 +3531,1362 @@
\the\everyfont
\synchronizepatternswithfont}
-\ifx\synchronizepatternswithfont\undefined \def\synchronizepatternswithfont{\synchronizepatterns} \fi
+\ifx\synchronizepatternswithfont\undefined
+ \def\synchronizepatternswithfont{\synchronizepatterns}
+\fi
+
+%D Experimental:
+
+\def\definefontfeature
+ {\dotripleargument\dodefinefontfeature}
+
+\def\dodefinefontfeature[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\setevalue{\??fa#1}{#2}}
+ {\let\!!stringa\empty
+ \def\mkdodefinefontfeature##1{\edef\!!stringa{\ifx\!!stringa\empty\else\!!stringa,\fi##1}}%
+ \processcommalist[#2]\mkdodefinefontfeature
+ \setevalue{\??fa#1}{\ifx\!!stringa\empty\else\!!stringa,\fi#3}}}
+
+\definefontfeature
+ [default]
+ [liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [smallcaps]
+ [liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [oldstyle]
+ [liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature % no calt
+ [arabic]
+ [mode=node,language=dflt,script=arab,
+ init=yes,medi=yes,fina=yes,isol=yes,
+ liga=yes,dlig=yes,rlig=yes,clig=yes,
+ mark=yes,mkmk=yes,kern=yes,curs=yes]
+
+%D The next auxilliary macro is an alternative to \type
+%D {\fontname}.
+
+% \def\purefontname#1{\expandafter\splitoffpurefontname\fontname#1 \\}
+%
+% extra level is needed:
+
+\def\purefontname#1{\@EA\splitoffpurefontname\@EA{\@EA{\@EA\unstringed\fontname#1}} \\}
+
+\def\splitoffpurefontname#1 #2\\{#1}
+
+%D \macros
+%D {switchstyleonly}
+%D
+%D For switching a style but keeping the alternative, there
+%D is:
+%D
+%D \starttyping
+%D {\bf text \switchstyleonly\ss text}
+%D {\bf text \switchstyleonly[ss]text}
+%D {\sl text \switchstyleonly[sansserif]text}
+%D \stoptyping
+
+\definecomplexorsimple\switchstyleonly
+
+\def\simpleswitchstyleonly#1% stupid version
+ {\complexswitchstyleonly[\strippedcsname#1]}
+
+\def\complexswitchstyleonly[#1]% todo : check
+ {\setcurrentfontstyle{\getvalue{\@shortstyle@#1}}%
+ \the\everybodyfont} % needed ?
+
+%D \macros
+%D {os,frak, goth, cal}
+%D
+%D Old style numerals can be typeset with \type{\os} and look
+%D like {\os 1234567890} instead of the more common looking
+%D 1234567890.
+%D
+%D On behalf of {\frac Tobias Burnus}, we define some more of
+%D these. Later we will link these names to real file names.
+
+% older
+%
+% \definefont [os] [OldStyle sa *]
+% \definefont [frak] [Fraktur sa *]
+% \definefont [goth] [Gothic sa *]
+% \definefont [cal] [Calligraphic sa *]
+% \definefont [bbd] [Blackboard sa *]
+%
+% newer
+
+\def\os {\mathortext{\fam\purefamily {oldstyle}}{\symbolicfont {OldStyle}}}
+\def\frak{\mathortext{\fam\purefamily {fraktur}}{\symbolicfont {Fraktur}}}
+\def\goth{\mathortext{\fam\purefamily {gothic}}{\symbolicfont {Gothic}}}
+\def\cal {\mathortext{\fam\purefamily{calligraphic}}{\symbolicfont{Calligraphic}}}
+\def\bbd {\mathortext{\fam\purefamily {blackboard}}{\symbolicfont {Blackboard}}}
+
+\definefontsynonym [OldStyle] [Serif]
+\definefontsynonym [Fraktur] [Serif]
+\definefontsynonym [Gothic] [Serif]
+\definefontsynonym [Calligraphic] [Serif]
+\definefontsynonym [Blackboard] [Serif]
+
+%D \macros
+%D {fraktur, gothic, calligraphic, blackboard}
+%D
+%D These macros assume that we use text fonts, and not math
+%D families.
+
+\ifx\mathtext\undefined \let\mathtext\hbox \fi
+
+\def\fraktur #1{\mathortext\domathtext\donothing{\frak#1}}
+\def\gothic #1{\mathortext\domathtext\donothing{\goth#1}}
+\def\calligraphic#1{\mathortext\domathtext\donothing{\cal #1}}
+\def\blackboard #1{\mathortext\domathtext\donothing{\bbd#1}}
+
+%D Torture test:
+%D
+%D \starttyping
+%D \usetypescript[modern] [texnansi]
+%D \usetypescript[lucida] [texnansi]
+%D \usetypescript[palatino][texnansi]
+%D \usetypescript[times] [texnansi]
+%D \usetypescript[fourier] [ec]
+%D
+%D \startbuffer
+%D \section{\blackboard{T\high{\blackboard{T}}} \blackboard{E}\high{\blackboard{E}} \blackboard{X}\high{\blackboard{X}}}
+%D
+%D {\fontclass: 123 \os123 \cal TEX $\os 123$}
+%D
+%D $\blackboard{T}^{\blackboard{T}} \blackboard{E}^{\blackboard{E}} \blackboard{X}^{\blackboard{X}}$
+%D \blackboard{T}\high{\blackboard{T}} \blackboard{E}\high{\blackboard{E}} \blackboard{X}\high{\blackboard{X}}
+%D \stopbuffer
+%D
+%D {\setupbodyfont[lucida] \getbuffer}
+%D {\setupbodyfont[modern] \getbuffer}
+%D {\setupbodyfont[palatino] \getbuffer}
+%D {\setupbodyfont[times] \getbuffer}
+%D {\setupbodyfont[fourier] \getbuffer}
+%D \stoptyping
+
+%D \macros
+%D {definebodyfontswitch}
+%D
+%D \PLAIN\ \TEX\ defines some macro's like \type{\tenpoint}
+%D to switch to a specific bodyfontsize. Just for the sake of
+%D compatibility we can define them like:
+%D
+%D \starttyping
+%D \definebodyfontswitch [twelvepoint] [12pt]
+%D \stoptyping
+%D
+%D We don't support language specific synonyms here, mainly
+%D because \PLAIN\ \TEX\ is english anyway.
+
+\def\dodefinebodyfontswitch[#1][#2]%
+ {\def\docommand##1{\setvalue{##1}{\switchtobodyfont[#2]}}%
+ \processcommalist[#1]\docommand}
+
+\def\definebodyfontswitch
+ {\dodoubleargument\dodefinebodyfontswitch}
+
+%D \macros
+%D {setsmallbodyfont,setmainbodyfont,setbigbodyfont}
+%D
+%D When we're typesetting at for instance 10pt, we can call for
+%D the \type{small} as well as the \type{big} alternative,
+%D related to this main size, using \type{\switchtobodyfont[small]}.
+%D The three alternatives can be activated by the next three
+%D system calls and are defined by the bodyfontenvironment.
+
+\let\fontstep\empty % we can use \fontstep for tracing purposes
+
+\def\setbodyfontstep#1%
+ {\edef\fontstep{\bodyfontcsname\normalizedbodyfontsize\interfaced{#1}\endcsname}%
+ \doswitchpoints[\fontstep]%
+ \doswitchstyle[\fontstyle]}
+
+\unexpanded\def\setsmallbodyfont{\setbodyfontstep\v!small\the\everybodyfont}
+\unexpanded\def\setbigbodyfont {\setbodyfontstep\v!big \the\everybodyfont}
+
+\unexpanded\def\setmainbodyfont
+ {\doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace}
+
+%D \macros
+%D {restoreglobalbodyfont}
+%D
+%D Users can set whatever font available while typesetting text.
+%D Pagenumbers, footers, headers etc. however must be typeset
+%D in the main bodyfont and style of the document. Returning to
+%D the global state can be done with the next macro:
+
+\let\mainfontclass\empty
+
+\def\fullrestoreglobalbodyfont
+ {\let\fontsize\defaultfontsize
+ \let\fontbody\defaultfontbody
+ \chardef\currentxfontsize\zerocount
+ \let\fontclass\globalfontclass
+ \doswitchpoints[\normalizedglobalbodyfontsize]%
+ \doswitchstyle[\globalfontstyle]%
+ \redoconvertfont % just in case a pagebreak occurs
+ \tf
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace}
+
+\def\partialrestoreglobalbodyfont
+ {\let\fontsize\defaultfontsize
+ \let\fontbody\defaultfontbody
+ \chardef\currentxfontsize\zerocount
+ \redoconvertfont
+ \tf
+ \saveinterlinespace}
+
+\def\restoreglobalbodyfont % ook style etc
+ {\ifx\fontclass\globalfontclass
+ \ifx\fontstyle\globalfontstyle
+ \ifx\normalizedbodyfontsize\normalizedglobalbodyfontsize
+ \partialrestoreglobalbodyfont
+ \else
+ \fullrestoreglobalbodyfont
+ \fi
+ \else
+ \fullrestoreglobalbodyfont
+ \fi
+ \else
+ \fullrestoreglobalbodyfont
+ \fi}
+
+% in case of troubles: \let\restorebodyfont\fullrestoreglobalbodyfont
+
+%D This macro has to be called when entering the pagebody
+%D handling routine as well as the footnote insert routine.
+%D Users can access this feature |<|for instance when one wants
+%D to typeset tables and alike in the main bodyfont and style
+%D while the running text is temporary set to a smaller one|>|
+%D by saying \type{\switchtobodyfont[global]}.
+
+%D \macros
+%D {rasterfont}
+%D
+%D There are (at the moment) two situations in which we want to
+%D have fast access to a particular font. When we are using
+%D \TEX\ to typeset rasters, we use small {\rasterfont.}'s
+%D (a rather small period indeed), the same as \PICTEX\ uses
+%D for drawing purposes.
+
+\definefont [rasterfont] [Serif at 5pt]
+
+%D \macros
+%D {infofont}
+%D
+%D The second situation occurs when we enable the info mode,
+%D and put all kind of status information in the margin. We
+%D don't want huge switches to the main bodyfont and style, so
+%D here too we use a direct method.
+
+% old mechanism
+%
+% \def\infofont{\getvalue{\!!sixpoint\c!tt\c!tf}\the\everybodyfont}
+
+\let\infofont\relax % satisfy dep checker
+
+\definefont [infofont] [Mono at 6pt] % todo \the\everybodyfont
+
+%D \macros
+%D {definealternativestyle}
+%D
+%D In the main modules we are going to implement lots of
+%D parameterized commands and one of these parameters will
+%D concern the font to use. To suit consistent use of fonts we
+%D here implement a mechanism for defining the keywords that
+%D present a particular style or alternative.
+%D
+%D \starttyping
+%D \definealternativestyle [keywords] [\style] [\nostyle]
+%D \stoptyping
+%D
+%D The first command is used in the normal textflow, while the
+%D second command takes care of headings and alike. Consider
+%D the next two definitions:
+%D
+%D \starttyping
+%D \definealternativestyle [bold] [\bf] []
+%D \definealternativestyle [cap] [\cap] [\cap]
+%D \stoptyping
+%D
+%D A change \type{\bf} in a heading which is to be set in
+%D \type{\tfd} does not look that well, so therefore we leave
+%D the second argument of \type{\definealternativestyle} empty.
+%D When we capatalize characters using the pseudo small cap
+%D command \type{\cap}, we want this to take effect in both
+%D text and headings, which is accomplished by assigning both
+%D arguments.
+
+\def\dodefinealternativestyle[#1][#2][#3]%
+ {\def\docommand##1%
+ {\doifundefined{##1}{\setvalue{##1}{\groupedcommand{#2}{}}}%
+ \setvalue{\@letter@ ##1}{#2}%
+ \setvalue{\@noletter@##1}{#3}}%
+ \processcommalist[#1]\docommand}
+
+\def\definealternativestyle
+ {\dotripleempty\dodefinealternativestyle}
+
+\def\definestyle{\definealternativestyle}
+
+%D Maybe too geneneric, but probably ok is the following. (Maybe one
+%D day we will use a dedicated grouped command for styles.)
+
+\appendtoks
+ \let\groupedcommand\thirdofthreearguments
+\to \simplifiedcommands
+
+%D This command also defines the keyword as command. This means
+%D that the example definition of \type{bold} we gave before,
+%D results in a command \type{\bold} which can be used as:
+%D
+%D \startbuffer
+%D He's a \bold{bold} man with a {\bold head}.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \definealternativestyle[bold][\bf][]\getbuffer
+%D \stopvoorbeeld
+%D
+%D Such definitions are of course unwanted for \type{\cap}
+%D because this would result in an endless recursive call.
+%D Therefore we check on the existance of both the command and
+%D the substitution. The latter is needed because for instance
+%D \type{\type} is an entirely diferent command. That command
+%D handles verbatim, while the style command would just switch
+%D to teletype font. This is just an example of a tricky
+%D naming coincidence.
+
+%D \macros
+%D {doconvertfont,noconvertfont,
+%D dontconvertfont,redoconvertfont}
+%D
+%D After having defined such keywords, we can call for them by
+%D using
+%D
+%D \starttyping
+%D \doconvertfont{keyword}{text}
+%D \stoptyping
+%D
+%D We deliberately pass an argument. This enables us to
+%D assign converters that handle one agrument, like
+%D \type{\cap}.
+%D
+%D By default the first specification is used to set the style,
+%D exept when we say \type{\dontconvertfont}, after which the
+%D second specification is used. We can also directly call for
+%D \type{\noconvertfont}. In nested calls, we can restore the
+%D conversion by saying \type{\redoconvertfont}.
+
+\def\@@dodoconvertfont#1{\csname\@letter@ #1\endcsname}
+\def\@@donoconvertfont#1{\csname\@noletter@#1\endcsname}
+
+\unexpanded\def\dodoconvertfont#1% #2% we need the protection
+ {\doifdefinedelse{\@letter@#1} % in testing
+ {\doifelsenothing{#1}\gobbleoneargument\@@dodoconvertfont}
+ {\doifdefinedelse{#1}\getvalue \firstofoneargument}%
+ {#1}} % {#2}}
+
+\let\doconvertfont\dodoconvertfont
+
+\def\noconvertfont#1% #2%
+ {\doifdefinedelse{\@noletter@#1}
+ {\doifelsenothing{#1}\gobbleoneargument\@@donoconvertfont}\gobbleoneargument
+ {#1}} % {#2}}
+
+%D Extras:
+
+\unexpanded\def\dontconvertfont
+ {\let\doconvertfont\noconvertfont}
+
+\unexpanded\def\redoconvertfont
+ {\let\doconvertfont\dodoconvertfont}
+
+%D These commands are not grouped! Grouping is most probably
+%D done by the calling macro's and would lead to unnecessary
+%D overhead.
+
+%D \macros
+%D {em,emphasistypeface,emphasisboldface}
+%D
+%D The next macro started as a copy of Donald Arseneau's
+%D \type{\em} (\TUGNEWS\ Vol.~3, no.~1, 1994). His
+%D implementation was a bit more sophisticated version of the
+%D standard \LATEX\ one. We furter enhanced the macro, so now
+%D it also adapts itself to boldface mode. Because we favor
+%D {\sl slanted} type over {\it italic}, we made the emphasis
+%D adaptable, for instance:
+%D
+%D \starttyping
+%D \def\emphasistypeface {\it}
+%D \def\emphasisboldface {\bi}
+%D \stoptyping
+%D
+%D But we prefer:
+
+\def\emphasistypeface {\sl}
+\def\emphasisboldface {\bs}
+
+%D or even better:
+
+% \def\doemphasistypeface#1#2%
+% {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!slanted#1%
+% {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!italic #2%
+% {\doifelsevalue{\??ft \normalizedbodyfontsize\c!em}\v!slanted#1%
+% {\doifvalue {\??ft \normalizedbodyfontsize\c!em}\v!italic #2}}}}
+
+\def\doemphasistypeface#1#2%
+ {\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\emphasistypeface{\doemphasistypeface\sl\it}
+\def\emphasisboldface{\doemphasistypeface\bs\bi}
+
+%D To be set with the default body font environment: \type
+%D {em} being \type {slanted} or \type {italic}.
+
+\newconditional\emneeded
+
+\newtoks\everyemphasized
+
+\unexpanded\def\em
+ {\relax
+ \ifdim\slantperpoint>\zeropoint
+ \settrue\emneeded
+ \else
+ \setfalse\emneeded
+ \fi
+ \setemphasisboldface % new
+ \ifx\fontalternative\c!it % \ifnum\fam=\itfam
+ \def\emphasistypeface{\it}\tf
+ \else\ifx\fontalternative\c!sl % \ifnum\fam=\slfam
+ \def\emphasistypeface{\sl}\tf
+ \else\ifx\fontalternative\c!bf % \ifnum\fam=\bffam
+ \emphasisboldface
+ \else\ifx\fontalternative\c!bs % \ifnum\fam=\bsfam
+ \def\emphasisboldface{\bs}\bf
+ \else\ifx\fontalternative\c!bi % \ifnum\fam=\bifam
+ \def\emphasisboldface{\bi}\bf
+ \else
+ \emphasistypeface
+ \fi\fi\fi\fi\fi
+ \the\everyemphasized
+ \ifconditional\emneeded\relax
+ \else
+ \expandafter\aftergroup
+ \fi
+ \emphasiscorrection}
+
+% compare ...
+%
+% \appendtoks \red \to \everyemphasized
+% \setupbodyfontenvironment [default] [em={\italic\color[red]}]
+
+%D The next feature was not present in previous versions. It
+%D takes care of \type {\em \bf ...} sitiations.
+
+\def\setemphasisboldface
+ {\let\normalbf\bf
+ \let\setemphasisboldface\relax
+ \unexpanded\def\bf
+ {%\relax
+ \let\bf\relax % new
+ \ifx\fontalternative\c!it % \ifnum\fam=\itfam
+ \bi
+ \else\ifx\fontalternative\c!sl % \ifnum\fam=\slfam
+ \bs
+ \else
+ \normalbf
+ \fi\fi
+ \let\bf\normalbf}}
+
+%D Donald's (adapted) macros take the next character into
+%D account when placing italic correction. As a bonus we also
+%D look for something that looks like a dash, in which case we
+%D don't correct.
+
+\let\italiccorrection=\/
+
+\def\emphasiscorrection
+ {\ifhmode
+ \expandafter\emphasislook
+ \fi}
+
+\def\emphasislook
+ {\begingroup
+ \beginrobusttest
+ \futurelet\next\emphasistest}
+
+\def\emphasistest
+ {\normalifcat\noexpand\next,%
+ \endrobusttest\expandafter\doemphasiscorrection
+ \normalelse
+ \endrobusttest\expandafter\dododoemphasiscorrection
+ \normalfi}
+
+\def\doemphasiscorrection
+ {\futurelet\next\dodoemphasiscorrection}
+
+\def\dodoemphasiscorrection
+ {\setbox\scratchbox\hbox{\next}%
+ \ifdim\ht\scratchbox=\zeropoint % probably a space
+ \expandafter\dododoemphasiscorrection
+ \else\ifdim\ht\scratchbox<.3ex
+ \expandafter\expandafter\expandafter\endgroup
+ \else
+ \expandafter\expandafter\expandafter\dododoemphasiscorrection
+ \fi\fi}
+
+\def\dododoemphasiscorrection
+ {\scratchskip\lastskip
+ \ifdim\scratchskip=\zeropoint\relax % == \ifzeropt\scratchskip
+ \italiccorrection\relax
+ \else
+ \unskip\italiccorrection\hskip\scratchskip
+ \fi
+ \endgroup}
+
+%D We end with some examples which show the behavior when
+%D some punctuation is met. We also show how the mechanism
+%D adapts itself to bold, italic and slanted typing.
+%D
+%D \startbuffer
+%D test {test}test \par
+%D test {\sl test}test \par
+%D test {\em test}test \par
+%D test {\em test}--test \par
+%D
+%D test {test}, test \par
+%D test {\em test}, test \par
+%D
+%D test {\em test {\em test {\em test} test} test} test \par
+%D test {\bf test {\em test {\em test} test} test} test \par
+%D test {\sl test {\em test {\em test} test} test} test \par
+%D test {\it test {\em test {\em test} test} test} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \startvoorbeeld
+%D \startpacked
+%D \getbuffer
+%D \stoppacked
+%D \stopvoorbeeld
+
+%D \macros
+%D {emphbf,emphit,emphsl,emphtf}
+%D
+%D The next emphasis alternatives are for \THANH. They adapt
+%D their style as good as possible.
+
+\def\emphbf{\groupedcommand{\bf\def\emphit{\bi}\def\emphsl{\bs}}{}}
+\def\emphit{\groupedcommand{\it\def\emphbf{\bi}\def\emphsl{\sl}}{}}
+\def\emphsl{\groupedcommand{\sl\def\emphbf{\bs}\def\emphit{\it}}{}}
+\def\emphtf{\groupedcommand{\tf\def\emphbf{\bf}\def\emphit{\it}\def\emphsl{\sl}}{}}
+
+%D \startbuffer
+%D TEXT {\emphbf text \emphit text \emphtf text \emphsl text} TEXT
+%D TEXT \emphbf{text \emphit{text} \emphtf{text} \emphsl{text}} TEXT
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+%D \macros
+%D {setfont}
+%D
+%D Every now and then we want to define a font directly, for
+%D instance when we typeset title pages. The next macro saves
+%D some typing:
+
+\def\setfont% geen \dosetfont mogelijk
+ {\def\next{\nextfont\setupinterlinespace}%
+ \afterassignment\next\font\nextfont=}
+
+%D One can call this macro as:
+%D
+%D \starttyping
+%D \setfont cmr10 at 60pt
+%D \stoptyping
+%D
+%D After which the font is active and the baselines and
+%D struts are set.
+
+%D \macros
+%D {showbodyfont}
+%D
+%D One can call for a rather simple overview of a bodyfont and the
+%D relations between its alternative fonts.
+%D
+%D \showsetup{showbodyfont}
+%D
+%D The current bodyfont (here we omitted the argument) looks like:
+%D
+%D \showbodyfont
+%D
+%D The implementation is rather straightforward in using
+%D \type{\halign}.
+
+\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run}
+
+%D \macros
+%D {showfontstrip, testminimalbaseline, showminimalbaseline}
+%D
+%D The next command can come in handy when combining
+%D different fonts into a collection (typeface) and
+%D determining optimal baseline distances.
+%D
+%D \showfontstrip \blank \showminimalbaseline
+
+\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run}
+
+%D \macros
+%D {showkerning}
+%D
+%D A goody is:
+%D
+%D \showkerning{Can you guess what kerning is?}
+
+\fetchruntimecommand \showkerning {\f!fontprefix\s!run}
+
+%D \macros
+%D {showbodyfontenvironment}
+%D
+%D The current bodyfontenvironment is:
+%D
+%D \showbodyfontenvironment
+%D
+%D This overview is generated using:
+%D
+%D \showsetup{showbodyfontenvironment}
+
+\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run}
+
+%D \macros
+%D {showfont,showfontstyle,showligatures}
+%D
+%D The following command generates a fontmap:
+%D
+%D \startbuffer
+%D \showfont[SansBold at 12pt]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Below the table the name, encoding, mapping and handling are
+%D shown. Special characters like the \type {\skewchar} and
+%D \type {\hyphenchar} als marked.
+%D
+%D \getbuffer
+
+% 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}
+
+%D \macros
+%D {getglyph, symbolicfont}
+%D
+%D Individual glyphs can be accessed by using
+%D
+%D \starttyping
+%D \getglyph{fontname}{character}
+%D \stoptyping
+%D
+%D This macro is used in for instance the symbol modules and
+%D as one can see, it does obey the small and even smaller
+%D sizes. The \type {\symbolicfont} macro can be used to
+%D switch to a font named \type {fontname} (see \type
+%D {cont-log} and \type {symb-eur} for examples of symbolic
+%D definitions.
+
+\def\fontstringA
+ {\ifx\fontstyle\c!rm \s!Serif \else
+ \ifx\fontstyle\c!ss \s!Sans \else
+ \ifx\fontstyle\c!tt \s!Mono \else
+ \s!Serif \fi\fi\fi}
+
+\def\fontstringB
+ {\ifx\fontstyle\c!rm \s!Regular \else
+ \ifx\fontstyle\c!ss \s!Support \else
+ \ifx\fontstyle\c!tt \s!Type \else
+ \s!Serif \fi\fi\fi}
+
+\def\fontstringC
+ {\ifx\fontalternative\c!bf \s!Bold \else
+ \ifx\fontalternative\c!sl \s!Slanted \else
+ \ifx\fontalternative\c!it \s!Italic \else
+ \ifx\fontalternative\c!bs \s!BoldSlanted \else
+ \ifx\fontalternative\c!bi \s!BoldItalic \fi\fi\fi\fi\fi}
+
+\def\fontstringD % default fontstyle
+ {\expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!rm \s!Serif \else
+ \expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!ss \s!Sans \else
+ \expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!tt \s!Mono \else
+ \s!Serif \fi\fi\fi}
+
+% potential generalization:
+
+% \letvalue{\??ff:t:\c!rm}\s!Serif
+% \letvalue{\??ff:t:\c!ss}\s!Sans
+% \letvalue{\??ff:t:\c!tt}\s!Mono
+%
+% \letvalue{\??ff:s:\c!bf}\s!Bold
+% \letvalue{\??ff:s:\c!sl}\s!Slanted
+% \letvalue{\??ff:s:\c!it}\s!Italic
+% \letvalue{\??ff:s:\c!bs}\s!BoldSlanted
+% \letvalue{\??ff:s:\c!bi}\s!BoldItalic
+%
+% \letvalue{\??ff:a:\c!rm}\s!Regular
+% \letvalue{\??ff:a:\c!ss}\s!Support
+% \letvalue{\??ff:a:\c!tt}\s!Type
+%
+% \def\fontstringA{\executeifdefined{\??ff:t:\fontstyle}\s!Serif}
+% \def\fontstringB{\executeifdefined{\??ff:a:\fontstyle}\s!Serif}
+% \def\fontstringC{\executeifdefined{\??ff:s:\fontstyle}\empty}
+% \def\fontstringD{\executeifdefined{\??ff:t:\csname\??tf\fontclass\s!default\endcsname}\s!Serif}
+
+\def\glyphfontfile#1%
+ {#1%
+ \ifcsname\??ff#1\fontstringA\fontstringC\endcsname
+ \fontstringA\fontstringC
+ \else\ifcsname\??ff#1\fontstringB\fontstringC\endcsname
+ \fontstringB\fontstringC
+ \else\ifcsname\??ff#1\fontstringA\endcsname
+ \fontstringA
+ \else\ifcsname\??ff#1\fontstringB\endcsname
+ \fontstringB
+ \else\ifcsname\??ff#1\fontstringC\endcsname
+ \fontstringC
+ \fi\fi\fi\fi\fi}
+
+%D The next macro can be used to make decisions based on the shape:
+
+\def\doifitalicelse#1#2%
+ {\ifx\fontalternative\c!sl#1\else
+ \ifx\fontalternative\c!it#1\else
+ \ifx\fontalternative\c!bs#1\else
+ \ifx\fontalternative\c!bi#1\else#2\fi\fi\fi\fi}
+
+%D For an example of usage of the following command,
+%D see \type {cont-log.tex}.
+%D
+%D \starttyping
+%D \def\symbolicfont#1%
+%D {\definedfont[\glyphfontfile{#1} sa *]}
+%D \stoptyping
+%D
+%D Since we know what scaling it to be applied, we can
+%D implement a much faster alternative:
+
+\let\thedefinedfont\relax
+
+% \def\symbolicscaledfont#1#2%
+% {\scaledfont\fontbody
+% \scaledfont#1\scaledfont
+% \font\thedefinedfont\truefontname{\glyphfontfile{#2}} at
+% \currentfontbodyscale\scaledfont
+% \thedefinedfont}
+%
+% \unexpanded\def\symbolicfont
+% {\symbolicscaledfont\plusone}
+%
+% even more control (needed for mthsqrt etc)
+
+\def\symbolicsizedfont#1#2#3%
+ {\scaledfont#1%
+ \scaledfont#2\scaledfont
+ \font\thedefinedfont\truefontname{\glyphfontfile{#3}} at
+ \currentfontbodyscale\scaledfont
+ \thedefinedfont}
+
+\def\symbolicscaledfont
+ {\symbolicsizedfont\fontbody}
+
+\unexpanded\def\symbolicfont
+ {\symbolicsizedfont\fontbody\plusone}
+
+\unexpanded\def\getglyph#1#2% slow, faster, much faster
+ %{{\definefont[\s!dummy][\glyphfontfile{#1} sa \currentfontscale]\dummy#2}}
+ %{{\definefont[\s!dummy][\glyphfontfile{#1} sa *]\dummy#2}}
+ %{{\symbolicfont{#1}#2}}
+ {{\symbolicfont{#1}\doifnumberelse{#2}\char\donothing#2}}
+
+\unexpanded\def\getscaledglyph#1#2#3%
+ {{\symbolicscaledfont{#1}{#2}\doifnumberelse{#3}\char\donothing#3}}
+
+\unexpanded\def\getrawglyph#1#2% for simple symbols
+ {{\scaledfont\fontbody
+ \font\thedefinedfont=#1 at \currentfontbodyscale\scaledfont
+ \thedefinedfont\doifnumberelse{#2}\char\donothing#2}}
+
+%D The last implementation of \type {\getglyph} permits
+%D definitions like:
+%D
+%D \starttyping
+%D \definefontsynonym [EuroSans] [eurose]
+%D \definefontsynonym [EuroSansBold] [euroseb]
+%D \definefontsynonym [EuroSansItalic] [eurosei]
+%D \definefontsynonym [EuroSansSlanted] [eurosei]
+%D \definefontsynonym [EuroSansBoldItalic] [eurosebi]
+%D \definefontsynonym [EuroSansBoldSlanted] [eurosebi]
+%D
+%D \definesymbol [euro] [\getglyph{Euro}{\char160}]
+%D
+%D \def\euro{\symbol[euro]}
+%D \stoptyping
+%D
+%D These definitions guarantee that the next calls work okay:
+%D
+%D \starttyping
+%D \ss \tf\euro \bf\euro \sla\euro \itd\euro \bs\euro \bic\euro
+%D \stoptyping
+%D
+%D The shape as well as the size is adapted to the current
+%D environment.
+
+%D Fonts can only be used when loaded. In \CONTEXT\ we
+%D postpone the loading of fonts, even when we load \PLAIN.
+%D This means that we have to redefine one of the \PLAIN\
+%D macros. Let's tell that to the user first:
+
+\writestatus{loading}{Postponed Plain TeX Font Definitions}
+
+%D \macros
+%D {bordermatrix}
+%D
+%D In \PLAIN\ \TEX\ the width of a parenthesis is stored in
+%D the \DIMENSION\ \type{\p@renwd}. This value is derived from
+%D the width of \type{\tenrm B}, so let's take care of it now:
+
+\let\normalbordermatrix=\bordermatrix
+
+\def\bordermatrix%
+ {\bgroup
+ \setbox0\hbox{\getvalue{\textface\c!mm\c!ex}B}%
+ \global\p@renwd\wd0\relax
+ \egroup
+ \normalbordermatrix}
+
+%D Because we want to be as \PLAIN\ compatible as possible, we
+%D make most of \PLAIN's font mechanisme available to the
+%D \CONTEXT\ user.
+
+\def\setplainfonts#1#2%
+ {\setvalue {ten#1}{\getvalue{\!!tenpoint #2}}%
+ \setvalue{seven#1}{\getvalue{\!!sevenpoint#2}}%
+ \setvalue {five#1}{\getvalue{\!!fivepoint #2}}}
+
+\setplainfonts {\c!rm} {\c!rm\c!tf}
+\setplainfonts {\c!bf} {\c!rm\c!bf}
+\setplainfonts {\c!sl} {\c!rm\c!sl}
+\setplainfonts {\c!it} {\c!rm\c!it}
+\setplainfonts {\c!tt} {\c!rm\c!tt}
+\setplainfonts {\c!sy} {\c!mm\c!sy}
+\setplainfonts {\c!ex} {\c!mm\c!ex}
+\setplainfonts {\c!i} {\c!mm\c!mi}
+
+\let\setplainfonts=\undefined
+
+%D \macros
+%D {ss, SS, sz}
+%D
+%D We are going to redefine \type{\ss} but for those wo still
+%D want to have access to the german \SS, we save it's value in
+%D \type{\SS}. Ok, I should have used \type{\sf} instead of
+%D \type{\ss} in the first place.
+
+\ifx\undefined\SS \let\SS=\ss \fi
+\ifx\undefined\sz \let\sz=\ss \fi
+
+%D \macros
+%D {xi}
+%D
+%D We are going to redefine \type{\xi}, but fortunately this
+%D is a math mode character, so we can just say:
+
+\let\normalxi=\xi
+
+%D \macros
+%D {smashaccent}
+%D
+%D When we let \TEX\ put an accent on top of a character, such
+%D composed characters can get more height that height of a
+%D standard \type{\strut}. The next macro takes care of such
+%D unwanted compositions.
+%D
+%D We need to reach over the number that specifies the accent,
+%D and in doing so we use \type{\scratchcounter} as a placeholder
+%D because it accepts 8 bit numbers in octal, decimal or
+%D hexadecimal format. Next we set the height of the accented
+%D character to the natural height of the character.
+
+\unexpanded\def\smashaccent#1%
+ {\dontleavehmode
+ \bgroup
+ \setbox\scratchbox\hbox{#1}%
+ \ifdim\ht\scratchbox>\strutheight\relax\ht\scratchbox\strutheight\fi
+ \ifdim\dp\scratchbox>\strutdepth \relax\dp\scratchbox\strutdepth \fi
+ \box\scratchbox
+ \egroup}
+
+%D For instance we can say:
+%D
+%D \starttyping
+%D \smashaccent{\"Uberhaupt}
+%D \stoptyping
+%D
+%D But normally one will use it as a prefix in definitions.
+%D The difference is in the height:
+%D
+%D \leavevmode\ruledhbox
+%D {\ruledhbox{\smashaccent{\"U}berhaupt}\quad
+%D oder\quad
+%D \ruledhbox{\"Uberhaupt}}
+
+%D \macros
+%D {moveaccent}
+%D
+%D Exact positioning of accents can be realized by saying:
+%D
+%D \starttyping
+%D \moveaccent{-.1ex}{\"u}berhaupt
+%D \stoptyping
+%D
+%D Again, this one will mostly used as a prefix in definitions.
+%D Here the difference is in the position:
+%D
+%D \leavevmode\ruledhbox
+%D {\ruledhbox{\moveaccent{-.1ex}{\"}Uberhaupt}\quad
+%D oder\quad
+%D \ruledhbox{\"Uberhaupt}}
+
+\unexpanded\def\moveaccent#1#2%
+ {\smashaccent
+ {\dimen0\exheight
+ \dimen2\dimen0
+ \advance\dimen2 -#1%
+ \exheight\dimen2
+ #2\relax
+ \exheight\dimen0}}
+
+%D Personally I think that using \TEX\ is complicated by the
+%D way fonts are handled. Apart from the many encodings, we
+%D also deal with different naming schemes. Confronted with
+%D this problem, I decided to change the definitions into:
+%D
+%D \starttyping
+%D \definebodyfont [12pt] [rm] [tf=Times-Roman at 12pt]
+%D \stoptyping
+%D
+%D combined with for instance:
+%D
+%D \starttyping
+%D \definefontsynonym [Times-Roman] [tir]
+%D \stoptyping
+
+%D Now we're up to some definitions.
+
+\definebodyfontenvironment
+ [\s!default]
+ [ \s!text=1.0,
+ \s!script=0.7,
+ \s!scriptscript=0.5,
+ \c!a=1.200,
+ \c!b=1.440,
+ \c!c=1.728,
+ \c!d=2.074,
+ *=\currentfontscale, % wildcard
+ \c!x=0.8,
+ \c!xx=0.6,
+ \c!big=1.2,
+ \c!small=0.8,
+ \c!interlinespace=,
+ \c!em=\v!slanted]
+
+\definebodyfontenvironment
+ [20.7pt]
+ [ \s!text=20.7pt,
+ \s!script=\!!fourteenpointfour,
+ \s!scriptscript=\!!twelvepoint,
+ \c!x=17.3pt,
+ \c!xx=\!!fourteenpointfour,
+ \c!big=20.7pt, % !!!!
+ \c!small=17.3pt]
+
+\definebodyfontenvironment
+ [17.3pt]
+ [ \s!text=17.3pt,
+ \s!script=\!!twelvepoint,
+ \s!scriptscript=\!!tenpoint,
+ \c!x=\!!fourteenpointfour,
+ \c!xx=\!!twelvepoint,
+ \c!big=20.7pt,
+ \c!small=\!!fourteenpointfour]
+
+\definebodyfontenvironment
+ [\!!fourteenpointfour]
+ [ \s!text=\!!fourteenpointfour,
+ \s!script=\!!elevenpoint,
+ \s!scriptscript=\!!ninepoint,
+ \c!x=\!!twelvepoint,
+ \c!xx=\!!tenpoint,
+ \c!big=17.3pt,
+ \c!small=\!!twelvepoint]
+
+\definebodyfontenvironment
+ [\!!twelvepoint]
+ [ \s!text=\!!twelvepoint,
+ \s!script=\!!ninepoint,
+ \s!scriptscript=\!!sevenpoint,
+ \c!x=\!!tenpoint,
+ \c!xx=\!!eightpoint,
+ \c!big=\!!fourteenpointfour,
+ \c!small=\!!tenpoint]
+
+\definebodyfontenvironment
+ [\!!elevenpoint]
+ [ \s!text=\!!elevenpoint,
+ \s!script=\!!eightpoint,
+ \s!scriptscript=\!!sixpoint,
+ \c!x=\!!ninepoint,
+ \c!xx=\!!sevenpoint,
+ \c!big=\!!twelvepoint,
+ \c!small=\!!ninepoint]
+
+\definebodyfontenvironment
+ [\!!tenpoint]
+ [ \s!text=\!!tenpoint,
+ \s!script=\!!sevenpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!eightpoint,
+ \c!xx=\!!sixpoint,
+ \c!big=\!!twelvepoint,
+ \c!small=\!!eightpoint]
+
+\definebodyfontenvironment
+ [\!!ninepoint]
+ [ \s!text=\!!ninepoint,
+ \s!script=\!!sevenpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sevenpoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!elevenpoint,
+ \c!small=\!!sevenpoint]
+
+\definebodyfontenvironment
+ [\!!eightpoint]
+ [ \s!text=\!!eightpoint,
+ \s!script=\!!sixpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sixpoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!tenpoint,
+ \c!small=\!!sixpoint]
+
+\definebodyfontenvironment
+ [\!!sevenpoint]
+ [ \s!text=\!!sevenpoint,
+ \s!script=\!!sixpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sixpoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!ninepoint,
+ \c!small=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!sixpoint]
+ [ \s!text=\!!sixpoint,
+ \s!script=\!!fivepoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!fivepoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!eightpoint,
+ \c!small=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!fivepoint]
+ [ \s!text=\!!fivepoint,
+ \s!script=\!!fivepoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!fivepoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!sevenpoint,
+ \c!small=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!fourpoint]
+ [ \s!text=\!!fourpoint,
+ \s!script=\!!fourpoint,
+ \s!scriptscript=\!!fourpoint,
+ \c!x=\!!fourpoint,
+ \c!xx=\!!fourpoint,
+ \c!big=\!!sixpoint,
+ \c!small=\!!fourpoint]
+
+\definebodyfontswitch [fourteenpointfour] [\!!fourteenpointfour]
+\definebodyfontswitch [twelvepoint] [\!!twelvepoint]
+\definebodyfontswitch [elevenpoint] [\!!elevenpoint]
+\definebodyfontswitch [tenpoint] [\!!tenpoint]
+\definebodyfontswitch [ninepoint] [\!!ninepoint]
+\definebodyfontswitch [eightpoint] [\!!eightpoint]
+\definebodyfontswitch [sevenpoint] [\!!sevenpoint]
+\definebodyfontswitch [sixpoint] [\!!sixpoint]
+\definebodyfontswitch [fivepoint] [\!!fivepoint]
+\definebodyfontswitch [fourpoint] [\!!fourpoint]
+
+\definebodyfontswitch [xii] [\!!twelvepoint]
+\definebodyfontswitch [xi] [\!!elevenpoint]
+\definebodyfontswitch [x] [\!!tenpoint]
+\definebodyfontswitch [ix] [\!!ninepoint]
+\definebodyfontswitch [viii] [\!!eightpoint]
+\definebodyfontswitch [vii] [\!!sevenpoint]
+\definebodyfontswitch [vi] [\!!sixpoint]
+
+%D So far.
+
+\definefontstyle [\c!rm,\v!roman,\v!serif,\v!regular] [\c!rm]
+\definefontstyle [\c!ss,\v!sansserif,\v!sans,\v!support] [\c!ss]
+\definefontstyle [\c!tt,\v!teletype,\v!type,\v!mono] [\c!tt]
+\definefontstyle [\c!hw,\v!handwritten] [\c!hw]
+\definefontstyle [\c!cg,\v!calligraphic] [\c!cg]
+
+\definefontsize[\c!a] \definefontsize[\c!b]
+\definefontsize[\c!c] \definefontsize[\c!d]
+
+\definealternativestyle [\v!mediaeval] [\os] []
+\definealternativestyle [\v!normal] [\tf] []
+\definealternativestyle [\v!bold] [\bf] []
+\definealternativestyle [\v!type] [\tt] []
+\definealternativestyle [\v!mono] [\tt] []
+\definealternativestyle [\v!slanted] [\sl] []
+\definealternativestyle [\v!italic] [\it] []
+\definealternativestyle [\v!boldslanted,\v!slantedbold] [\bs] []
+\definealternativestyle [\v!bolditalic,\v!italicbold] [\bi] []
+\definealternativestyle [\v!small,\v!smallnormal] [\tfx] []
+\definealternativestyle [\v!smallbold] [\bfx] []
+\definealternativestyle [\v!smalltype] [\ttx] []
+\definealternativestyle [\v!smallslanted] [\slx] []
+\definealternativestyle [\v!smallboldslanted,\v!smallslantedbold] [\bsx] []
+\definealternativestyle [\v!smallbolditalic,\v!smallitalicbold] [\bix] []
+
+\definealternativestyle [\v!sans,\v!sansserif] [\ss] []
+\definealternativestyle [\v!sansbold] [\ss\bf] []
+
+%D Slow but handy:
+
+\definealternativestyle [\v!smallbodyfont] [\setsmallbodyfont] []
+\definealternativestyle [\v!bigbodyfont] [\setbigbodyfont] []
+
+%D We treat {\sc Small Caps} and \cap {Pseudo Caps} a bit
+%D different. We also provide an \WORD {uppercase} style.
+
+\definealternativestyle [\v!cap,\v!capital] [\smallcapped] [\smallcapped]
+\definealternativestyle [\v!smallcaps] [\sc] [\sc]
+\definealternativestyle [\v!WORD] [\WORD] [\WORD]
+
+%D \macros
+%D {...math}
+%D
+%D New or old?
+
+% tzt proper \define...
+%
+% watch out: \synchronizesymb resets the family so we need a second
+% \mf (or maybe \mr): messy and to be sorted out
+
+\def\tfmath{\tf\mf\synchronizesymb\mf}
+\def\bfmath{\bf\mf\synchronizesymb\mf}
+\def\slmath{\sl\mf\synchronizesymb\mf}
+\def\itmath{\it\mf\synchronizesymb\mf}
+\def\bsmath{\bs\mf\synchronizesymb\mf}
+\def\bimath{\bi\mf\synchronizesymb\mf}
+\def\scmath{\sc\mf\synchronizesymb\mf}
+\def\nnmath{\nn\mf\synchronizesymb\mf}
+
+\def\textmath {\synchronizesymb}
+
+%D \macros
+%D {fontstylesuffix}
+%D
+%D The next macro is used to map non latin fontnames on
+%D fonts. See \type {font-uni} for an example of its use.
+
+%\def\fontstylesuffix%
+% {\ifnum\fam=\tffam \s!Regular \else
+% \ifnum\fam=\bffam \s!Bold \else
+% \ifnum\fam=\slfam \s!Slanted \else
+% \ifnum\fam=\itfam \s!Italic \else
+% \ifnum\fam=\bsfam \s!BoldSlanted \else
+% \ifnum\fam=\bifam \s!BoldItalic \else
+% \s!Regular \fi\fi\fi\fi\fi\fi}%
+
+\def\fontstylesuffix% why the \s!Regular ? see \getglyph
+ {\ifx\fontalternative\c!tf \s!Regular \else
+ \ifx\fontalternative\c!bf \s!Bold \else
+ \ifx\fontalternative\c!sl \s!Slanted \else
+ \ifx\fontalternative\c!it \s!Italic \else
+ \ifx\fontalternative\c!bs \s!BoldSlanted \else
+ \ifx\fontalternative\c!bi \s!BoldItalic \else
+ \ifx\fontalternative\c!sc \s!Caps \else
+ \s!Regular \fi\fi\fi\fi\fi\fi\fi}%
+
+%D We still have to take care of \type{\xi}, so:
+
+\def\xi{\ifmmode\normalxi\else\elevenpoint\fi}
+
+%D \macros
+%D {definefontvariant,fontvariant,variant}
+%D
+%D A slightly adapted version of Adam Lindsays variant patches:
+%D
+%D \starttyping
+%D \usetypescriptfile[type-psc] \loadmapfile[texnansi-public-fpl]
+%D \usetypescript[palatino][texnansi] \setupbodyfont[palatino]
+%D
+%D \definefontvariant [Serif][osf] [OsF]
+%D
+%D \startlines
+%D {\sc abcdefgHIJKlmnop}
+%D 123{\Var[osf]456}789
+%D {\Var[osf] 123{\Var[reset]456}789}
+%D {\it 123{\Var[osf]456}789
+%D {\Var[osf]123{\Var[reset]456}789}}
+%D {\tfb\bf 123{\Var[osf]456}789
+%D {\Var[osf] 123{\Var[reset]456}789}}
+%D {\sc 123{\Var[osf]456}789
+%D {\Var[osf] 123{\Var[reset]456}789}}
+%D \stoplines
+%D \stoptyping
+
+\def\definefontvariant
+ {\dotripleargument\dodefinefontvariant}
+
+\def\dodefinefontvariant[#1][#2][#3]%
+ {\setvalue{\??fv#1#2}{#3}}
+
+\def\fontvariant#1#2{\executeifdefined{\??fv#1#2}\empty}
+
+% original:
+%
+% \def\variant[#1]%
+% {\expanded{\definedfont
+% [\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
+% at \currentfontscale\bodyfontsize]}}
+%
+% \beginXETEX \font
+%
+% \def\variant[#1]%
+% {\font\variantfont\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
+% at \currentfontscale\bodyfontsize
+% \variantfont}
+%
+% \endXETEX
+%
+% better
+
+\def\dosetscaledfont
+ {\checkrelativefontsize\fontstyle
+ \scaledfont\currentfontscale\bodyfontsize
+ \scaledfont\relativefontsize\scaledfont}
+
+\unexpanded\def\variant[#1]% slow
+ {\dosetscaledfont
+ \expanded{\definedfont
+ [\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
+ at \scaledfont]}%
+ \ignoreimplicitspaces}
+
+\beginXETEX \font
+
+ \unexpanded\def\variant[#1]%
+ {\dosetscaledfont
+ \font\variantfont\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
+ at \scaledfont
+ \variantfont}
+
+\endXETEX
+
+\ifx\Var\undefined \let\Var\variant \fi
+
+%D By default we load the Computer Modern Roman fonts (but
+%D not yet at this moment) and activate the 12pt roman
+%D bodyfont. Sans serif and teletype are also available and
+%D can be called for by \type{\ss} and \type{\tt}.
+
+\setupbodyfont [unk, rm]
+
+%D Also needed is:
+
+\definefont[tinyfont][Mono at 1ex]
+
+%D \macros
+%D {doiffontpresentelse}
+%D
+%D Some unused left||overs:
+%D
+%D \starttyping
+%D \def\doiffontpresentelse#1#2#3%
+%D {\bgroup
+%D \batchmode\font\dummy=\truefontname{#1}\errorstopmode
+%D \edef\lastfontname{\fontname\dummy}%
+%D \ifx\lastfontname\nullfontname\egroup#3\else\egroup#2\fi}
+%D
+%D \def\abortiffontnotfound#1%
+%D {\doiffontpresentelse{#1}{}{\showmessage\m!fonts{10}{\truefontname{#1}}\endinput}}
+%D \stoptyping
+%D
+%D We now provide (slow, but sometimes handy):
+%D
+%D \starttyping
+%D \doiffontpresentelse{texnansi-lmr10}{YES}{NO}
+%D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO}
+%D \stoptyping
+
+\def\doiffontpresentelse#1%
+ {\bgroup
+ \scratchcounter\interactionmode
+ \batchmode
+ \font\dummy=\truefontname{#1}\relax
+ \interactionmode\scratchcounter
+ \edef\lastfontname{\fontname\dummy}%
+ \ifx\lastfontname\nullfontname
+ \egroup\expandafter\secondoftwoarguments
+ \else
+ \egroup\expandafter\firstoftwoarguments
+ \fi}
\protect \endinput
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
index 2c820fcc9..3e2e57145 100644
--- a/tex/context/base/font-ini.mkiv
+++ b/tex/context/base/font-ini.mkiv
@@ -1,6 +1,7 @@
%D \module
%D [ file=font-ini,
-%D version=2007.01.10,
+%D version=1998.09.11, % (second)
+%D version=2001.02.20, % (third)
%D title=\CONTEXT\ Font Macros,
%D subtitle=Initialization,
%D author=Hans Hagen,
@@ -11,6 +12,14 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+
+% \rm\bf --> \song
+% \rm\it --> \kai
+% \ss\it --> \kai
+% \tt\bf --> \hei
+
+\writestatus{loading}{Context Font Macros (ini)}
+
\registerctxluafile{font-ini}{1.001}
\registerctxluafile{font-enc}{1.001}
\registerctxluafile{font-map}{1.001}
@@ -22,107 +31,4624 @@
\registerctxluafile{font-def}{1.001}
\registerctxluafile{font-fbk}{1.001}
\registerctxluafile{font-ext}{1.001}
-
-% \startruntimectxluacode
-% fonts.enc.make_unicode_vector() -- each time, brrr
-% \stopruntimectxluacode
+\registerctxluafile{font-pat}{1.001}
\unprotect
-\def\mkdefinefontfeature#1#2#3%
- {\ctxlua{fonts.define.specify.preset_context("#1","#2","#3")}}
+% \def\fontrange#1%
+% {\dofontrange{#1 =\bodyfontsize}}
+%
+% \def\dofontrange#1%
+% {\dodofontrange#1 \relax}% \fontstringA
+%
+% \def\dodofontrange#1 #2 %
+% {\ifdim\bodyfontsize#2%
+% #1\expandafter\gobbleuntilrelax
+% \else
+% \expandafter\dodofontrange
+% \fi}
+%
+% \definefont
+% [crap]
+% [\fontrange
+% {Regular <10pt
+% RegularBold <12pt
+% RegularSlanted <15pt
+% Regular} sa 1]
+%
+% may be better:
+%
+% \definefontrange
+% [crap]
+% [Regular <10pt
+% RegularBold <12pt
+% RegularSlanted <15pt]
+% [Regular sa 1]
+%
+%
+% \dostepwiserecurse{2}{15}{1}
+% {{\switchtobodyfont[\recurselevel pt]\crap test}\endgraf}
+
+% adapted, else wrong interlinespace
-% handy for manuals
+\def\setfontparameters
+ {\synchronizefontsfalse
+ \the\everybodyfont
+ \synchronizefontstrue}
+
+% handy
-\def\otfchar#1{\ctxlua{fonts.otf.char("#1")}}
+\newcounter\pushedfont
-%D: We cannot yet inherit because no colors are predefined.
+\def\savefont
+ {\edef\savedfont{\the\font}%
+ \pushmacro\savedfont}
-\definecolor[font:init][r=.75]
-\definecolor[font:medi][g=.75]
-\definecolor[font:fina][b=.75]
-\definecolor[font:isol][y=.75]
-\definecolor[font:mark][m=.75]
-\definecolor[font:rest][c=.75]
+\def\restorefont
+ {\popmacro\savedfont
+ \savedfont}
-%D goodies:
+\def\pushcurrentfont
+ {\edef\popcurrentfont
+ {\noexpand\def\noexpand\fontbody{\fontbody}%
+ \noexpand\def\noexpand\fontstyle{\fontstyle}%
+ \noexpand\dosetcurrentfontalternative{\fontalternative}%
+ \noexpand\dosetcurrentfontsize{\fontsize}%
+ \noexpand\synchronizefont}}
+
+% \definetypeface[one][rm][serif][computer-roman][default]
+% \definetypeface[two][rm][serif][computer-roman][default][rscale=.9]
+%
+% {\one \bf test \two test}
+% {\one \bf test \pushcurrentfont \two \popcurrentfont test}
+
+%D \macros
+%D {definedfont,startfont,doiffontcharelse}
+%D
+%D A couple of relatively new macros:
+
+\newevery \everydefinedfont \relax % not ot be confused with \everydefinefont
+
+\def\dodefinedfont[#1]%
+ {\iffirstargument\definefont[thedefinedfont][#1]\fi
+ \csname thedefinedfont\endcsname
+ \the\everydefinedfont}
+
+\unexpanded\def\definedfont
+ {\dosingleempty\dodefinedfont}
+
+\unexpanded\def\startfont
+ {\bgroup\definedfont}
+
+\def\stopfont
+ {\egroup}
+
+\def\doiffontcharelse#1#2%
+ {\bgroup
+ \definedfont[#1]%
+ \iffontchar\font#2\relax
+ \egroup\expandafter\firstoftwoarguments
+ \else
+ \egroup\expandafter\secondoftwoarguments
+ \fi}
+
+%%% message 14 added
+
+\startmessages dutch library: fonts
+ title: korps
+ 1: codering --
+ 2: variant -- wordt geladen
+ 3: onbekende variant --
+ 4: korps -- is niet gedefinieerd
+ 5: stijl -- is niet gedefinieerd
+ 6: -- wordt geladen
+ 7: onbekend formaat --
+ 8: stijl -- gedefinieerd
+% 9: mapping -- is geladen
+ 10: onbekende font file --
+ 14: korps -- is gedefinieerd (kan beter globaal plaatsvinden)
+\stopmessages
+
+\startmessages english library: fonts
+ title: bodyfont
+ 1: coding --
+ 2: variant -- is loaded
+ 3: unknown variant --
+ 4: bodyfont -- is not defined
+ 5: style -- is not defined
+ 6: -- is loaded
+ 7: unknown format --
+ 8: style -- defined
+% 9: mapping -- is loaded
+ 10: unknown font file --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages german library: fonts
+ title: Fliesstext
+ 1: Kodierung --
+ 2: Variante -- ist geladen
+ 3: Unbekannte Variante --
+ 4: Fliesstext -- ist nicht definiert
+ 5: Stil -- ist nicht definiert
+ 6: -- ist geladen
+ 7: unbekanntes Format --
+ 8: Stil -- definiert
+% 9: Map -- ist geladen
+ 10: unbekanntes Font --
+ 14: Fliesstext -- wurde definiert (besser waere globale Definition)
+\stopmessages
+
+\startmessages czech library: fonts
+ title: zakladnifont
+ 1: kodovani --
+ 2: varianta -- je nactena
+ 3: neznama varianta --
+ 4: zakladni font -- neni definovan
+ 5: styl -- neni definovan
+ 6: -- je nacten
+ 7: neznamy format --
+ 8: styl -- definovan
+% 9: mapovani -- je nacteno
+ 10: neznamy font --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages italian library: fonts
+ title: font del corpo
+ 1: codifica --
+ 2: variante -- caricata
+ 3: variante sconosciuta --
+ 4: corpo del testo -- non definito
+ 5: stile -- non definito
+ 6: -- caricato
+ 7: formato sconosciuto --
+ 8: stile -- definito
+% 9: mappatura -- caricata
+ 10: file di font sconosciuto --
+ 14: corpo del testo -- definito (sarebbe meglio globale)
+\stopmessages
+
+\startmessages norwegian library: fonts
+ title: hovedfont
+ 1: koding --
+ 2: variant -- er lest inn
+ 3: ukjent variant --
+ 4: hovedfont -- er ikke definert
+ 5: stil -- er ikke definert
+ 6: -- er lest inn
+ 7: ukjent format --
+ 8: stil -- definert
+% 9: avbildning -- er lest inn
+ 10: ukjent fontfil --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages romanian library: fonts
+ title: corp de litere
+ 1: codificarea --
+ 2: varianta -- este incarcata
+ 3: varianta necunoscuta --
+ 4: corpul de litere -- nu este definit
+ 5: stilul -- nu este definit
+ 6: -- este incarcat
+ 7: format necunoscut --
+ 8: stilul -- definit
+% 9: maparea -- este incarcat
+ 10: fisier font necunoscut --
+ 14: bodyfont -- is defined (can better be done global)
+\stopmessages
+
+\startmessages french library: fonts
+ title: corps de texte
+ 1: encodage --
+ 2: la variante -- est chargée
+ 3: variante -- inconnue
+ 4: policecorps -- n'est pas définie
+ 5: le style -- n'est pas défini
+ 6: -- est chargé
+ 7: format -- inconnu
+ 8: style -- défini
+% 9: mapping -- is loaded
+ 10: fichier de police -- inconnu
+ 14: policecorps -- est défini (une définition globale pourrait être plus adéquat)
+\stopmessages
+
+%D This module is one of the oldest modules of \CONTEXT. The
+%D macros below evolved out of the \PLAIN\ \TEX\ macros and
+%D therefore use a similar naming scheme (\type{\rm},
+%D \type{\bf}, etc). This module grew out of our needs. We
+%D started with the \PLAIN\ \TEX\ definitions, generalized the
+%D underlaying macros, and extended those to a level at which
+%D probably no one will ever recognize them.
+%D
+%D In 2001 we ran into a couple of projects where more than
+%D one combined set of fonts was involved in a document. To
+%D make definitions more readable, as well as to overcome the
+%D problem of ever growing file name lists, and also because
+%D we needed to scale fonts relative to each other, the low
+%D level implementation was partly rewritten. Global
+%D font assignments, relative scaling, font classes and alike
+%D were added then. At the same time some macros were made a
+%D bit more readable, and math support was extended to the
+%D larger sizes.
+%D
+%D One important characteristic of the font mechanism presented
+%D here is the postponing of font loading. This makes it
+%D possible to distribute \type{fmt} files without bothering
+%D about the specific breed of \type{tfm} files.
+%D
+%D Another feature implemented here is the massive switching
+%D from roman to {\ss sans serif}, {\tt teletype} or else. This
+%D means one doesn't have to take care of all kind of relations
+%D between fonts.
+%D
+%D \page[bigpreference]
+
+%D \macros
+%D {rm,ss,tt,hw,cg}
+%D
+%D Fonts are defined in separate files. When we define a font,
+%D we distinguish between several styles. In most cases we will
+%D use:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC roman regular serif \NC \type{\rm} \NC\FR
+%D \NC sansserif sans support \NC \type{\ss} \NC\MR
+%D \NC type teletype mono \NC \type{\tt} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D The number of styles is not limited to these three. When
+%D using Lucida Bright we can for instance also define:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC handwritten \NC \type{\hw} \NC\FR
+%D \NC calligraphic \NC \type{\cg} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Anyone who feels the need, can define additional ones, like
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC faxfont \NC \type{\ff} \NC\FR
+%D \NC blackboard \NC \type{\bb} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Or even
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC hebrew \NC \type{\hb} \NC\SR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Styles are grouped in font sets. At the moment there are
+%D three main sets defined:
+%D
+%D \startlinecorrection
+%D \starttable[|l|l||]
+%D \HL
+%D \NC Computer Modern Roman \NC Knuth \NC \type{cmr} \NC\FR
+%D \NC Lucida Bright \NC Bigelow \& Holmes \NC \type{lbr} \NC\MR
+%D \NC Standard Postscript Fonts \NC Adobe \NC \type{pos} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D There are also some Computer Modern Roman alternatives:
+%D
+%D \startlinecorrection
+%D \starttable[|l|l||]
+%D \HL
+%D \NC Computer Modern Roman \NC Knuth \& Sauter \NC \type{sau} \NC\FR
+%D \NC Euler fonts \NC Zapf \NC \type{eul} \NC\MR
+%D \NC Computer Modern Concrete \NC Knuth \& Zapf \NC \type{con} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D All these definitions are ordered in files with names like
+%D \type{font-cmr} and \type{font-pos}, where the last three
+%D characters specify the name as known to \CONTEXT.
+%D
+%D Within such a font set (\type{cmr}) and style (\type{\rm})
+%D we can define a number of text font alternatives:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC typeface \NC \type{\tf} \NC\FR
+%D \NC boldface \NC \type{\bf} \NC\MR
+%D \NC slanted \NC \type{\sl} \NC\MR
+%D \NC italic \NC \type{\it} \NC\MR
+%D \NC boldslanted \NC \type{\bs} \NC\MR
+%D \NC bolditalic \NC \type{\bi} \NC\MR
+%D \NC smallcaps \NC \type{\sc} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+
+%D For old stylish Frans Goddijn we have:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC oldstyle \NC \type{\os} \NC\SR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D The availability of these alternatives depends on the
+%D completeness of a font family and of course the definitions
+%D in the font files.
+%D
+%D But let's not forget math. In addition to the previous \TEX\
+%D families (the mysterious \type{\fam}'s) we've got some more:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC Math Roman \NC \type{\mr} \NC\FR
+%D \NC Math Italic \NC \type{\mi} \NC\MR
+%D \NC Math Symbol \NC \type{\sy} \NC\MR
+%D \NC Math Extra \NC \type{\ex} \NC\MR
+%D \NC Math A \NC \type{\ma} \NC\MR
+%D \NC Math B \NC \type{\mb} \NC\MR
+%D \NC Math C \NC \type{\mc} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Users can call for specific fonts in many ways. Switches to
+%D other typefaces, like the switch from normal to bold, are as
+%D intuitive as possible, which means that all dependant fonts
+%D also switch. One can imagine that this takes quite some
+%D processing time.
+%D
+%D Internally fonts are stored as combination of size, style
+%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}.
+%D Users are not confronted with sizes, but use the style or
+%D style+alternative to activate them.
+%D
+%D During the definition of a bodyfont one can also declare the
+%D available larger alternatives:
%D
%D \starttyping
-%D \showinstalledfonts[officinasans.*][all]
-%D \showinstalledfonts[officinaserif.*][all]
-%D \showinstalledfonts[officina.*itc.*][all]
+%D \tf \tfa \tfb \tfc ...
+%D \bf \bfa \bfb \bfc ...
+%D \sl \sla \slb \slc ...
+%D \stoptyping
%D
-%D \showinstalledfonts[officina.*itc.*][all,new]
+%D The smaller ones are automatically supplied and derived from
+%D the the bodyfont environment.
+%D
+%D \starttyping
+%D \tfx \tfxx
+%D \bfx \bfxx
+%D \slx \slxx
+%D \stoptyping
+%D
+%D There are only two smaller alternatives per style. The
+%D larger alternatives on the other hand have no limitations.
+%D
+%D These larger alternatives are mostly used in chapter and
+%D section titles or on title pages. When one switches to a
+%D larger alternative, the bold an other ones automatically
+%D adapt themselves:
+%D
+%D \startbuffer
+%D \tfd Hi \bf there\sl, here \tfb I \bf am
+%D \stopbuffer
+%D
+%S \startnarrower
+%D \typebuffer
+%S \stopnarrower
+%D
+%D therefore becomes:
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D Maybe this mechanism isn't always as logic, but as said
+%D before, we tried to make it as intuitive as possible.
+%D
+%D So a specific kind of glyph can be characterized by:
+%D
+%D \startnarrower
+%D family (cmr) + bodyfont (12pt) + style (rm) + alternative (bf) + size (a)
+%D \stopnarrower
+%D
+%D The last component (the size) is optional.
+%D
+%D We introduced \type{\tf} as command to call for the current
+%D normally sized typeface. This commands results in roman,
+%D sans serif, teletype or whatever style is in charge. Such
+%D rather massive switches of style sometimes take more
+%D processing time than comfortable. Of course there is a
+%D workaround for this: we can call fonts directly by means of
+%D commands like:
+%D
+%D \starttyping
+%D \rmtf \sssl \tttf \rmbsa
+%D \stoptyping
+%D
+%D One should realize that this fast calls have limitations,
+%D they lack for instance automatic super- and subscript
+%D support.
+%D
+%D This leaves us two more commands: \type{\tx} and
+%D \type{\txx}. These activate a smaller and even more smaller
+%D font than the current one and adapt themselves to the
+%D current alternative, so when \type{\bf} is active,
+%D \type{\tx} gives a smaller boldface, which in turn can be
+%D called directly by \type{\bfx}.
+%D
+%D These two smaller alternatives are specified by the bodyfont
+%D environment and therefore not necessarily have similar sizes
+%D as \type{\scriptsize} and \type{\scriptscriptsize}. The main
+%D reason for this incompatibility (which can easily be undone)
+%D lays in the fact that we often want a bit bigger characters
+%D than in math mode. In \CONTEXT\ for instance the \type{\tx}
+%D and \type{\txx} commands are used for surrogate
+%D \cap{smallcaps} which support both nesting and alternatives,
+%D like in {\bf\cap{a \cap{small} world}}, which was typeset by
+%D
+%D \starttyping
+%D \bf\cap{a \cap{small} world}
%D \stoptyping
+%D
+%D And compare $\rm \scriptstyle THIS$ with the slightly larger
+%D \cap{THIS}: \ruledhbox{$\rm \scriptstyle scriptstyle: THIS$}
+%D or \ruledhbox{\cap{x style: THIS}} makes a big difference.
-\def\showinstalledfonts
- {\dodoubleempty\doshowinstalledfonts}
+%D The \type{x..d} sizes should be used grouped. If you
+%D don't group them, i.e. call them in a row, \CONTEXT\ will
+%D not be able to sort out your intention (\type {x} inside
+%D \type {d} inside \type {x}. etc.). The following table
+%D demonstrates this:
+%D
+%D \def\FontState{\setstrut\ruledhbox{\strut Hello}}
+%D
+%D \starttabulate[|||||]
+%D \HL
+%D \NC \rlap{\quad\bf grouped} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
+%D \HL
+%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
+%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
+%D \NC \type{\tf} \NC \tf \FontState \NC \tf \tx \FontState \NC \tf \txx \FontState \NC \NR
+%D \NC \type{\tfa} \NC \tfa \FontState \NC \tfa \tx \FontState \NC \tfa \txx \FontState \NC \NR
+%D \NC \type{\tfb} \NC \tfb \FontState \NC \tfb \tx \FontState \NC \tfb \txx \FontState \NC \NR
+%D \NC \type{\tfc} \NC \tfc \FontState \NC \tfc \tx \FontState \NC \tfc \txx \FontState \NC \NR
+%D \NC \type{\tfd} \NC \tfd \FontState \NC \tfd \tx \FontState \NC \tfd \txx \FontState \NC \NR
+%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
+%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
+%D \HL
+%D \stoptabulate
+%D
+%D \blank
+%D
+%D \starttabulate[|||||]
+%D \HL
+%D \NC \rlap{\quad\bf stacked} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
+%D \HL
+%D \NC \type{\tfx}
+%D \NC \tfx \FontState
+%D \NC \tfx \tx \FontState
+%D \NC \tfx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfxx}
+%D \NC \tfx\tfxx \FontState
+%D \NC \tfx\tfxx \tx \FontState
+%D \NC \tfx\tfxx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tf}
+%D \NC \tfx\tfxx\tf \FontState
+%D \NC \tfx\tfxx\tf \tx \FontState
+%D \NC \tfx\tfxx\tf \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfa}
+%D \NC \tfx\tfxx\tf\tfa \FontState
+%D \NC \tfx\tfxx\tf\tfa \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfb}
+%D \NC \tfx\tfxx\tf\tfa\tfb \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfc}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfd}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfx}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfxx}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \txx \FontState
+%D \NC \NR
+%D \HL
+%D \stoptabulate
-\def\doshowinstalledfonts[#1][#2]%
- {\bgroup
- \def\pattern{#1}%
- \def\all{false}%
- \def\reload{false}%
- \doifnothing\pattern{\def\pattern{.*}}%
- \processallactionsinset[#2][\v!new=>\def\reload{true},\v!all=>\def\all{true}]%
- \ctxlua{fonts.names.table("#1",\reload,\all)}%
- \egroup}
+%D \macros
+%D {mf}
+%D
+%D Math fonts are a species in their own. They are tightly
+%D hooked into smaller and even smaller ones of similar breed
+%D to form a tight family. Let's first see how these are
+%D related:
+%D
+%D \startbuffer
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\rm 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\rm 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\tf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\tf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\bf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\bf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\sl 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\sl 6x^2$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Gives both an expected and unexpected result:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D We see here that the character shapes change accordingly to
+%D the current family, but that the symbols are always typeset
+%D in the font assigned to \type{\fam0}.
+%D
+%D \startbuffer
+%D $\tf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\sl\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bs\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\it\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bi\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D In this example we see a new command \type{\mf} surface
+%D which means as much as {\em math font}. This commands
+%D reactivates the last font alternative and therefore equals
+%D \type{\bf}, \type{\sl} etc. but by default it equals
+%D \type{\tf}:
-%D Experimental!
+\unexpanded\def\mf
+ {\dodosetmathfont\fontalternative
+ \csname\fontalternative\endcsname}
-\def\installfontfeature
- {\dodoubleargument\doinstallfontfeature}
+%D The previous example was typeset saying:
+%D
+%D \typebuffer
+%D
+%D Beware: the exact location of \type{\mf} is not that
+%D important, we could as well has said
+%D
+%D \startbuffer
+%D $\bf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = \mf 6x^2$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is due to the way \TEX\ handles fonts in math mode.
+%D
+%D Of course we'll have to redefine \type{\mf} every time we
+%D change the current \type{\fam}.
-\def\doinstallfontfeature[#1][#2]%
- {\ctxlua{fonts.install_feature("#1","#2")}}
+%D \macros
+%D {mbox,enablembox,mathop}
+%D
+%D Now how can we put this to use? Will the next sequence
+%D give the desired result?
+%D
+%D \startbuffer
+%D $\bf x^2 + \hbox{\mf whatever} + \sin(2x)$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D It won't!
+%D
+%D \startvoorbeeld
+%D \let\mathop=\normalmathop \getbuffer
+%D \stopvoorbeeld
+%D
+%D The reason for this is that \type{\sin} is defined as:
+%D
+%D \starttyping
+%D \def\sin{\mathop{\rm sin}\nolimits}
+%D \stoptyping
+%D
+%D We can fix this by defining
-%D Not yet in \MKII.
+\let\normalmathop\mathop
-\def\fontfeatureslist
- {\dodoubleargument\dofontfeatureslist}
+\unexpanded\def\mathop
+ {\normalmathop
+ \bgroup
+ \let\rm\mf
+ \let\next=}
-\def\dofontfeatureslist[#1][#2]% todo: arg voor type
- {\ctxlua{tex.sprint(tex.ctxcatcodes,fonts.define.specify.context_tostring("#1","otf","\luaescapestring{#2}","yes","no",true,{"number"}))}}
+%D We can fix arbitrary horizontal boxes by redefining the
+%D \TEX\ primitive \type{\hbox}:
+%D
+%D \starttyping
+%D \let\normalhbox=\hbox
+%D
+%D \def\hbox{\ifmmode\mbox\else\normalhbox\fi}
+%D \stoptyping
+%D
+%D with
+%D
+%D \starttyping
+%D \def\mbox#1#%
+%D {\normalhbox#1\bgroup\mf\let\next=}
+%D \stoptyping
+%D
+%D or more robust, that is, also accepting \type{\hbox\bgroup}:
+%D
+%D \starttyping
+%D \def\mbox%
+%D {\normalhbox\bgroup\mf
+%D \dowithnextbox{\flushnextbox\egroup}%
+%D \normalhbox}
+%D \stoptyping
+%D
+%D And now:
+%D
+%D \startbuffer
+%D $\bf x^2 + \hbox{whatever} + \sin(2x)$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Indeed gives:
+%D
+%D \startvoorbeeld
+%D \enablembox\getbuffer
+%D \stopvoorbeeld
+%D
+%D But, do we want this kind of trickery to be activated? No,
+%D simply because we cannot be sure of incompatibilities,
+%D although for instance unboxing goes ok. Therefore we
+%D introduce:
-\def\definefontlocal#1%
- {\expandafter\font\csname#1\endcsname\lastfontname\relax}
+% best can go to math-ini and make \mf a hook then
-\def\definefontglobal#1%
- {\global\expandafter\font\csname#1:\endcsname\lastfontname\relax}
+% better use \dowithnextboxcontent
-\attribute\zerocount\zerocount % first in list, so fast match
+\def\normalmbox
+ {\normalhbox\bgroup\mf
+ \dowithnextbox{\flushnextbox\egroup}\normalhbox}
-% \def\featureattribute#1{\ctxlua{tex.sprint(fonts.define.specify.context_number("#1"))}}
-% \def\setfontfeature #1{\attribute\zerocount\featureattribute{#1}\relax}
-% \def\resetfontfeature#1{\attribute\zerocount\zerocount}
+% to test:
+%
+% \def\normalmbox
+% {\dowithnextboxcontent\mf\flushnextbox\normalhbox}
-\let\currentfeature\empty
+\def\mbox
+ {\ifmmode\normalmbox\else\normalhbox\fi}
-\def\featureattribute#1{\ctxlua{tex.sprint(fonts.define.specify.context_number("#1"))}}
-\def\setfontfeature #1{\edef\currentfeature{#1}\attribute\zerocount\featureattribute{#1}\relax}
-\def\resetfontfeature#1{\let\currentfeature\empty\attribute\zerocount\zerocount}
+\def\enablembox
+ {\appendtoks
+ \ifx\normalhbox\undefined\let\normalhbox\hbox\fi
+ \let\hbox\mbox
+ \to\everymathematics}
+
+%D So in fact one can enable this feature if needed. I would say:
+%D go along, but use grouping if needed!
+
+%D \macros
+%D {mrfam,mifam,syfam,exfam,
+%D bsfam,bifam,scfam,tffam,
+%D mafam,mbfam,msfam}
+%D
+%D After this short mathematical excursion, we enter the world
+%D of fonts and fontswitching. We start with something very
+%D \TEX: \type{\fam} specified font families. \TEX\ uses
+%D families for managing fonts in math mode. Such a family has
+%D three members: text, script and scriptscript: $x^{y^z}$. In
+%D \CONTEXT\ we take a bit different approach than \PLAIN\
+%D \TEX\ does. \PLAIN\ \TEX\ needs at least four families for
+%D typesetting math. We use those but give them symbolic names.
+
+\chardef\mrfam = 0 % (Plain TeX) Math Roman
+\chardef\mifam = 1 % (Plain TeX) Math Italic
+\chardef\syfam = 2 % (Plain TeX) Math Symbol
+\chardef\exfam = 3 % (Plain TeX) Math Extra
+
+%D \PLAIN\ \TEX\ also defines families for {\it italic}, {\sl
+%D slanted} and {\bf bold} typefaces, so we don't have to
+%D define them here.
+
+\ifx\itfam\undefined
+
+\chardef\itfam = 4 % (Plain TeX) Italic
+\chardef\slfam = 5 % (Plain TeX) Slanted
+\chardef\bffam = 6 % (Plain TeX) Boldface
+
+\fi
+
+%D Family~7 in \PLAIN\ \TEX\ is not used in \CONTEXT, because
+%D we do massive switches from roman to sans serif, teletype or
+%D other faces.
+
+\ifx\ttfam\undefined
+ \chardef\ttfam = 7 % (Plain TeX) can be reused!
+\fi
+
+%D We define ourselves some more families for {\bs bold
+%D slanted}, {\bi bold italic} and {\sc Small Caps}, so
+%D we can use them in math mode too. Instead of separate
+%D families for {\ss sans serif} and \type{teletype} we use the
+%D more general \type{\tffam}, which stands for typeface.
+
+\chardef\bsfam = 8 % (ConTeXt) BoldSlanted
+\chardef\bifam = 9 % (ConTeXt) BoldItalic
+\chardef\scfam = 10 % (ConTeXt) SmallCaps
+\chardef\tffam = 11 % (ConTeXt) TypeFace
+
+%D Because Taco needs a few more math families, we reuse
+%D family~7 for all those typefaces that have no related
+%D family, and therefore are grouped into one.
+
+\chardef\nnfam = 7 % (ReUsed) NoName
+
+%D Normally \type{\mrfam} equals \type{\tffam}, but a more
+%D distinctive alternatives are possible, for instance the
+%D Euler and Concrete Typefaces.
+%D
+%D After having defined all those in nature non||mathematical
+%D families, we define ourselves some real math ones. These are
+%D needed for the \AMS\ Symbol Fonts and Extended Lucida
+%D Bright.
+
+\chardef\mafam = 12 % (ConTeXt) Math A Fam (AmsTeX A)
+\chardef\mbfam = 13 % (ConTeXt) Math B Fam (AmsTeX B)
+\chardef\mcfam = 14 % (ConTeXt) Math C Fam (MathTime)
+\chardef\mdfam = 15 % (ConTeXt) Math D Fam (MathTime)
+
+%D Because there are 16~families and because \type{\ttfam}
+%D is reused, at the moment we have no so many families
+%D left. By default, we map any newly defined family on the
+%D last one (F).
+
+\def\newfam#1{\chardef#1=15 }
+
+%D This hack is also needed because in \ETEX\ we are going
+%D to reuse the \type {\newfam} allocation counter.
+
+%D To ease the support of font packages, we als define
+%D shortcuts to these familynames. This is necessary because
+%D the family names are in fact \type{\chardef}'s, which means
+%D that we're dealing with numbers (one can check this by
+%D applying \type{\showthe} and \type{\show}). In the
+%D specification of math symbols however we need hexadecimal
+%D numbers, so we have to convert the \type{\fam}'s value.
+
+\edef\hexmrfam {\hexnumber\mrfam} \edef\hexbsfam {\hexnumber\bsfam}
+\edef\hexmifam {\hexnumber\mifam} \edef\hexbifam {\hexnumber\bifam}
+\edef\hexsyfam {\hexnumber\syfam} \edef\hexscfam {\hexnumber\scfam}
+\edef\hexexfam {\hexnumber\exfam} \edef\hextffam {\hexnumber\tffam}
+\edef\hexitfam {\hexnumber\itfam} \edef\hexmafam {\hexnumber\mafam}
+\edef\hexslfam {\hexnumber\slfam} \edef\hexmbfam {\hexnumber\mbfam}
+\edef\hexbffam {\hexnumber\bffam} \edef\hexmcfam {\hexnumber\mcfam}
+\edef\hexnnfam {\hexnumber\nnfam} \edef\hexmdfam {\hexnumber\mdfam}
+
+%D \macros
+%D {uchar}
+%D
+%D This macro prepares \CONTEXT\ for \UNICODE\ support. By
+%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
+
+%D We define some (very private) constants to improve speed,
+%D memory usage and consistency.
+
+\def\@size@ {@f@si@} % bodyfont size prefix (12pt etc)
+\def\@style@ {@f@st@} % full style prefix (roman etc)
+\def\@shortstyle@ {@f@sh@} % short style prefix (rm etc)
+\def\@letter@ {@f@le@} % first alternative typeface
+\def\@noletter@ {@f@no@} % second alternative typeface
+
+%D The families can be grouped into math specific ones and
+%D more text related families, although text ones can be
+%D mapped onto the math ones to get for instance bold math.
+%D
+%D Both groups of families are handles by a couple of token
+%D list tagged as strategies. This implementation makes
+%D implementing extensions more comfortable.
+
+\newtoks \textstrategies
+\newtoks \mathstrategies
+\newtoks \symbstrategies
+
+\newif\ifsynchronizemathfonts \synchronizemathfontstrue
+
+\def\synchronizetext % stylish text in mmode
+ {\ifsynchronizemathfonts\the\textstrategies\fi} % \if...\fam\minusone\fi}
+
+\def\synchronizemath % math stuff in mmode
+ {\ifsynchronizemathfonts\the\mathstrategies\fi} % \if...\fam\minusone\fi}
+
+\def\synchronizesymb % stylish math stuff in mmode
+ {\ifsynchronizemathfonts\the\symbstrategies\fi} % \if...\fam\minusone\fi}
+
+%D By not setting the family we can append a font switch to \type
+%D {\everymath}. On the other hand, one never knows in what family
+%D state the strategies brought us.
+%D
+%D \starttyping
+%D {\bfa $\the\fam$} {\bfa \everymath{} $\the\fam$}
+%D \stoptyping
+
+%D \macros
+%D {textonly}
+%D
+%D We can inhibit this slow||downer with:
+
+\def\textonly{\synchronizemathfontsfalse} % document this
\appendtoks
- \setfontfeature\currentfeature
-\to \everylanguage
+ \dosettextfamily\c!tf
+ \dosettextfamily\c!bf
+ \dosettextfamily\c!sl
+ \dosettextfamily\c!it
+ \dosettextfamily\c!bs
+ \dosettextfamily\c!bi
+ \dosettextfamily\c!sc
+\to \textstrategies
-%D Simpler:
+\def\dosettextfamily#1% better pass fontbody to dodoset
+ {\let\savedfontbody\fontbody
+ \let\fontfamily#1%
+ \let\fontbody\scriptscriptface\dodosettextfamily\scriptscriptfont
+ \let\fontbody\scriptface \dodosettextfamily \scriptfont
+ \let\fontbody\textface \dodosettextfamily \textfont
+ \let\fontbody\savedfontbody}
-\def\updatefontparameters
- {%edef\@@fonthandling{\truefontdata\somefontname\s!handling}% goes away, is now feature
- \edef\@@fontfeatures{\truefontdata\fontfile \s!features}%
- \edef\@@fontskewchar{\truefontdata\fontfile \s!skewchar}} % will be replaced
+% \def\s!nullfont{nullfont}
-\def\setfontcharacteristics
- {\the\everyfont}
+\def\dodosettextfamily
+ {\ifx\fontclass\empty
+ \@EA\dodosettextfamilyA
+ \else
+ \@EA\dodosettextfamilyB
+ \fi}
-%D Predefined:
+\def\dodosettextfamilyA#1%
+ {\ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname \fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
+ \csname \fontbody\c!mm\fontfamily\endcsname \else
+ \ifcsname \fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody\c!rm\fontfamily\fontsize\endcsname \else
+ \ifcsname \fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
+ \csname \fontbody\c!rm\fontfamily\endcsname \else
+ \nullfont \autofontsizetrue
+ \fi\fi\fi\fi
+ #1\csname\fontfamily\s!fam\endcsname\font}
-% \installfontfeature[otf][tlig]
-% \installfontfeature[otf][trep]
+\def\dodosettextfamilyB#1%
+ {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
+ \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \else
+ \ifcsname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
+ \csname\fontclass\fontbody\c!rm\fontfamily\endcsname \else
+ \dodosettextfamilyA#1%
+ \fi\fi\fi\fi
+ #1\csname\fontfamily\s!fam\endcsname\font}
-%D tricky but ok:
+\def\mrfallback{\c!rm\c!tf}
-\appendtoks\ctxlua{fonts.tfm.cleanup()}\to\everyshipout
+\appendtoks
+ \dosetmathfamily\mrfam\textface\scriptface\scriptscriptface\c!mr\mrfallback
+ \dosetmathfamily\mifam\textface\scriptface\scriptscriptface\c!mi\empty
+ \dosetmathfamily\syfam\textface\scriptface\scriptscriptface\c!sy\empty
+ \dosetmathfamily\exfam\textface\textface \textface \c!ex\empty
+ \dosetmathfamily\mafam\textface\scriptface\scriptscriptface\c!ma\empty
+ \dosetmathfamily\mbfam\textface\scriptface\scriptscriptface\c!mb\empty
+ \dosetmathfamily\mcfam\textface\scriptface\scriptscriptface\c!mc\empty
+% \dosetmathfamily\mdfam\textface\scriptface\scriptscriptface\c!md\empty
+ \dosetmathfamily\nnfam\textface\scriptface\scriptscriptface\c!nn\empty
+\to \mathstrategies
-\protect \endinput
+\appendtoks
+ \dosetskewchar\mifam\defaultskewcharmi % implemented later on
+ \dosetskewchar\syfam\defaultskewcharsy % implemented later on
+\to \mathstrategies
+
+\def\dosetmathfamily#1#2#3#4#5#6%
+ {\let\savedfontbody\fontbody % op hoger plan
+ \let\fontfamily#5%
+ \let\backfamily#6%
+ \let\fontbody #4\dodosetmathfamily\scriptscriptfont#1%
+ \let\fontbody #3\dodosetmathfamily \scriptfont#1%
+ \let\fontbody #2\dodosetmathfamily \textfont#1%
+ \let\fontbody\savedfontbody}
+
+\def\dodosetmathfamily
+ {\ifx\fontclass\empty
+ \@EA\dodosetmathfamilyA
+ \else
+ \@EA\dodosetmathfamilyB
+ \fi}
+
+\def\dodosetmathfamilyA#1#2%
+ {\ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname \fontbody\c!mm\fontfamily \endcsname \autofontsizetrue
+ \csname \fontbody\c!mm\fontfamily \endcsname \else
+ \ifcsname \fontbody \backfamily\fontsize\endcsname \autofontsizefalse
+ \csname \fontbody \backfamily\fontsize\endcsname \else
+ \ifcsname \fontbody \backfamily \endcsname \autofontsizetrue
+ \csname \fontbody \backfamily \endcsname \else
+ \nullfont \autofontsizetrue
+ \fi\fi\fi\fi
+ #1#2\font}
+
+\def\dodosetmathfamilyB#1#2%
+ {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody\c!mm\fontfamily \endcsname \autofontsizetrue
+ \csname\fontclass\fontbody\c!mm\fontfamily \endcsname \else
+ \ifcsname\fontclass\fontbody \backfamily\fontsize\endcsname \autofontsizefalse
+ \csname\fontclass\fontbody \backfamily\fontsize\endcsname \else
+ \ifcsname\fontclass\fontbody \backfamily \endcsname \autofontsizetrue
+ \csname\fontclass\fontbody \backfamily \endcsname \else
+ \dodosetmathfamilyA#1#2%
+ \fi\fi\fi\fi
+ #1#2\font}
+
+\appendtoks
+ \dosetsymbfamily\mrfam\textface\scriptface\scriptscriptface\c!mr
+ \dosetsymbfamily\mifam\textface\scriptface\scriptscriptface\c!mi
+ \dosetsymbfamily\syfam\textface\scriptface\scriptscriptface\c!sy
+ \dosetsymbfamily\exfam\textface\textface \textface \c!ex
+ \dosetsymbfamily\mafam\textface\scriptface\scriptscriptface\c!ma
+ \dosetsymbfamily\mbfam\textface\scriptface\scriptscriptface\c!mb
+ \dosetsymbfamily\mcfam\textface\scriptface\scriptscriptface\c!mc
+% \dosetsymbfamily\mdfam\textface\scriptface\scriptscriptface\c!md % also ?
+\to \symbstrategies
+
+\def\dosetsymbfamily#1#2#3#4#5%
+ {\let\savedfontbody\fontbody
+ \let\fontfamily#5%
+ \let\fontbody #4\dodosetsymbfamily\scriptscriptfont#1%
+ \let\fontbody #3\dodosetsymbfamily \scriptfont#1%
+ \let\fontbody #2\dodosetsymbfamily \textfont#1%
+ \let\fontbody\savedfontbody}
+
+\def\dodosetsymbfamily#1#2%
+ {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ \csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ #1#2\font
+ \else\ifcsname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ \csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
+ #1#2\font
+ \fi\fi}
+
+%D All used styles, like rm, ss and tt, are saved in a comma
+%D separated list. Appart from practical limitations one can
+%D define as many styles as needed.
+
+\let\stylelist=\empty
+
+\def\fontsizelist{\s!text,\s!script,\s!scriptscript,\c!x,\c!xx,\c!big,\c!small}
+
+%D \macros
+%D {magfactor,magfactorhalf}
+%D
+%D There are several ways to specify a font. Three of them are
+%D pure \TeX\ ones, the fourth one is new:
+%D
+%D \starttyping
+%D \font\name=cmr12
+%D \font\name=cmr12 at 10pt
+%D \font\name=cmr12 scaled \magstep2
+%D \font\name=cmr12 sa 1.440
+%D \stoptyping
+%D
+%D The non||\TEX\ alternative \type{sa} stands for {\em scaled
+%D at}. This means as much as: scale the bodyfontsize with this
+%D factor. The value 1.440 in this example is derived
+%D from the \type{\magstep}'s as mentioned in
+%D \in{table}[tab:magstep]. We therefore introduce
+%D \type{\magfactor} as an alternative for \type{\magstep}.
+%D
+%D \placetable[here][tab:magstep]
+%D {Factors to be used with \type{sa.}}
+%D \starttable[|c|c|c|]
+%D \HL
+%D \NC \bf magstep \NC \bf equivalent \NC \bf factor \NC\SR
+%D \HL
+%D \NC 1 \NC \type{\magfactor1} \NC 1.200 \NC\FR
+%D \NC 2 \NC \type{\magfactor2} \NC 1.440 \NC\MR
+%D \NC 3 \NC \type{\magfactor3} \NC 1.728 \NC\MR
+%D \NC 4 \NC \type{\magfactor4} \NC 2.074 \NC\MR
+%D \NC 5 \NC \type{\magfactor5} \NC 2.488 \NC\LR
+%D \HL
+%D \stoptable
+
+\def\magstep#1% \relax removed, otherwise space after it sticks, else added
+ {\ifcase#1 \@m\or1200\or1440\or1728\or2074\or2488\or\@m\fi}
+
+\def\magstephalf
+ {1095}
+
+\def\magfactor#1%
+ {\ifcase#1 1.000\or1.200\or1.440\or1.728\or2.074\or2.488\or1\fi}
+
+\def\magfactorhalf
+ {1.095}
+
+%D These macros enable the use of definitions like \type{sa
+%D \magfactor3} which saves us both (mis|)|calculations and
+%D potential mistypings.
+%D
+%D Because \type {sa} (scaled at) and \type {mo} (mapped on)
+%D are not low level \TEX\ supported alternatives, we have to
+%D test for it ourselves. In doing so, we need an auxiliary
+%D \DIMENSION. We cannot use \type{\scratchdimen} because font
+%D loading can happen at any moment due to postponed loading.
+%D We could instead have used dirty grouping tricks, but this
+%D one works too.
+
+\let\defaultrelativefontsize \plusone
+\let\localrelativefontsize \plusone
+\def\localabsolutefontsize {\fontbody}
+
+\let\relativefontsize \defaultrelativefontsize
+
+\def\saverelativefontsize#1#2% #1=rm|ss|.. #2=waarde
+ {\setxvalue{\fontclass#1\s!rscale}{#2}}
+
+\def\checkrelativefontsize#1%
+ {\edef\relativefontsize
+ {\ifcsname\fontclass#1\s!rscale\endcsname
+ \csname\fontclass#1\s!rscale\endcsname
+ \else
+ \defaultrelativefontsize
+ \fi}}
+
+%D We also save:
+
+\def\savemathtextstyle#1% #1=rm|ss|..
+ {\doifsomething{#1}{\setxvalue{\fontclass\c!mm\s!text}{#1}}}
+
+\def\currentmathtextstyle % we default to empty !
+ {\executeifdefined{\fontclass\c!mm\s!text}\empty}
+
+%D Scaling macros:
+
+\def\safontscale{\number\dimexpr\localabsolutefontsize\relax}
+\def\mofontscale{\number\dimexpr\setmappedfontsize\localabsolutefontsize\relax}
+
+\let\somefontname\s!unknown
+\let\somefontspec\s!unknown
+\let\somefontsize\zerocount
+
+\newcount\scaledfontmode
+\newdimen\scaledfontsize
+\newtoks\everydefinefont
+
+\def\lowleveldefinefont#1#2% #2 = cs
+ {\ctxlua{fonts.define.command_1("\luaescapestring{#1}")}% the escapestring catches at \somedimen
+ % sets \scaledfontmode and \somefontname and \somefontsize
+ \ifcase\scaledfontmode\relax
+ % none
+ \scaledfontsize-1000\scaledpoint
+ \or
+ % at
+ \scaledfontsize\somefontsize
+ \or
+ % sa
+ \scaledfontsize\localabsolutefontsize
+ \scaledfontsize\ifcsname\??ft\s!default\somefontsize\endcsname\csname\??ft\s!default\somefontsize\endcsname\else\somefontsize\fi\scaledfontsize
+ \or
+ % mo
+ \scaledfontsize\setmappedfontsize\localabsolutefontsize
+ \scaledfontsize\ifcsname\??ft\s!default\somefontsize\endcsname\csname\??ft\s!default\somefontsize\endcsname\else\somefontsize\fi\scaledfontsize
+ \or
+ % scaled
+ \scaledfontsize-\somefontsize\scaledpoint
+ \fi
+ \scaledfontsize\localrelativefontsize\scaledfontsize
+ \ifautofontsize\scaledfontsize\currentfontbodyscale\scaledfontsize\fi
+ \edef\somefontspec{at \number\scaledfontsize sp}%
+ \edef\somefontfile{\truefontname\somefontname}%
+ \ifx\somefontfile\s!unknown
+ \edef\somefontfile{\defaultfontfile}%
+ \fi
+ \updatefontparameters
+ \updatefontclassparameters
+ \ctxlua{fonts.define.command_2(
+ \ifx\fontclass\empty false\else true\fi,
+ "#2", % cs, trailing % is gone
+ "\somefontfile",
+ \number\scaledfontsize,
+ "\@@fontclassfeatures",
+ "\@@fontfeatures",
+ "\@@fontclassfallbacks",
+ "\@@fontfallbacks"
+ )}%
+ \edef\somefontspec{at \somefontsize}% we need the resolved designsize (for fallbacks)
+ \expandafter\let\expandafter\lastrawfontcall\csname#2\endcsname
+ \the\everydefinefont}
+
+\def\updatefontclassparameters
+ {\edef\@@fontclassfeatures {\ifcsname\fontclass\s!features \endcsname\csname\fontclass\s!features \endcsname\fi}%
+ \edef\@@fontclassfallbacks{\ifcsname\fontclass\s!fallbacks\endcsname\csname\fontclass\s!fallbacks\endcsname\fi}}
+
+\let\@@fontclassfeatures \empty
+\let\@@fontclassfallbacks\empty
+
+\let\@@fontfallbacks\empty
+\let\@@fontfeatures \empty
+\let\@@skewchar \empty
+\let\@@hyphenchar \empty % todo, will go to encoding
+
+%D This brings down maps processing from 466 to 309 seconds
+%D ($-33$\%) and mfonts from 42 to 34 seconds ($-15$\%).
+
+\newif\ifskipfontcharacteristics \skipfontcharacteristicstrue
+
+%D When fontclasses are used, we define the font global,
+%D since namespaces are used. Otherwise we parse the specs
+%D each time.
+
+\let\fontfile\s!unknown
+
+% \definefontfeature[default] [liga=yes,texligatures=yes,texquotes=yes]
+% \definefontfeature[default-caps][liga=yes,texligatures=yes,texquotes=yes,smcp=yes,script=latn]
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular][features=default]
+% \definefontsynonym[SerifCaps][palatinonova-regular][features=default-caps] % also sets Serif
+% \stoptypescript
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular*default]
+% \definefontsynonym[SerifCaps] [palatinonova-regular*default-caps]
+% \stoptypescript
+
+% \definetypeface[mainface][rm][serif][palatino-nova-regular][default] \setupbodyfont[mainface]
+%
+% \starttext
+% ``Test'' -- --- ff fi fl \sc ``Test'' -- --- ff fi fl
+% \stoptext
+
+% \starttext
+% \definefont
+% [blabla]
+% [name:Latin Modern Something]
+% \definefont
+% [blabla]
+% [file:texnansi-lmr10]
+% \blabla test
+% \definefont
+% [blabla]
+% [texnansi-lmtt10]
+% \blabla test
+% \stoptext
+
+% \starttext
+%
+% \setupcolors[state=start]
+%
+% \definefontfeature
+% [default-base]
+% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes]
+% \definefontfeature
+% [default-node]
+% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,mode=node]
+% \definefontfeature
+% [default-none]
+% [script=latn,language=dflt,liga=yes,kern=no, tlig=yes,trep=yes]
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:lmroman12regular*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:lmroman12regular*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:lmroman12regular*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \blank
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:texgyrepagella*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:texgyrepagella*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:texgyrepagella*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \blank
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:palatinonovaregular*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:palatinonovaregular*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:palatinonovaregular*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \startoverlay
+% {\vtop{\color[red] {\font\test=name:OfficinaSerifBookITC*default-node \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[green]{\font\test=name:OfficinaSerifBookITC*default-base \test \input ward \input zapf \input linden }}}
+% {\vtop{\color[blue] {\font\test=name:OfficinaSerifBookITC*default-none \test \input ward \input zapf \input linden }}}
+% \stopoverlay
+%
+% \definefontfeature[superdefault][default][compose=yes]
+%
+% {\font\oeps=name:lmroman10regular*default at 30pt \oeps test \char7683}
+% {\font\oeps=name:lmroman10regular*superdefault at 30pt \oeps test \char7683}
+%
+% \stoptext
+
+\def \defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone
+\edef\nullfontname {\fontname\nullfont}
+\edef\dummyfontname {font\strippedcsname\\}
+
+%D \macros
+%D {everyfont,everyfontswitch}
+%D
+%D For special purposes, we provide a hook.
+
+% \newevery \everyfont \relax
+% \newevery \everyfontswitch \relax
+
+%D We also accept \type{sa a}||\type{sa d} as specification.
+
+%D The duplicate font definition, using the ever the same dummy
+%D font name, results in less fuzzy error messages. In the log
+%D file, for instance when overfull boxes are reported, the
+%D simple keyword `font' replaces the \TEX\ ordinated name. The
+%D latter can be too misleading, due to the fact that \TEX\ has
+%D a rather optimized font memory management. Thanks to Taco
+%D for helping me sort this out.
+
+%D \macros
+%D {definefontsynonym, doifelsefontsynonym,
+%D expandfontsynonym, truefontname, truefontdata}
+%D
+%D While looking for fonts, fontsynonyms are used for accessing
+%D the files!
+%D
+%D \starttyping
+%D \definefontsynonym[Serif][Lucida-Bright]
+%D \definefontsynonym[Lucida-Bright][lbr][encoding=texnansi]
+%D \stoptyping
+
+\def\classfont#1#2{#1#2} % \definefont[whatever][\classfont{xx}{yy} at 10pt]
+
+% We need to move the feature into the filename else it may be
+% overloaded by another reference. For instance the definition of
+% a regular and caps variant can use the same font.
+
+% We could use an indirect method ... store in 'array' and refer to
+% slot.
+
+\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontname{#1}%
+ \edef\@@fontfile{#3}%
+ \doifnextcharelse[\dodefinefontsynonym\nodefinefontsynonym}
+
+\def\nodefinefontsynonym
+ {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile}
+
+\def\dodefinefontsynonym[#1]%
+ {\edef\@@fontdata{#1}%
+ \ifx\@@fontdata\empty
+ \nodefinefontsynonym
+ \else
+ \ifx\fontclass\empty
+ \getfontparameters
+ \else
+ \getglobalfontparameters
+ \fi
+ \ifcsname\??ff\@@fontfile\s!features\endcsname
+ \@EA\edef\csname\??ff\fontclass\@@fontname\endcsname{\@@fontfile*\csname\??ff\@@fontfile\s!features\endcsname}%
+ \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined
+ \else
+ \nodefinefontsynonym
+ \fi
+ \fi}
+
+\def\getfontparameters
+ {\expandafter\dogetfontparameter\@@fontdata,]=,}
+
+\def\getglobalfontparameters
+ {\expandafter\dogetglobalfontparameter\@@fontdata,]=,}
+
+\def\dogetfontparameter#1=#2,%
+ {\if]#1\else
+ \expandafter\def\csname\??ff\@@fontfile#1\endcsname{#2}%
+ \expandafter\dogetfontparameter
+ \fi}
+
+\def\dogetglobalfontparameter#1=#2,%
+ {\if]#1\else
+ \expandafter\gdef\csname\??ff\@@fontfile#1\endcsname{#2}%
+ \expandafter\dogetglobalfontparameter
+ \fi}
+
+\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
+
+\def\setupfontsynonym
+ {\dodoubleempty\dosetupfontsynonym}
+
+\def\dosetupfontsynonym[#1][#2]%
+ {\edef\@@fontdata{#2}%
+ \ifx\@@fontdata\empty \else
+ \edef\@@fontfile{#1}%
+ \ifx\fontclass\empty
+ \getfontparameters
+ \else
+ \getglobalfontparameters
+ \fi
+ \fi}
+
+\def\truefontdata#1#2%
+ {\ifcsname\??ff#1#2\endcsname
+ % raw(Regular) raw(key)
+ \csname\??ff#1#2\endcsname
+ \else\ifcsname\??ff\fontclass#1\endcsname
+ % exp(palatino Regular) raw(key)
+ \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
+ \else\ifcsname\??ff#1\endcsname
+ % exp(Regular) raw(key)
+ \expandafter\truefontdata\csname\??ff#1\endcsname#2%
+ \else\ifcsname\??ff#2\endcsname
+ % raw(key)
+ \csname\??ff#2\endcsname
+ \fi\fi\fi\fi}
+
+\def\truefontname#1%
+ {\@EA\dotruefontname#1*\empty*\relax}
+
+\def\dotruefontname#1*#2#3*#4\relax
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \ifx#2\empty
+ \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+ \else
+ \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname*#2#3%
+ \fi
+ \else\ifcsname\??ff#1\endcsname
+ \ifx#2\empty
+ \@EA\truefontname\csname\??ff#1\endcsname
+ \else
+ \@EA\redotruefontname\csname\??ff#1\endcsname*#2#3%
+ \fi
+ \else
+ #1\ifx#2\empty\else*#2#3\fi
+ \fi\fi}
+
+\def\redotruefontname#1%
+ {\@EA\dodotruefontname#1*\relax}
+
+\def\dodotruefontname#1*#2\relax
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ \@EA\redotruefontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+\def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1)
+ {\ifcsname\??ff\fontclass#2\endcsname
+ \expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}%
+ \fi}
+
+\def\doifelsefontsynonym#1%
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% \definetypeface[palatino][rm][serif][palatino,allbold][default]
+%
+% \startfontclass[palatino]
+% \definefontsynonym [Serif] [SerifBold]
+% \definefontsynonym [SerifItalic] [SerifBoldItalic]
+% \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
+% \definefontsynonym [SerifCaps] [SerifBold]
+% \stopfontclass
+%
+% \setupbodyfont[palatino]
+
+\def\startfontclass
+ {\dosingleempty\dostartfontclass}
+
+\def\dostartfontclass[#1]%
+ {\pushmacro\fontclass
+ \doifelse{#1}{\v!each}
+ {\let\fontclass\empty}
+ {\doifsomething{#1}{\def\fontclass{#1}}}}
+
+\def\stopfontclass
+ {\popmacro\fontclass}
+
+%D \macros
+%D {tracedfontname}
+%D
+%D A goody:
+
+\def\tracedfontencoding#1%
+ {\ifcsname\??ff#1\s!encoding\endcsname
+ \space[\csname\??ff#1\s!encoding\endcsname]%
+ \fi}
+
+\def\tracedfontname#1%
+ {\ifcsname\??ff\fontclass#1\endcsname
+ #1\tracedfontencoding{\fontclass#1}\space->\space
+ \@EA\tracedfontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ #1\tracedfontencoding{#1}\space->\space
+ \@EA\tracedfontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+%D \macros
+%D {getfontfileparameters}
+%D
+%D For special purposes, one can use the next macro to
+%D access font file characteristics, for instance:
+%D
+%D \starttyping
+%D \getfontfileparameters{Regular}
+%D \stoptyping
+%D
+%D can result in:
+%D
+%D \starttyping
+%D \def\currentfontfileencoding{texnansi}
+%D \stoptyping
+
+% \let\currentfontfileencoding\s!unknown
+% \let\currentfontfilemapping \s!unknown
+% \let\currentfontfilehandling\s!unknown
+
+% \def\getfontfileparameters#1%
+% {\edef\@@truefontname{\truefontname{#1}}%
+% \edef\currentfontfilefeatures{\truefontdata\@@truefontname\s!features}}
+
+%D \macros
+%D {definefont}
+%D
+%D Before we implement the main definition macro, we first show
+%D one for local use:
+%D
+%D \starttyping
+%D \definefont[Some][LucidaBright at 100pt] \Some some
+%D \definefont[More][LucidaBright scaled 3000] \More more
+%D \definefont[Nice][LucidaBright mo 2] \Nice nice
+%D \definefont[Text][LucidaBright sa 5.4] \Text last
+%D \stoptyping
+%D
+%D The implementation looks as follows:
+
+\def\definefont
+ {\dotripleempty\dodefinefont}
+
+\def\dodefinefont[#1][#2][#3]% [name][spec][1.6 | line=10pt | setup_id]
+ {\doifinstringelse{ }{#2}
+ {\ifthirdargument
+ \unexpanded\setvalue{#1}{\redodefinefont{#1}{#2}{#3}}%
+ \else
+ \unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}%
+ \fi}
+ {\definefont[#1][#2 sa *][#3]}}
+
+\def\redodefinefont#1#2#3%
+ {\dododefinefont{#1}{#2}%
+ \doifsetupselse{#3}
+ {\setups[#3]} % don't forget to document this !
+ {\setuplocalinterlinespace[#3]%
+ \setupspacing}} % needed ?
+
+\def\definefrozenfont
+ {\dotripleempty\dodefinefrozenfont}
+
+\def\dodefinefrozenfont[#1][#2][#3]%
+ {\dodefinefont[#1][#2][#3]%
+ \expandafter\let\csname\lastfontidentifier\expandafter\endcsname\csname\rawfontidentifier\endcsname}
+
+%D The \type {*} makes the switch local, so that we can redefine a
+%D logical name and/or change the size in between.
+
+\newif\ifautofontsize \autofontsizetrue
+
+\let\lastfontidentifier\empty
+
+\def\rawfontidentifier{**\lastfontidentifier\fontsize**}
+\def\newfontidentifier{*\fontclass\lastfontidentifier\fontsize*}
+
+% 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%
+ {\edef\lastfontidentifier{#1}%
+ \let\localrelativefontsize\defaultrelativefontsize
+ \let\localabsolutefontsize\fontbody
+ \lowleveldefinefont{#2}\rawfontidentifier
+ \let\localrelativefontsize\defaultrelativefontsize % not needed
+ \csname\rawfontidentifier\endcsname
+ \autofontsizefalse
+ \setfontcharacteristics
+ \the\everyfontswitch}
+
+\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine
+ {\edef\lastfontidentifier{#3}%
+ \ifcsname\newfontidentifier\endcsname\else
+ \def\localrelativefontsize{#1}%
+ \def\localabsolutefontsize{#2}%
+ \lowleveldefinefont{#4}\newfontidentifier
+ \let\localrelativefontsize\defaultrelativefontsize % not needed
+ \fi
+ \csname\newfontidentifier\endcsname
+ \autofontsizefalse
+ %\edef\lastfontidentifier{#3}%
+ \ifskipfontcharacteristics \else
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+%D I considered checking for mistakenly use of \PLAIN's
+%D \type{\magstep}'s but although it would take only a few
+%D lines of code, this would not add to consistent use. I
+%D therefore removed this check.
+
+%D \macros
+%D {mapfontsize}
+%D
+%D For special purposes, like in math, you may want to use
+%D slightly different sizes than the ones given. This happens
+%D for instance with the Math Times fonts. Mapped font sizes
+%D can be specified by using the \type {mo} key instead of
+%D \type {sa} in font definitions.
+%D
+%D \startbuffer
+%D \mapfontsize[10pt][11pt]
+%D \mapfontsize[11pt][12pt]
+%D \mapfontsize[12pt][13pt]
+%D
+%D \definefont[test][Serif]\test TEST \par
+%D \definefont[test][Serif sa 5]\test TEST \par
+%D \definefont[test][Serif mo 5]\test TEST \par
+%D \definefont[test][Serif sa d]\test TEST \par
+%D \definefont[test][Serif at 60pt]\test TEST \par
+%D \definefont[test][Serif scaled 6000]\test TEST \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startpacked
+%D \getbuffer
+%D \stoppacked
+
+\def\mapfontsize
+ {\dodoubleargument\domapfontsize}
+
+\def\domapfontsize[#1][#2]%
+ {\scratchdimen#1\relax % \relax is really needed here
+ \setvalue{\??ft*\the\scratchdimen}{#2}}
+
+\def\setmappedfontsize#1%
+ {\ifcsname\??ft*#1\endcsname
+ \csname\??ft*#1\endcsname
+ \else
+ #1%
+ \fi}
+
+%D \macros
+%D {getfontname}
+%D
+%D The names of the fonts can be called with the rather simple
+%D macro \type{\getfontname}. When for instance we pass
+%D \type{12ptrmtf} as argument, we get \getfontname{12ptrmtf}.
+
+\def\getfontname#1%
+ {\csname\??ft#1\endcsname}
+
+%D To be documented.
+
+\let\sizelist\empty
+
+\def\definefontsize[#1]% sneller met toks
+ {\addtocommalist{#1}\sizelist
+ \def\docommand##1%
+ {\def\dodocommand####1%
+ {\def\dododocommand########1%
+ %{\checkbodyfont{}{########1}{####1}{##1}}%
+ {\checkbodyfont{########1}{####1}{##1}}%
+ \processcommacommand[\stylelist]\dododocommand}%
+ \processcommacommand[\alternativelist]\dodocommand}%
+ \processcommacommand[\sizelist]\docommand}
+
+\def\alternativetextlist{\c!tf,\c!bf,\c!it,\c!sl,\c!bs,\c!bi,\c!sc}
+\def\alternativemathlist{\c!mr,\c!mi,\c!sy,\c!ex,\c!ma,\c!mb}
+
+\let\alternativelist\alternativetextlist % upward compatible
+
+%\definefontsize[\c!a] \definefontsize[\c!b]
+%\definefontsize[\c!c] \definefontsize[\c!d]
+
+%D \macros
+%D {currentfontscale,currentfontbodyscale}
+%D
+%D Sometimes we need to have access to the font scale
+%D including the \type{a}||\type{d} sizes. The next macro
+%D returns the current scaling factor. Take a look at
+%D \type {cont-log.tex} for an example of its use.
+
+\def\currentfontscale
+ {\csname\??ft\s!default
+ \ifcsname\??ft\s!default\xfontsize\endcsname \xfontsize \else
+ \ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi
+ \endcsname}
+
+\def\currentfontbodyscale
+ {\csname\??ft\s!default
+ \ifcsname\??ft\s!default\fontsize\endcsname \fontsize \else
+ \ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi
+ \endcsname}
+
+\setvalue{\??ft\s!default}{1}
+
+%D Both alternatives use \type {\xfontsize}, a macro that
+%D expands to the current size in terms of \type {a} \unknown
+%D \type {d}, nothing, or \type {x} \unknown \type {xx}.
+
+\def\xfontsize{\ifcase\currentxfontsize\fontsize\or\c!x\else\c!xx\fi}
+
+%D A typical use of this command is in commands that switch
+%D to another font bypassing the font mechanism:
+%D
+%D \starttyping
+%D \font\myfont=\truefontname{MyFont} at \the\dimexpr\currentfontscale\bodyfontsize\relax
+%D \stoptyping
+
+%D Now we enter the area of font switching. The switching
+%D mechanism has to take care of several situations, like:
+%D
+%D \startitemize[packed]
+%D \item changing the overal document fonts (including margins,
+%D headers and footers)
+%D \item changing local fonts (only the running text)
+%D \item smaller and even more smaller alternatives (super-
+%D and subscripts)
+%D \stopitemize
+%D
+%D \TEX\ offers a powerfull family mechanism for super- and
+%D subscripts in math mode. In text mode however, we don't use
+%D families for the smaller alternatives, and therefore have
+%D to take care of it otherwise.
+
+%D \macros
+%D {definebodyfontenvironment,setupbodyfontenvironment}
+%D
+%D The relationship between the several sizes of a font, is
+%D defined by:
+%D
+%D \showsetup{definebodyfontenvironment}
+%D
+%D Later on we will see how these parameters are used, so for
+%D the moment we stick with an example:
+%D
+%D \starttyping
+%D \definebodyfontenvironment
+%D [12pt]
+%D [ text=12pt,
+%D script=9pt,
+%D scriptscript=7pt,
+%D x=10pt,
+%D xx=8pt,
+%D big=12pt,
+%D small=10pt]
+%D \stoptyping
+%D
+%D The first argument specifies the bodyfont size to which the
+%D settings apply. All second parameters are specified in
+%D dimensions and tell us more about related sizes.
+%D
+%D Afterwards, one can change values with
+%D
+%D \showsetup{setupbodyfontenvironment}
+%D
+%D Due to the fact that \type{\c!text} and \type{\s!text} can
+%D have a similar meaning, and therefore can lead to an
+%D unwanted loop, we temporary redefine \type{\c!text}. For
+%D the moment this in only place that some trickery is needed
+%D to fool the multilingual interface.
+%D
+%D When instead of a size the keyword \type{unknown} is
+%D passed, fractions (relations) are used instead of fixed
+%D sizes.
+
+\let\bodyfontenvironmentlist\empty
+
+\newcount\@@fontdefhack
+
+\def\@@beginfontdef
+ {\ifcase\@@fontdefhack
+ \let\k!savedtext \k!text \let\k!text \s!text
+ \let\k!k!savedtext \k!k!text \let\k!k!text \!!plusone
+ \let\k!saveddefault \k!default \let\k!default \s!default
+ \let\k!k!saveddefault\k!k!default \let\k!k!default \!!plusone
+ \fi
+ \advance\@@fontdefhack \plusone }
+
+\def\@@endfontdef
+ {\advance\@@fontdefhack \minusone
+ \ifcase\@@fontdefhack
+ \let\k!k!default\k!k!saveddefault
+ \let\k!default \k!saveddefault
+ \let\k!k!text \k!k!savedtext
+ \let\k!text \k!savedtext
+ \fi}
+
+\def\definebodyfontenvironment
+ {\dotripleempty\dodefinebodyfontenvironment}
+
+\def\dodefinebodyfontenvironment[#1][#2][#3]% class size settings
+ {\ifthirdargument
+ \@@beginfontdef
+ \doifelse{#2}\s!default
+ {\getparameters[\??ft\s!default][#3]}
+ {\normalizebodyfontsize#2\to\tempbodyfontsize
+ \addtocommalist\tempbodyfontsize\bodyfontenvironmentlist
+ \@EA\dododefinebodyfontenvironment\@EA[\tempbodyfontsize][#1][#3]}%
+ \@@endfontdef
+ \else
+ \definebodyfontenvironment[\fontclass][#1][#2]% change */*
+ \fi}
+
+\def\dododefinebodyfontenvironment[#1][#2][#3]% size class settings
+ {\@@beginfontdef
+ \doifundefined{\??ft#2#1\c!em} % \s!text goes wrong in testing because
+ {\def\docommand##1% % the 12pt alternative will called when
+ {\scratchdimen#1\relax % typesetting the test (or so)
+ \scratchdimen\csname\??ft\s!default##1\endcsname\scratchdimen
+ \normalizebodyfontsize\scratchdimen\to\tempbodyfontsize
+ \setevalue{\??ft#2#1##1}{\tempbodyfontsize}}%
+ \processcommacommand[\fontsizelist]\docommand
+ \copyparameters
+ [\??ft#2#1][\??ft\s!default]
+ [\c!interlinespace,\c!em]}%
+ \getparameters[\??ft#2#1][#3]%
+ \@@endfontdef
+ % new code, see remark
+ \ifloadingfonts \else % only runtime
+ \doifundefined{\@size@#1} % only once
+ {\letvalue{\@size@#1}\empty % prevent loop
+ \defineunknownfont{#1}}% % safeguard
+ \fi
+ % so far
+ \setvalue{\@size@#1}{\docompletefontswitch[#1]}}
+
+%D {\bf Remark:} We need to cover the following cases,
+%D otherwise users can get confused:
+%D
+%D \starttyping
+%D \setupbodyfont[23pt]
+%D
+%D \definebodyfontenvironment[23pt]
+%D \setupbodyfont[23pt]
+%D
+%D \definebodyfontenvironment[23pt]
+%D \definebodyfont[23pt][rm,ss,tt][default]
+%D \setupbodyfont[23pt]
+%D \stoptyping
+
+%D Beware: while some font defs can be global, the bodyfont
+%D environment checks local. This means that multiple local
+%D checks resulting in definitions are not that efficient.
+%D So, apart from an occasional switch, one should define an
+%D environment at the outer level.
+
+\def\checkbodyfontenvironment[#1]%
+ {\definebodyfontenvironment[\fontclass][#1][]}
+
+% this one already catches both define/setup
+
+\def\setupbodyfontenvironment{\definebodyfontenvironment}
+
+% officially, but not needed (yet):
+%
+% \def\dosetupbodyfontenvironment[#1][#2][#3]% class size settings
+% {\ifthirdargument
+% \localbodyfontsize#2\relax
+% \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+% \doifundefinedelse{\??ft#1\normalizedbodyfontsize\c!em}
+% {\definebodyfontenvironment[#1][#2][#3]}%
+% {\getparameters[\??ft#1\normalizedbodyfontsize][#3]}%
+% \else
+% \localbodyfontsize#1\relax
+% \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+% \doifundefinedelse{\??ft\normalizedbodyfontsize\c!em}
+% {\definebodyfontenvironment[#1][#2]}%
+% {\getparameters[\??ft\normalizedbodyfontsize][#2]}%
+% \fi}
+
+%D Just a couple of interface macros:
+
+\def\bodyfontvariable#1%
+ {\??ft\ifcsname\??ft\fontclass#1\endcsname\fontclass\fi#1}
+
+\def\bodyfontinterlinespecs
+ {\bodyfontvariable{\normalizedbodyfontsize\c!interlinespace}}
+
+\def\bodyfontinterlinespace
+ {\csname\bodyfontinterlinespecs\endcsname}
+
+%D We default all parameters to the main bodyfont size (begin
+%D \type{#1}), so the next setup is valid too:
+%D
+%D \starttyping
+%D \definebodyfontenvironment[24pt]
+%D \stoptyping
+%D
+%D All parameters can be redefined when needed, so one does
+%D not have to stick to the default ones.
+
+%D \macros
+%D {definebodyfont}
+%D
+%D The next step in defining a bodyfont involves the actual font
+%D files, which can be recognized by their extension
+%D \type{tfm}. Installing those file is often beyond the
+%D scope of the user and up to the system administrator.
+%D
+%D \showsetup{definebodyfont}
+%D
+%D This commands takes three arguments: a (series of) bodyfont
+%D size(s), the style group to which the definitions belong,
+%D and an alternative, as specified by the \TEX\ (math) families,
+%D extended with~a, b~\unknown.
+%D
+%D We show two examples, that show all the alternative
+%D scaling options. The \type{\tfa} alternatives can be
+%D extended with \type{\bfa}, \type{\slb}, etc. or even
+%D \type{e} and higher alternatives.
+%D
+%D \starttyping
+%D \definebodyfont [12pt] [rm]
+%D [tf=cmr12,
+%D bf=cmbx12,
+%D it=cmti12,
+%D sl=cmsl12,
+%D bi=cmbxti10 at 12pt,
+%D bs=cmbxsl10 at 12pt,
+%D tfa=cmr12 scaled \magstep1,
+%D tfb=cmr12 scaled \magstep2,
+%D tfc=cmr12 scaled \magstep3,
+%D tfd=cmr12 scaled \magstep4,
+%D sc=cmcsc10 at 12pt]
+%D
+%D \definebodyfont [12pt,11pt,10pt,9pt,8pt] [rm]
+%D [tf=lbr sa 1,
+%D bf=lbd sa 1,
+%D it=lbi sa 1,
+%D sl=lbsl sa 1,
+%D bi=lbdi sa 1,
+%D bs=lbdi sa 1,
+%D tfa=lbr sa 1.200,
+%D tfb=lbr sa 1.440,
+%D tfc=lbr sa 1.728,
+%D tfd=lbr sa 2.074,
+%D sc=lbr sa 0.833]
+%D \stoptyping
+%D
+%D The second example shows that we can define more sizes at
+%D once. The main difference between these examples is that the
+%D Computer Modern Roman come in many design sizes. This means
+%D that there we cannot define them in bulk using \type{sa}.
+%D Instead of \type{rm} (roman) one can define \type{ss} (sans
+%D serif), \type{tt} (teletype), \type{hw} (hand written),
+%D \type{cg} (calygraphic) and whatever styles.
+%D
+%D The first argument may be a comma separated list. This,
+%D combined with specifications using \type{sa} can save a lot
+%D of typing. Although all arguments should be specified, we
+%D treat the second argument as optional.
+%D
+%D Defining a bodyfont involves two actions: defining the
+%D specific style related alternatives, like \type{\rma},
+%D \type{\bfa} and \type{\rmsla}, and storing the definitions
+%D of their bodyfont size related fonts. The first step is
+%D bodyfont independant but executed every time. This permits
+%D user definitions like \type{\tfw} or \type{\bfq} for real
+%D large alternatives.
+
+\def\definebodyfont
+ {\doquadrupleempty\redefinebodyfont}
+
+\def\redefinebodyfont[#1][#2][#3][#4]%
+ {\iffourthargument
+ \processcommacommand[#1]{\reredefinebodyfont[#2][#3][#4]}%
+ \else
+ \dodefinebodyfont[#1][#2][#3]%
+ \fi}
+
+\def\reredefinebodyfont[#1][#2][#3]#4%
+ {\pushmacro\fontclass
+ \doifelse{#4}\s!default
+ {\let\fontclass\empty}
+ {\def\fontclass{#4}}%
+ \definebodyfont[#1][#2][#3]%
+ \popmacro\fontclass}
+
+\def\dodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
+ {\ifthirdargument
+ \doifnumberelse{#1}
+ {\doifassignmentelse{#3}
+ {% [12pt] [style] [settings]
+ \doifundefined{#2}{\expanded{\definefontstyle[#2][#2]}}% new
+ \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}}
+ {% [12pt] [style] [identifier]
+ \dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier
+ {% [identifier] [style] [settings] % see ***
+ \setvalue{\s!default#1#2}##1##2{\expanded{\xdodefinebodyfont[##1][##2][#3]}}}%
+ \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.
+ \fi\fi}
+
+\def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
+ {%\writestatus{[#1]}{[#2][#3]}%
+ \checkrelativefontsize{#2}% rather new, inherit from other defs
+ \ifundefined{#2}\expanded{\definefontstyle[#2][#2]}\fi % new
+ \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}%
+ \let\relativefontsize\defaultrelativefontsize}
+
+\def\dododefinebodyfont#1#2#3% style defs body
+ {\checkbodyfontenvironment[#3]% just to be sure.
+ \processcommalist[#2]{\dodododefinebodyfont{#1}{#3}}}
+
+\def\dodododefinebodyfont#1#2#3% style body def
+ {\dododododefinebodyfont{#1}{#2}[#3]}
+
+\def\iflocalclassfonts{\ifx\fontclass\empty}
+
+\def\dododododefinebodyfont#1#2[#3#4#5=#6]% style body def
+ {\ifundefined{#1#3#4#5}%
+ %\checkbodyfont{#2}{#1}{#3#4}{#5}% not \definefontsize[#5]
+ \checkbodyfont{#1}{#3#4}{#5}% not \definefontsize[#5]
+ \fi
+ \iflocalclassfonts
+ \letbeundefined{*\fontclass#2#1#3#4#5*}%
+ \scratchtoks{#6}%
+ \expanded{\unexpanded\noexpand\setvalue{#2#1#3#4#5}%
+ {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
+ {#2#1#3#4#5}{\the\scratchtoks}}}%
+ \else
+ %\expanded{\writestatus{defining}{[\fontclass][#2#1#3#4#5] \resolvefontname#6 }}%
+ \global\letbeundefined{*\fontclass#2#1#3#4#5*}%
+ \scratchtoks{#6}%
+ \expanded{\unexpanded\noexpand\setgvalue{\fontclass#2#1#3#4#5}%
+ {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
+ {#2#1#3#4#5}{\the\scratchtoks}}}%
+ \fi}
+
+% \def\checkbodyfont#1#2#3#4% body style alt size / gdef % #4 can be empty
+% {\def\c!!mm{#2}%
+% \ifx\c!!mm\c!mm % prevents \max and alike (re)defs
+% \unexpanded\setgvalue {#2}{\setcurrentfontstyle {#2}}% \rm
+% \unexpanded\setgvalue {#3}{\setcurrentfontalternative {#3}}% \sl
+% \else
+% \unexpanded\setgvalue {#2#4}{\setcurrentfontstylesize {#2}{#4}}% \rma
+% \unexpanded\setgvalue {#3#4}{\setcurrentfontalternativesize {#3}{#4}}% \sla
+% \unexpanded\setgvalue {#2#3#4}{\setcurrentfontstylealternativesize{#2}{#3}{#4}}% \rmsla
+% \unexpanded\setgvalue {#2}{\setcurrentfontstyle {#2}}% \rm
+% \unexpanded\setgvalue {#3}{\setcurrentfontalternative {#3}}% \sl
+% \unexpanded\setgvalue {#2\c!x}{\setcurrentfontxstylealternative {#2}}% \rmx
+% \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxstylealternative {#2}}% \rmxx
+% \unexpanded\setgvalue {#3\c!x}{\setcurrentfontxalternative {#3}}% \slx
+% \unexpanded\setgvalue{#3\c!xx}{\setcurrentfontxxalternative {#3}}% \slxx
+% \unexpanded\setgvalue {#2#3}{\setcurrentfontstylealternative {#2}{#3}}% \rmsl
+% \fi}
+%
+% leaner
+
+\def\checkbodyfont#1% tests for ttsl mmbf
+ {\def\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
+
+\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 {#1}{\setcurrentfontstyle {#1}}% \mm
+ \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}}% \sl
+
+\def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty
+ {%\message{!t #1 #2 #3!}%
+ \unexpanded\setgvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% \rma
+ \unexpanded\setgvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% \sla
+ \unexpanded\setgvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \rmsla
+ \unexpanded\setgvalue {#1}{\setcurrentfontstyle {#1}}% \rm
+ \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}% \sl
+ \unexpanded\setgvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% \rmx
+ \unexpanded\setgvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% \rmxx
+ \unexpanded\setgvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% \slx
+ \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% \slxx
+ \unexpanded\setgvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}}% \rmsl
+
+\def\dodefinedefaultbodyfont[#1][#2][#3]% sizes styles identifier
+ {\def\dododefinedefaultbodyfont##1%
+ {\def\dodododefinedefaultbodyfont####1%
+ {\def\dododododefinedefaultbodyfont########1%
+ {\doifdefined{\s!default########1####1}
+ {% [12pt] [style] [identifier]
+ \getvalue{\s!default########1####1}{##1}{####1}}}%
+ \processcommalist[#3]\dododododefinedefaultbodyfont}%
+ \processcommalist[#2]\dodododefinedefaultbodyfont}%
+ \processcommalist[#1]\dododefinedefaultbodyfont}
+
+%D Unknown families are added to the family list! For the
+%D moment we also set the direct calls here. Some day a better
+%D solution will be implemented. The good news is that unknown
+%D fonts are defined automatically.
+
+\newif\ifdefiningunknownfont
+
+\def\dodefineunknownfont#1#2%
+ {\doifdefined{\??ft\s!default#2}
+ {\donetrue
+ \scratchdimen#1\relax
+ \scratchdimen\csname\??ft\s!default#2\endcsname\scratchdimen
+ \normalizebodyfontsize\scratchdimen\to\!!stringa
+ \letvalue{\??ft#1#2}\!!stringa}}
+
+\def\dodefineunknownbodyfont#1#2% see ***
+ {\doifdefined{\s!default\s!default#2}% somehow related to */*
+ {\donetrue
+ \getvalue{\s!default\s!default#2}{#1}{#2}}}
+
+\def\dodefineunknownsubfont#1#2%
+ {\doifundefined{\@size@\getvalue{\??ft#1#2}}
+ {\donetrue
+ \defineunknownfont{\getvalue{\??ft#1#2}}}}
+
+\def\defineunknownfont#1%
+ {\let\c!savedtext\c!text
+ \let\c!text\s!text
+ \donefalse
+ \processcommacommand[\fontsizelist]{\dodefineunknownfont{#1}}%
+ \let\c!text\c!savedtext
+ \ifdone
+ \donefalse
+ \processcommacommand
+ [\stylelist]
+ {\dodefineunknownbodyfont{#1}}%
+ \ifdone
+ \donefalse
+ \setvalue{\@size@#1}{\docompletefontswitch[#1]}%
+ \ifdefiningunknownfont \else
+ \definingunknownfonttrue
+ \processcommacommand[\fontsizelist]{\dodefineunknownsubfont{#1}}%
+ \definingunknownfontfalse
+ \fi
+ \fi
+ \ifdone
+ \showmessage\m!fonts{14}{#1}%
+ \fi
+ \fi}
+
+%D These macros show that quite some definitions take place.
+%D Fonts are not loaded yet! This means that at format
+%D generation time, no font files are preloaded.
+
+%D A previous implementation used:
+%D
+%D \starttyping
+%D \type {\setvalue{name}{\donottest...}}
+%D \stoptyping
+%D
+%D instead of the more memory hungry:
+%D
+%D \starttyping
+%D \unexpanded\setvalue{name}{...}
+%D \stoptyping
+%D
+%D The first alternative saves about 500 hash entries (about
+%D 2.5\% of the total number of entries used. The second
+%D alternative is currently used, because that one can more
+%D easily be made \ETEX\ aware.
+
+%D \macros
+%D {everybodyfont,Everybodyfont,everyglobalbodyfont}
+%D
+%D Every change in bodyfont size has conseqences for the baseline
+%D distance and skips between paragraphs. These are initialized
+%D in other modules. Here we only provide the hooks that
+%D garantees their handling.
+
+%D At the system level one can initialize thing like:
+%D
+%D \starttyping
+%D \appendtoks \setupspacing \to \everybodyfont
+%D \stoptyping
+%D
+%D While users can add their own non standard commands like:
+%D
+%D \starttyping
+%D \EveryBodyFont{\message{changing to bodyfont \the\bodyfontsize}}
+%D \stoptyping
+%D
+%D Personnaly I never felt the need for such extensions, but
+%D at least its possible.
+
+%D \macros
+%D {globalbodyfontsize,localbodyfontsize}
+%D
+%D Next we'll do the tough job of font switching. Here we
+%D have to distinguish between the global (overal) bodyfont
+%D size and the local (sometimes in the textflow) size. We
+%D store these dimensions in two \DIMENSION\ registers.
+
+\newdimen\globalbodyfontsize \globalbodyfontsize=12pt
+\newdimen\localbodyfontsize \localbodyfontsize =\globalbodyfontsize
+
+%D \macros
+%D {bodyfontsize}
+%D
+%D These two registers are not to be misused in calculations.
+%D For this purpose we keep a copy:
+
+\newdimen\bodyfontsize \bodyfontsize=\globalbodyfontsize
+
+%D \macros
+%D {outputresolution}
+%D
+%D Sometimes (to be honest: not in this module) we need to
+%D take the system resolution into account. Therefore we also
+%D define a macro:
+
+\def\outputresolution {600}
+
+%D \macros
+%D {bodyfontfactor,bodyfontpoints}
+%D
+%D For multiplication purposes we keep an auxiliary counter
+%D and macro (here the expansion is not explicitly needed):
+
+\newcount\bodyfontpoints \dimensiontocount\bodyfontsize\bodyfontpoints
+
+\edef\bodyfontfactor{\withoutpt\the\bodyfontsize}
+
+%D When we assign for instance 12pt to a \DIMENSION\ register
+%D the \type{\the}'d value comes out as 12.0pt, which is
+%D often not the way users specify the bodyfont size. Therefore
+%D we also store the normalized value.
+
+\chardef\fontdigits=1
+
+\def\normalizebodyfontsize#1\to#2%
+ {\scratchdimen#1\relax
+ \ifcase\fontdigits\advance\scratchdimen.5\points\fi
+ \@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\scratchdimen00\to#2}
+
+\def\donormalizedbodyfontsize#1.#2#3#4\to#5% \points ?
+ {\edef#5%
+ {#1%
+ \ifcase\fontdigits\or
+ \ifcase#2 \else.#2\fi % and not: \ifcase#2\else ...
+ \else
+ \ifcase#2#3 \else.#2\ifcase#3 \else#3\fi\fi % not: \ifcase#2#3\else ...
+ \fi
+ \s!pt}}
+
+\normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+
+%D To be internationalized:
+
+\def\korpsgrootte {\bodyfontsize}
+\def\korpspunten {\bodyfontpoints}
+
+%D some day.
+
+%D \macros
+%D {fontstyle,fontalternative,fontsize}
+%D
+%D Within a bodyfont, fonts can come in different sizes. For
+%D instance \type{\tf} is accompanied by \type{\tfa},
+%D \type{\tfb} etc. The first two characters denote the
+%D alternative, while the third character in these sequences
+%D represents the size. The actual size is saved in a macro
+%D
+%D The style, being roman (\type{\rm}), sans serif (\type{\ss})
+%D etc. is also available in a macro in \type{rm}, \type{ss}
+%D etc. form:
+
+\let\defaultfontalternative = \c!tf
+\let\defaultfontstyle = \empty
+\let\defaultfontsize = \empty
+
+\let\fontalternative = \defaultfontalternative
+\let\fontstyle = \defaultfontstyle
+\let\fontsize = \defaultfontsize
+
+%D {\em The following approach is obsolete.}
+%D
+%D All things related to fonts are grouped into files with
+%D names like \type{font-cmr}. These files are loaded by:
+
+\def\resetfontdefinitionfile[#1]%
+ {\letbeundefined{\c!file\f!fontprefix#1}}
+
+\newif\ifloadfontfileonce
+
+\def\doreadfontdefinitionfile#1#2% #1 = set/switch state
+ {\doifundefined{\c!file\f!fontprefix#2}%
+ {\ifloadfontfileonce
+ \letvalue{\c!file\f!fontprefix#2}\empty
+ \fi
+ \makeshortfilename[\truefilename{\f!fontprefix#2}]%
+ \startreadingfile
+ \readsysfile\shortfilename
+ {\showmessage\m!fonts2{#2}}
+ {\showmessage\m!fonts3{#2}}%
+ \stopreadingfile}}
+
+%D When \type {\loadfontfileoncetrue}, such files are
+%D only loaded once! This permits redundant loading, but at
+%D the same time forced grouping when we want continuously mix
+%D all kind of font, which of course is a kind of
+%D typographically sin. The \type{"} is made inactive if
+%D needed to prevent problems with loading files that use this
+%D character in numbers.
+
+\def\doswitchpoints[#1]%
+ {\expanded{\dodoswitchpoints{#1}}}
+
+\def\dodoswitchpoints#1%
+ {\doifundefined{\@size@#1}
+ {\defineunknownfont{#1}}%
+ %\defineunknownfontstyles{#1}%
+ \doifdefinedelse{\@size@#1}
+ {\getvalue{\@size@#1}%
+ \localbodyfontsize#1\relax
+ \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+ \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}}}
+
+%D \TEX\ loads font metric files like \type{cmr10.tfm} and
+%D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files
+%D are {\em preloaded}. This means that the font files are
+%D loaded, but not accessible yet by name. This is accomplished
+%D by saying:
+%D
+%D \starttyping
+%D \font\preloaded=cmr10 at 11pt
+%D \stoptyping
+%D
+%D and using the name \type{\preloaded} again and again, so
+%D fonts are indeed loaded, but unnamed, and therefore
+%D unaccessible. In \CONTEXT\ we don't preload fonts, not even
+%D the \PLAIN\ \TEX\ ones, although users can access them. Now
+%D why is this done?
+
+%D Defining fonts using \type{\definebodyfont} takes time, so we
+%D prefer to predefine at least the Computer Modern Roman
+%D fonts. However, loading all those fonts at definition time
+%D would take both time and space. But even worse, once fonts
+%D are loaded into memory, their encoding vector is fixed,
+%D which is a handicap when we want to distribute the compact
+%D \type{fmt} files. So what we want to do is defining fonts in
+%D a way that postpones the loading. We accomplish this by only
+%D loading the fonts when we switch to another bodyfont size.
+%D Among the other alternatives, such as loading the font at
+%D the moment of activation and redefining the activation
+%D macro afterwards, this proved to be the most efficient
+%D alternative.
+%D
+%D The next few macros take care of the one exeption on this
+%D scheme. When at format generation time we load the default
+%D font file, the one that defines the Computer Modern Fonts,
+%D we don't want the fonts metrics to end up in the format
+%D file, so we temporary prohibit loading. This means that at
+%D runtime we have to load the default bodyfont size just before
+%D we start typesetting.
+%D
+%D Therefore we have to signal the font switching macros that
+%D we are preloading fonts. As long as the next boolean is,
+%D true, no loading is done.
+
+\newif\ifloadingfonts \loadingfontstrue
+
+%D \macros
+%D {preloadfonts}
+%D
+%D Preloading is only called for once, during the startup
+%D sequence of a session. After the loading job is done, the
+%D macro relaxes itself and reset the signal.
+
+\def\preloadfonts % never called, needs a clean up
+ {\showmessage\m!fonts6{\normalizedbodyfontsize\normalspace\fontstyle}%
+ \global\loadingfontsfalse
+ \doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace
+ \global\let\preloadfonts\relax}
+
+% \prependtoks \preloadfonts \to \everydump % saves .1 s on a DELL P60 - 2GHZ
+
+%D Here comes the main font switching macros. These macros
+%D handle changes in size as well as returning to the global
+%D bodyfont size.
+
+\def\dosetfont#1#2% #1 = set/switch state
+ {\doifelse{#2}\v!global
+ {\restoreglobalbodyfont}
+ {\processcommacommand[#2]{\dodosetfont{#1}}% ##1 get also passed
+ \ifloadingfonts\else
+ \doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \fi}%
+ \chardef\currentxfontsize\zerocount}
+
+\def\dodosetfont#1#2% #1 = set/switch state | check fo rempty, else space
+ {\doifsomething{#2}{\dododosetfont{#1}{#2}{\showmessage\m!fonts4{#2}}}}
+
+\def\dododosetfont#1#2#3% #1 = set/switch state
+ {\doifnumberelse{#2}
+ {\dodododosetfont{#1}{#2}{#3}}
+ {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#2}}
+ {\edef\fontstep{\csname\bodyfontvariable\normalizedbodyfontsize\interfaced{#2}\endcsname}%
+ \expanded{\dodododosetfont{#1}{\fontstep}}{#3}}
+ {\doifelse{#2}\v!reset
+ {\let\fontstyle\empty % new 31/7/2006
+ \let\fontsize \empty}
+ {\doifdefinedelse{\@style@#2}
+ {\edef\fontstyle{#2}}
+ {\doreadfontdefinitionfile{#1}{#2}}}}}}
+
+\def\dodododosetfont#1#2#3% #1 = set/switch state
+ {\scratchdimen#2\relax
+ \normalizebodyfontsize\scratchdimen\to\normalizedsetfont
+ \doifundefined{\@size@\normalizedsetfont}
+ {\defineunknownfont{#2}}%
+ \doifdefinedelse{\@size@\normalizedsetfont}
+ {\localbodyfontsize\normalizedsetfont
+ \let\normalizedbodyfontsize\normalizedsetfont}
+ {#3\dosetsubstitutefont{#1}{#2}}}
+
+%D In the previous macros we use \type{\currentxfontsize} to
+%D hold the current x||size of the font. This enables us to
+%D support for instance \type{\sl} inside a \type{\tx} switch.
+
+\chardef\currentxfontsize=0
+
+%D When users specify for instance a 13 point bodyfont while no
+%D such bodyfont is defined, the system automatically tries to
+%D find a best fit, that is the nearest smaller defined
+%D bodyfontzize. A smaller one is definitely better than a larger
+%D one, simply because otherwise a lot of overfull box messages
+%D are more probable to occur. By taking a value slightly
+%D smaller than half a point, we can use the next method.
+
+\def\dosetsubstitutefont#1#2% #1 = set/switch state
+ {\scratchdimen#2\relax
+ \advance\scratchdimen .499\points
+ \dimensiontocount\scratchdimen\scratchcounter
+ \advance\scratchcounter \minusone
+ \ifnum\scratchcounter>\plusthree
+ \dododosetfont{#1}{\the\scratchcounter\s!pt}{}%
+ \fi}
+
+% The following bunch of macros deals with the (run time)
+% expansion of names onto the definitions made by \type
+% {\definebodyfont}.
+
+% \let\fontbody \empty % ... 10pt 11pt 12pt ...
+% \let\fontstyle \empty % rm ss tt mm hw cg ...
+% \let\fontalternative\empty % tf bf sl it bs bi sc ...
+% \let\fontsize \empty % xy-abcd ...
+
+\def\defaultfontbody{\normalizedbodyfontsize}
+
+\let\fontbody\defaultfontbody
+
+\let\fontclass\empty \let\globalfontclass\fontclass
+
+\def\setcurrentfontclass#1%
+ {\edef\fontclass{#1}}
+
+\let\defaultfontstyle \c!rm
+\let\defaultfontalternative \c!tf
+\let\defaultfontsize \empty
+
+%D \macros
+%D {bigmath,nobigmath}
+%D
+%D We can inhibit this slow||downer with:
+
+% these can best be combined
+
+% 0=never 1=everymath 2=always
+
+\chardef\synchronizebigmathflag=1
+
+\appendtoks
+ \ifcase\synchronizebigmathflag
+ % never
+ \or
+ \synchronizebigmath
+ \or
+ % always
+ \fi
+\to \everymathematics
+
+\def\nobigmath{\chardef\synchronizebigmathflag 0 }
+\def\bigmath {\chardef\synchronizebigmathflag 2 \synchronizebigmath}
+
+\let\bigmathfontsize\empty
+
+\def\synchronizebigmath
+ {\ifx\bigmathfontsize\fontsize
+ % already in sync
+ \else
+ \let\bigmathfontsize\fontsize
+ \synchronizemath \synchronizetext
+ \fi}
+
+\def\checkbigmathsynchronization
+ {\ifcase\synchronizebigmathflag
+ % never
+ \or
+ \ifmmode \synchronizebigmath \fi
+ \or
+ \synchronizebigmath
+ \fi}
+
+%D So far for synchronisation.
+
+\def\dosetcurrentfontsize#1%
+ {\edef\fontsize{#1}%
+ \checkbigmathsynchronization}
+
+\def\dosetcurrentfontalternative#1%
+ {\edef\fontalternative{#1}%
+ \ifmmode % maybe no test, or actually, an option
+ \fam\csname\fontalternative\s!fam\endcsname
+ \fi}
+
+\def\setcurrentfont#1#2#3#4%
+ {%\message{[1 #1 #2 #3 #4]}%
+ \edef\fontbody{#1}%
+ \edef\fontstyle{#2}%
+ \dosetcurrentfontalternative{#3}%
+ \dosetcurrentfontsize{#4}%
+ \synchronizefont}
+
+\def\setcurrentfontbody#1%
+ {%\message{[2 #1]}%
+ \edef\fontbody{#1}%
+ \synchronizefont}
+
+% For Taco: optional fall backs:
+
+\ifx\checkfontclass\undefined \let\checkfontclass\gobbleoneargument \fi % implemented in type-ini
+
+\def\setcurrentfontstyle#1%
+ {%\message{[3 #1]}%
+ \checkfontclass{#1}%
+ \edef\fontstyle{#1}%
+ \ifmmode\mr\fi % otherwise \rm not downward compatible
+ \synchronizefont}
+
+\def\setcurrentfontbodyalternative#1#2%
+ {%\message{[4 #1 #2]}%
+ \edef\fontbody{#1}%
+ \dosetcurrentfontalternative{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontalternative#1%
+ {%\message{[5 #1]}%
+ \dosetcurrentfontalternative{#1}%
+ \synchronizefont}
+
+\def\setcurrentfontsize#1%
+ {%\message{[6 #1]}%
+ \dosetcurrentfontsize{#1}%
+ \synchronizefont}
+
+\def\setcurrentfontstylealternative#1#2% \rmsl
+ {%\message{[7 #1 #2]}%
+ \edef\fontstyle{#1}%
+ \dosetcurrentfontalternative{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontstylesize#1#2% \rmsla
+ {%\message{[8 #1 #2]}%
+ \edef\fontstyle{#1}%
+ \dosetcurrentfontsize{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontalternativesize#1#2% \sla
+ {%\message{[9 #1 #2]}%
+ \dosetcurrentfontalternative{#1}%
+ \dosetcurrentfontsize{#2}%
+ \synchronizefont}
+
+\def\setcurrentfontstylealternativesize#1#2#3% \rmsla
+ {%\message{[10 #1 #2 #3]}%
+ \edef\fontstyle{#1}%
+ \dosetcurrentfontalternative{#2}%
+ \dosetcurrentfontsize{#3}%
+ \synchronizefont}
+
+%D In principle one can assign alternative fallback routines.
+%D Some day we will.
+
+\newtoks\fontstrategies
+\newif\iftryingfont
+
+\let\fontstrategy\relax
+
+\def\synchronizefont
+ {\tryingfonttrue
+ \ifx\fontclass\empty\else
+ \global\let\fontstrategy\dofontclassstrategy
+ \the\fontstrategies \relax % \relax still needed ?
+ \fi
+ \iftryingfont
+ \global\let\fontstrategy\dofontstrategy
+ \the\fontstrategies \relax % \relax still needed ?
+ \fi
+ \ifskipfontcharacteristics
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+\def\dofontstrategy#1#2#3#4#5%
+ {\ifcsname#2#3#4#5\endcsname
+ #1\csname#2#3#4#5\endcsname \tryingfontfalse
+ \fi}
+
+\def\dofontclassstrategy#1#2#3#4#5%
+ {\ifcsname\fontclass#2#3#4#5\endcsname
+ #1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse
+ \fi}
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a
+ \fontbody \fontstyle \fontalternative \fontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- --- def % pt tt bf
+ \fontbody \fontstyle \fontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def --- % pt tt tf a
+ \fontbody \fontstyle \defaultfontalternative \fontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def def % pt tt tf
+ \fontbody \fontstyle \defaultfontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- def def def % pt rm tf
+ \fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % def def def def % rm tf
+ \defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
+\fi \to \fontstrategies
+
+%D Let's synchronize:
+
+\newif\ifsynchronizefonts \synchronizefontstrue
+
+\prependtoks
+ \ifsynchronizefonts
+ \synchronizemath
+ \synchronizetext
+ \synchronizefont % problem: syncs last font
+ \fi
+\to \everybodyfont
+
+%D Setting the normal sized as well as the x and xx smaller
+%D sizes is accomplished by the next set of macros. When in
+%D math mode, the commands \type{\tx} and \type{\txx} are
+%D just a switch to the script and double script styles, but
+%D in text mode the values defined by the bodyfontenvironment are
+%D used. Here we also set \type{\currentxfontsize}.
+
+\def\dosetcurrentfontxxxalternative#1#2#3#4%
+ {\chardef\currentxfontsize#2\relax
+ \ifmmode
+ #4%
+ \else\ifcsname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname
+ \setcurrentfontbodyalternative{\csname\bodyfontvariable\normalizedbodyfontsize#3\endcsname}{#1}%
+ \fi\fi}
+
+\def\setcurrentfontxalternative#1%
+ {\dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle
+ \let\tx\txx}
+
+\def\setcurrentfontxxalternative#1%
+ {\dosetcurrentfontxxxalternative{#1}2\c!xx\scriptscriptstyle
+ \let\tx\empty
+ \let\txx\empty}
+
+\def\checknestedxfontsize % option
+ {\ifcase\currentxfontsize\else\ifx\fontsize\empty\else
+ \chardef\currentxfontsize\zeropoint
+ \let\fontsize\empty
+ \let\tx\normaltx
+ \let\txx\normaltxx
+ \fi\fi}
+
+\def\setcurrentfontxalternative#1%
+ {\checknestedxfontsize
+ \dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle
+ \let\tx\txx}
+
+\def\setcurrentfontxxalternative#1%
+ {\checknestedxfontsize
+ \dosetcurrentfontxxxalternative{#1}2\c!xx\scriptscriptstyle
+ \let\tx\empty
+ \let\txx\empty}
+
+% This alterative is not really needed, but for old time's sake
+% we keep it there. We can speed it up when needed.
+
+% \def\setcurrentfontxstylealternative #1{\csname#1\endcsname\tfx}
+% \def\setcurrentfontxxstylealternative#1{\csname#1\endcsname\tfxx}
+
+\def\setcurrentfontxstylealternative #1{\csname#1\endcsname\tx}
+\def\setcurrentfontxxstylealternative#1{\csname#1\endcsname\txx}
+
+%D These macros also show us that when we call for \type{\tx},
+%D this macro is redefined to be \type{\txx}. Therefore calls
+%D like:
+%D
+%D \startbuffer
+%D {small \tx is \tx beautiful}
+%D {small \tx is \txx beautiful}
+%D {small \txx is \tx beautiful}
+%D {small \txx is \txx beautiful}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D result in:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D Setting the main size involves the style list and therefore
+%D takes a bit more time. Keep in mind that the fontsize is
+%D represented by a character or empty.
+
+\unexpanded\def\tx {\setcurrentfontxalternative \fontalternative}
+\unexpanded\def\txx{\setcurrentfontxxalternative\fontalternative}
+
+\let\normaltx \tx
+\let\normaltxx\txx
+
+%D \macros
+%D {definefontstyle}
+%D
+%D When setting of switching the overall style we can use the
+%D short identifier like rm and ss, but when defined we can
+%D also use more verbose names like roman or sansserif. Such
+%D names are defined by:
+%D
+%D \starttyping
+%D \definefontstyle [serif,rm] [rm]
+%D \definefontstyle [sansserif,ss] [ss]
+%D \stoptyping
+
+\def\dodefinefontstyle[#1][#2]%
+ {\rawdoifinsetelse{#2}{\stylelist}
+ {}%\debuggerinfo\m!fonts{unknown style #2}}
+ {\addtocommalist{#2}\stylelist
+ \showmessage\m!fonts8{#2\space (#1)}}%
+ % check kan hier
+ \def\docommand##1%
+ {\setvalue{\@shortstyle@##1}{#2}%
+ \setvalue{\@style@##1}{\csname#2\endcsname}}%
+ \processcommalist[#1]\docommand}
+
+\def\definefontstyle
+ {\dodoubleargument\dodefinefontstyle}
+
+\def\setfontstyle#1#2% #1:name (roman, romaan) #2:style (rm)
+ {\edef\fontstyle{#1}%
+ \setcurrentfontstyle\normalizedbodyfontsize}
+
+\chardef\defaultskewcharmi=127 % '177
+\chardef\defaultskewcharsy= 48 % '60
+
+% \def\dosetskewchar#1%
+% {\skewchar\font\ifx\@@fontskewchar\empty#1\else\@@fontskewchar\fi}
+
+\def\dosetskewchar#1#2%
+ {\ifx\@@fontskewchar\empty
+ \skewchar\textfont #1#2%
+ \skewchar\scriptfont #1#2%
+ \skewchar\scriptscriptfont#1#2%
+ \else
+ \skewchar\textfont #1\@@fontskewchar
+ \skewchar\scriptfont #1\@@fontskewchar
+ \skewchar\scriptscriptfont#1\@@fontskewchar
+ \fi}
+
+%D The previous macros show that it's is not always
+%D neccessary to define the whole bunch of fonts, take for
+%D instance the sequence:
+%D
+%D \starttyping
+%D \setupbodyfont
+%D [ams]
+%D
+%D \definebodyfont [24pt] [mm]
+%D [ma=msam10 at 24pt,
+%D mb=msbm10 at 24pt]
+%D
+%D \switchtobodyfont
+%D [24pt]
+%D
+%D This is a 24pt $\blacktriangleleft$
+%D \stoptyping
+%D
+%D Here we didn't define the 24 point bodyfont environment, so
+%D it's defined automatically. Of course one can always use the
+%D \TEX\ primitive \type{\font} to switch to whatever font
+%D needed.
+
+%D When asking for a complete font switch, for instance from 10
+%D to 12~points, the next macro does the job. First we
+%D normalize the size, next we define the current range of
+%D text, script and scriptscript sizes, then we set the text
+%D fonts and the math families and finally we activate the
+%D default typeface and also set the font specific parameters
+%D assigned to \type{\everybodyfont}
+
+\def\dosetbodyfontface#1#2%
+ {\edef#1{\csname\bodyfontvariable\normalizedbodyfontsize#2\endcsname}}
+
+\def\docompletefontswitch[#1]%
+ {\bodyfontsize#1\relax
+ \dimensiontocount\bodyfontsize\bodyfontpoints
+ \edef\bodyfontfactor{\withoutpt\the\bodyfontsize}%
+ \normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+ \dosetbodyfontface \textface \s!text
+ \dosetbodyfontface \scriptface \s!script
+ \dosetbodyfontface \scriptscriptface \s!scriptscript}
+
+\docompletefontswitch[12pt] % init
+
+%D \macros
+%D {setupbodyfont,switchtobodyfont}
+%D
+%D The next two macros are user ones. With \type{\setupbodyfont}
+%D one can set the document bodyfont size, font family, style
+%D and/or options defined in files, for example:
+%D
+%D \starttyping
+%D \setupbodyfont[cmr,ams,12pt,roman]
+%D \stoptyping
+%D
+%D This command affects the document as a whole: text, headers
+%D and footers. The second macro however affects only the text:
+%D
+%D \starttyping
+%D \switchtobodyfont[10pt]
+%D \stoptyping
+%D
+%D So we've got:
+%D
+%D \showsetup{setupbodyfont}
+%D \showsetup{switchtobodyfont}
+%D
+%D Both macros look alike. The second one also has to take
+%D all kind of keywords into account.
+
+\ifx\saveinterlinespace \undefined \let\saveinterlinespace \relax \fi
+\ifx\restoreinterlinespace\undefined \let\restoreinterlinespace\relax \fi
+
+\chardef\bodyfontsetstate=0
+
+\definecomplexorsimple\setupbodyfont
+
+\def\simplesetupbodyfont
+ {\restoreglobalbodyfont
+ \saveinterlinespace}
+
+\def\complexsetupbodyfont[#1]%
+ {\doifsomething{#1}
+ {\dosetfont1{#1}%
+ \globalbodyfontsize\localbodyfontsize
+ \normalizebodyfontsize\globalbodyfontsize\to\normalizedglobalbodyfontsize
+ \let\globalfontstyle\fontstyle
+ \ifloadingfonts\else
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace
+ \fi}}
+
+\unexpanded\def\switchtobodyfont[#1]%
+ {\doifsomething{#1}
+ {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}}
+ {\setbodyfontstep{#1}} % so we have a fast [small] switch
+ {\dosetfont0{#1}}%
+ \the\everybodyfont}} % indeed needed in case nothing is executed
+
+%D The following alternative is meant for math||to||text
+%D switching and will be optimized.
+
+\def\fastswitchtobodyfont#1%
+ {\ifcsname\??ft\normalizedbodyfontsize#1\endcsname
+ \edef\futurebodyfontsize
+ {\csname\??ft\normalizedbodyfontsize#1\endcsname}%
+ \ifcsname\@size@\futurebodyfontsize\endcsname
+ \csname\@size@\futurebodyfontsize\endcsname
+ \localbodyfontsize\futurebodyfontsize\relax
+ \fi
+ \fi
+ \csname\@style@\fontstyle\endcsname
+ \the\everybodyfont}
+
+%D Because the last macro can appear in arguments or be assigned
+%D to parameters, we protect this one for unwanted expansion.
+
+\def\dodosetmathfont#1%
+ {\setcurrentfontalternative{#1}%
+ % \doifdefinedelse{#1\s!fam} % adapted
+ % {\edef\mffam{\getvalue{#1\s!fam}}}
+ % {\edef\mffam{\getvalue{\c!nn\s!fam}}}%
+ \textfont \mrfam\textfont \mffam
+ \scriptfont \mrfam\scriptfont \mffam
+ \scriptscriptfont\mrfam\scriptscriptfont\mffam}
+
+\def\domffam#1%
+ {\csname\ifcsname#1\s!fam\endcsname#1\else\c!nn\fi\s!fam\endcsname}
+
+\def\mffam
+ {\domffam\fontalternative}
+
+\def\dosetmathfont
+ {\def\rm{\fam\mrfam}\dodosetmathfont}
+
+\def\enableencodinginmath
+ {\appendtoks
+ \everyhbox{\mr\everyhbox\emptytoks}%
+ \everyvbox{\mr\everyvbox\emptytoks}%
+ \to \everymathematics} % was \everymath
+
+% \enableencodinginmath % too untested to enable by default
+
+%D \starttyping
+%D $\cases{& \ccaron}$ $x=\hbox{\ccaron $x=\hbox{\ccaron}$}$
+%D \stoptyping
+
+%D The font specific features are bound to the filename.
+
+\def\updatefontparameters
+ {\edef\@@fontfeatures {\truefontdata\somefontfile\s!features}%
+ \edef\@@fontfallbacks{\truefontdata\somefontname\s!fallbacks}%
+ \edef\@@fontskewchar {\truefontdata\somefontfile\s!skewchar}} % will be replaced
+
+\def\setfontcharacteristics
+ {\the\everyfont}
+
+%D Predefined:
+
+% \installfontfeature[otf][tlig]
+% \installfontfeature[otf][trep]
+
+%D tricky but ok:
+
+\appendtoks\ctxlua{fonts.tfm.cleanup()}\to\everyshipout
+
+%D Todo:
+
+% \def\os{\groupedcommand{\setfontfeature{oldstyle}}{}}
+
+%D Experimental:
+
+\def\definefontfeature
+ {\dotripleargument\dodefinefontfeature}
+
+\def\dodefinefontfeature[#1][#2][#3]%
+ {\ctxlua{fonts.define.specify.preset_context("#1","#2","#3")}}
+
+\definefontfeature
+ [default]
+ [liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [smallcaps]
+ [liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [oldstyle]
+ [liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature % no calt
+ [arabic]
+ [mode=node,language=dflt,script=arab,
+ init=yes,medi=yes,fina=yes,isol=yes,
+ liga=yes,dlig=yes,rlig=yes,clig=yes,
+ mark=yes,mkmk=yes,kern=yes,curs=yes]
+
+%D Also new:
+
+% handy for manuals
+
+\def\otfchar#1{\ctxlua{fonts.otf.char("#1")}}
+
+%D: We cannot yet inherit because no colors are predefined.
+
+\definecolor[font:init][r=.75]
+\definecolor[font:medi][g=.75]
+\definecolor[font:fina][b=.75]
+\definecolor[font:isol][y=.75]
+\definecolor[font:mark][m=.75]
+\definecolor[font:rest][c=.75]
+
+%D goodies:
+%D
+%D \starttyping
+%D \showinstalledfonts[officinasans.*][all]
+%D \showinstalledfonts[officinaserif.*][all]
+%D \showinstalledfonts[officina.*itc.*][all]
+%D
+%D \showinstalledfonts[officina.*itc.*][all,new]
+%D \stoptyping
+
+\def\showinstalledfonts
+ {\dodoubleempty\doshowinstalledfonts}
+
+\def\doshowinstalledfonts[#1][#2]%
+ {\bgroup
+ \def\pattern{#1}%
+ \def\all{false}%
+ \def\reload{false}%
+ \doifnothing\pattern{\def\pattern{.*}}%
+ \processallactionsinset[#2][\v!new=>\def\reload{true},\v!all=>\def\all{true}]%
+ \ctxlua{fonts.names.table("#1",\reload,\all)}%
+ \egroup}
+
+%D Experimental!
+
+\def\installfontfeature
+ {\dodoubleargument\doinstallfontfeature}
+
+\def\doinstallfontfeature[#1][#2]%
+ {\ctxlua{fonts.install_feature("#1","#2")}}
+
+%D Not yet in \MKII.
+
+\def\fontfeatureslist
+ {\dodoubleargument\dofontfeatureslist}
+
+\def\dofontfeatureslist[#1][#2]% todo: arg voor type
+ {\ctxlua{tex.sprint(tex.ctxcatcodes,fonts.define.specify.context_tostring("#1","otf","\luaescapestring{#2}","yes","no",true,{"number"}))}}
+
+\attribute\zerocount\zerocount % first in list, so fast match
+
+\let\currentfeature\empty
+
+\def\featureattribute#1{\ctxlua{tex.sprint(fonts.define.specify.context_number("#1"))}}
+\def\setfontfeature #1{\edef\currentfeature{#1}\attribute\zerocount\featureattribute{#1}\relax}
+\def\resetfontfeature#1{\let\currentfeature\empty\attribute\zerocount\zerocount}
+
+\appendtoks
+ \setfontfeature\currentfeature
+\to \everylanguage
+
+%D The next auxilliary macro is an alternative to \type
+%D {\fontname}.
+
+% \def\purefontname#1{\expandafter\splitoffpurefontname\fontname#1 \\}
+%
+% extra level is needed:
+
+\def\purefontname#1{\@EA\splitoffpurefontname\@EA{\@EA{\@EA\unstringed\fontname#1}} \\}
+
+\def\splitoffpurefontname#1 #2\\{#1}
+
+%D \macros
+%D {switchstyleonly}
+%D
+%D For switching a style but keeping the alternative, there
+%D is:
+%D
+%D \starttyping
+%D {\bf text \switchstyleonly\ss text}
+%D {\bf text \switchstyleonly[ss]text}
+%D {\sl text \switchstyleonly[sansserif]text}
+%D \stoptyping
+
+\definecomplexorsimple\switchstyleonly
+
+\def\simpleswitchstyleonly#1% stupid version
+ {\complexswitchstyleonly[\strippedcsname#1]}
+
+\def\complexswitchstyleonly[#1]% todo : check
+ {\setcurrentfontstyle{\getvalue{\@shortstyle@#1}}%
+ \the\everybodyfont} % needed ?
+
+%D \macros
+%D {os,frak, goth, cal}
+%D
+%D Old style numerals can be typeset with \type{\os} and look
+%D like {\os 1234567890} instead of the more common looking
+%D 1234567890.
+%D
+%D On behalf of {\frac Tobias Burnus}, we define some more of
+%D these. Later we will link these names to real file names.
+
+% older
+%
+% \definefont [os] [OldStyle sa *]
+% \definefont [frak] [Fraktur sa *]
+% \definefont [goth] [Gothic sa *]
+% \definefont [cal] [Calligraphic sa *]
+% \definefont [bbd] [Blackboard sa *]
+%
+% newer
+
+\def\os {\mathortext{\fam\purefamily {oldstyle}}{\symbolicfont {OldStyle}}}
+\def\frak{\mathortext{\fam\purefamily {fraktur}}{\symbolicfont {Fraktur}}}
+\def\goth{\mathortext{\fam\purefamily {gothic}}{\symbolicfont {Gothic}}}
+\def\cal {\mathortext{\fam\purefamily{calligraphic}}{\symbolicfont{Calligraphic}}}
+\def\bbd {\mathortext{\fam\purefamily {blackboard}}{\symbolicfont {Blackboard}}}
+
+\definefontsynonym [OldStyle] [Serif]
+\definefontsynonym [Fraktur] [Serif]
+\definefontsynonym [Gothic] [Serif]
+\definefontsynonym [Calligraphic] [Serif]
+\definefontsynonym [Blackboard] [Serif]
+
+%D \macros
+%D {fraktur, gothic, calligraphic, blackboard}
+%D
+%D These macros assume that we use text fonts, and not math
+%D families.
+
+\ifx\mathtext\undefined \let\mathtext\hbox \fi
+
+\def\fraktur #1{\mathortext\domathtext\donothing{\frak#1}}
+\def\gothic #1{\mathortext\domathtext\donothing{\goth#1}}
+\def\calligraphic#1{\mathortext\domathtext\donothing{\cal #1}}
+\def\blackboard #1{\mathortext\domathtext\donothing{\bbd#1}}
+
+%D Torture test:
+%D
+%D \starttyping
+%D \usetypescript[modern] [texnansi]
+%D \usetypescript[lucida] [texnansi]
+%D \usetypescript[palatino][texnansi]
+%D \usetypescript[times] [texnansi]
+%D \usetypescript[fourier] [ec]
+%D
+%D \startbuffer
+%D \section{\blackboard{T\high{\blackboard{T}}} \blackboard{E}\high{\blackboard{E}} \blackboard{X}\high{\blackboard{X}}}
+%D
+%D {\fontclass: 123 \os123 \cal TEX $\os 123$}
+%D
+%D $\blackboard{T}^{\blackboard{T}} \blackboard{E}^{\blackboard{E}} \blackboard{X}^{\blackboard{X}}$
+%D \blackboard{T}\high{\blackboard{T}} \blackboard{E}\high{\blackboard{E}} \blackboard{X}\high{\blackboard{X}}
+%D \stopbuffer
+%D
+%D {\setupbodyfont[lucida] \getbuffer}
+%D {\setupbodyfont[modern] \getbuffer}
+%D {\setupbodyfont[palatino] \getbuffer}
+%D {\setupbodyfont[times] \getbuffer}
+%D {\setupbodyfont[fourier] \getbuffer}
+%D \stoptyping
+
+%D \macros
+%D {definebodyfontswitch}
+%D
+%D \PLAIN\ \TEX\ defines some macro's like \type{\tenpoint}
+%D to switch to a specific bodyfontsize. Just for the sake of
+%D compatibility we can define them like:
+%D
+%D \starttyping
+%D \definebodyfontswitch [twelvepoint] [12pt]
+%D \stoptyping
+%D
+%D We don't support language specific synonyms here, mainly
+%D because \PLAIN\ \TEX\ is english anyway.
+
+\def\dodefinebodyfontswitch[#1][#2]%
+ {\def\docommand##1{\setvalue{##1}{\switchtobodyfont[#2]}}%
+ \processcommalist[#1]\docommand}
+
+\def\definebodyfontswitch
+ {\dodoubleargument\dodefinebodyfontswitch}
+
+%D \macros
+%D {setsmallbodyfont,setmainbodyfont,setbigbodyfont}
+%D
+%D When we're typesetting at for instance 10pt, we can call for
+%D the \type{small} as well as the \type{big} alternative,
+%D related to this main size, using \type{\switchtobodyfont[small]}.
+%D The three alternatives can be activated by the next three
+%D system calls and are defined by the bodyfontenvironment.
+
+\let\fontstep\empty % we can use \fontstep for tracing purposes
+
+\def\setbodyfontstep#1%
+ {\edef\fontstep{\csname\bodyfontvariable\normalizedbodyfontsize\interfaced{#1}\endcsname}%
+ \doswitchpoints[\fontstep]%
+ \doswitchstyle[\fontstyle]}
+
+\unexpanded\def\setsmallbodyfont{\setbodyfontstep\v!small\the\everybodyfont}
+\unexpanded\def\setbigbodyfont {\setbodyfontstep\v!big \the\everybodyfont}
+
+\unexpanded\def\setmainbodyfont
+ {\doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace}
+
+%D \macros
+%D {restoreglobalbodyfont}
+%D
+%D Users can set whatever font available while typesetting text.
+%D Pagenumbers, footers, headers etc. however must be typeset
+%D in the main bodyfont and style of the document. Returning to
+%D the global state can be done with the next macro:
+
+\let\mainfontclass\empty
+
+\def\fullrestoreglobalbodyfont
+ {\let\fontsize\defaultfontsize
+ \let\fontbody\defaultfontbody
+ \chardef\currentxfontsize\zerocount
+ \let\fontclass\globalfontclass
+ \doswitchpoints[\normalizedglobalbodyfontsize]%
+ \doswitchstyle[\globalfontstyle]%
+ \redoconvertfont % just in case a pagebreak occurs
+ \tf
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace}
+
+\def\partialrestoreglobalbodyfont
+ {\let\fontsize\defaultfontsize
+ \let\fontbody\defaultfontbody
+ \chardef\currentxfontsize\zerocount
+ \redoconvertfont
+ \tf
+ \saveinterlinespace}
+
+\def\restoreglobalbodyfont % ook style etc
+ {\ifx\fontclass\globalfontclass
+ \ifx\fontstyle\globalfontstyle
+ \ifx\normalizedbodyfontsize\normalizedglobalbodyfontsize
+ \partialrestoreglobalbodyfont
+ \else
+ \fullrestoreglobalbodyfont
+ \fi
+ \else
+ \fullrestoreglobalbodyfont
+ \fi
+ \else
+ \fullrestoreglobalbodyfont
+ \fi}
+
+% in case of troubles: \let\restorebodyfont\fullrestoreglobalbodyfont
+
+%D This macro has to be called when entering the pagebody
+%D handling routine as well as the footnote insert routine.
+%D Users can access this feature |<|for instance when one wants
+%D to typeset tables and alike in the main bodyfont and style
+%D while the running text is temporary set to a smaller one|>|
+%D by saying \type{\switchtobodyfont[global]}.
+
+%D \macros
+%D {rasterfont}
+%D
+%D There are (at the moment) two situations in which we want to
+%D have fast access to a particular font. When we are using
+%D \TEX\ to typeset rasters, we use small {\rasterfont.}'s
+%D (a rather small period indeed), the same as \PICTEX\ uses
+%D for drawing purposes.
+
+\definefont [rasterfont] [Serif at 5pt]
+
+%D \macros
+%D {infofont}
+%D
+%D The second situation occurs when we enable the info mode,
+%D and put all kind of status information in the margin. We
+%D don't want huge switches to the main bodyfont and style, so
+%D here too we use a direct method.
+
+\let\infofont\relax % satisfy dep checker
+
+\definefont [infofont] [Mono at 6pt] % todo \the\everybodyfont
+
+%D \macros
+%D {definealternativestyle}
+%D
+%D In the main modules we are going to implement lots of
+%D parameterized commands and one of these parameters will
+%D concern the font to use. To suit consistent use of fonts we
+%D here implement a mechanism for defining the keywords that
+%D present a particular style or alternative.
+%D
+%D \starttyping
+%D \definealternativestyle [keywords] [\style] [\nostyle]
+%D \stoptyping
+%D
+%D The first command is used in the normal textflow, while the
+%D second command takes care of headings and alike. Consider
+%D the next two definitions:
+%D
+%D \starttyping
+%D \definealternativestyle [bold] [\bf] []
+%D \definealternativestyle [cap] [\cap] [\cap]
+%D \stoptyping
+%D
+%D A change \type{\bf} in a heading which is to be set in
+%D \type{\tfd} does not look that well, so therefore we leave
+%D the second argument of \type{\definealternativestyle} empty.
+%D When we capatalize characters using the pseudo small cap
+%D command \type{\cap}, we want this to take effect in both
+%D text and headings, which is accomplished by assigning both
+%D arguments.
+
+\def\dodefinealternativestyle[#1][#2][#3]%
+ {\def\docommand##1%
+ {\doifundefined{##1}{\setvalue{##1}{\groupedcommand{#2}{}}}%
+ \setvalue{\@letter@ ##1}{#2}%
+ \setvalue{\@noletter@##1}{#3}}%
+ \processcommalist[#1]\docommand}
+
+\def\definealternativestyle
+ {\dotripleempty\dodefinealternativestyle}
+
+\def\definestyle{\definealternativestyle}
+
+%D Maybe too geneneric, but probably ok is the following. (Maybe one
+%D day we will use a dedicated grouped command for styles.)
+
+\appendtoks
+ \let\groupedcommand\thirdofthreearguments
+\to \simplifiedcommands
+
+%D This command also defines the keyword as command. This means
+%D that the example definition of \type{bold} we gave before,
+%D results in a command \type{\bold} which can be used as:
+%D
+%D \startbuffer
+%D He's a \bold{bold} man with a {\bold head}.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \definealternativestyle[bold][\bf][]\getbuffer
+%D \stopvoorbeeld
+%D
+%D Such definitions are of course unwanted for \type{\cap}
+%D because this would result in an endless recursive call.
+%D Therefore we check on the existance of both the command and
+%D the substitution. The latter is needed because for instance
+%D \type{\type} is an entirely diferent command. That command
+%D handles verbatim, while the style command would just switch
+%D to teletype font. This is just an example of a tricky
+%D naming coincidence.
+
+%D \macros
+%D {doconvertfont,noconvertfont,
+%D dontconvertfont,redoconvertfont}
+%D
+%D After having defined such keywords, we can call for them by
+%D using
+%D
+%D \starttyping
+%D \doconvertfont{keyword}{text}
+%D \stoptyping
+%D
+%D We deliberately pass an argument. This enables us to
+%D assign converters that handle one agrument, like
+%D \type{\cap}.
+%D
+%D By default the first specification is used to set the style,
+%D exept when we say \type{\dontconvertfont}, after which the
+%D second specification is used. We can also directly call for
+%D \type{\noconvertfont}. In nested calls, we can restore the
+%D conversion by saying \type{\redoconvertfont}.
+
+% \def\@@dodoconvertfont#1{\csname\@letter@ #1\endcsname}
+% \def\@@donoconvertfont#1{\csname\@noletter@#1\endcsname}
+%
+% \unexpanded\def\dodoconvertfont#1% #2% we need the protection
+% {\doifdefinedelse{\@letter@#1} % in testing
+% {\doifelsenothing{#1}\gobbleoneargument\@@dodoconvertfont}
+% {\doifdefinedelse{#1}\getvalue \firstofoneargument}%
+% {#1}} % {#2}}
+%
+% \let\doconvertfont\dodoconvertfont
+%
+% \def\noconvertfont#1% #2%
+% {\doifdefinedelse{\@noletter@#1}
+% {\doifelsenothing{#1}\gobbleoneargument\@@donoconvertfont}\gobbleoneargument
+% {#1}} % {#2}}
+
+% \def\@@dodoconvertfont{\csname\@letter@ \p!defined\endcsname}
+% \def\@@donoconvertfont{\csname\@noletter@\p!defined\endcsname}
+% \def\@@redoconvertfont{\csname \p!defined\endcsname}
+%
+% \unexpanded\def\dodoconvertfont#1% #2% we need the protection
+% {\edef\p!defined{#1}%
+% \ifcsname\@letter@\detokenize\@EA{\p!defined}\endcsname
+% \ifx\p!defined\empty\else\@EAEAEA\@@dodoconvertfont\fi
+% \else
+% \ifcsname\detokenize\@EA{\p!defined}\endcsname\@EAEAEA\@@redoconvertfont\else\@EAEAEA\p!defined\fi
+% \fi} % {#2}}
+%
+% \unexpanded\def\noconvertfont#1% #2%
+% {\edef\p!defined{#1}%
+% \ifcsname\@noletter@\detokenize\@EA{\p!defined}\endcsname
+% \ifx\p!defined\empty\else\@EAEAEA\@@donoconvertfont\fi
+% \fi} % {#2}}
+
+\def\@@dodoconvertfont{\csname\@letter@ \p!defined\endcsname\gobbleoneargument}
+\def\@@donoconvertfont{\csname\@noletter@\p!defined\endcsname}
+\def\@@redoconvertfont{\csname \p!defined\endcsname\gobbleoneargument}
+
+% beware: p!defined can contain crap like \edef crap {...} and such
+% so we need to pass #1 as well
+
+\unexpanded\def\dodoconvertfont#1% #2% we need the protection
+ {\edef\p!defined{#1}%
+ \ifx\p!defined\empty\else
+ \@EA\dododoconvertfont
+ \fi{#1}}
+
+\def\dododoconvertfont % #1
+ {\ifcsname\@letter@\detokenize\@EA{\p!defined}\endcsname
+ \@EA\@@dodoconvertfont
+ \else\ifcsname\detokenize\@EA{\p!defined}\endcsname
+ \@EAEAEA\@@redoconvertfont
+ \else
+ \@EAEAEA\firstofoneargument
+ \fi\fi} % {#1}
+
+\let\doconvertfont\dodoconvertfont
+
+\unexpanded\def\noconvertfont#1% #2%
+ {\edef\p!defined{#1}%
+ \ifx\p!defined\empty
+ \else
+ \@EA\nononoconvertfont
+ \fi}
+
+\def\nononoconvertfont
+ {\ifcsname\@noletter@\detokenize\@EA{\p!defined}\endcsname
+ \@EA\@@donoconvertfont
+ \fi}
+
+%D Extras:
+
+\unexpanded\def\dontconvertfont
+ {\let\doconvertfont\noconvertfont}
+
+\unexpanded\def\redoconvertfont
+ {\let\doconvertfont\dodoconvertfont}
+
+%D These commands are not grouped! Grouping is most probably
+%D done by the calling macro's and would lead to unnecessary
+%D overhead.
+
+%D \macros
+%D {em,emphasistypeface,emphasisboldface}
+%D
+%D The next macro started as a copy of Donald Arseneau's
+%D \type{\em} (\TUGNEWS\ Vol.~3, no.~1, 1994). His
+%D implementation was a bit more sophisticated version of the
+%D standard \LATEX\ one. We furter enhanced the macro, so now
+%D it also adapts itself to boldface mode. Because we favor
+%D {\sl slanted} type over {\it italic}, we made the emphasis
+%D adaptable, for instance:
+%D
+%D \starttyping
+%D \def\emphasistypeface {\it}
+%D \def\emphasisboldface {\bi}
+%D \stoptyping
+%D
+%D But we prefer:
+
+\def\emphasistypeface {\sl}
+\def\emphasisboldface {\bs}
+
+%D or even better:
+
+% \def\doemphasistypeface#1#2%
+% {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!slanted#1%
+% {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!italic #2%
+% {\doifelsevalue{\??ft \normalizedbodyfontsize\c!em}\v!slanted#1%
+% {\doifvalue {\??ft \normalizedbodyfontsize\c!em}\v!italic #2}}}}
+
+\def\doemphasistypeface#1#2%
+ {\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\emphasistypeface{\doemphasistypeface\sl\it}
+\def\emphasisboldface{\doemphasistypeface\bs\bi}
+
+%D To be set with the default body font environment: \type
+%D {em} being \type {slanted} or \type {italic}.
+
+\newconditional\emneeded
+
+\newtoks\everyemphasized
+
+\unexpanded\def\em
+ {\relax
+ \ifdim\slantperpoint>\zeropoint
+ \settrue\emneeded
+ \else
+ \setfalse\emneeded
+ \fi
+ \setemphasisboldface % new
+ \ifx\fontalternative\c!it % \ifnum\fam=\itfam
+ \def\emphasistypeface{\it}\tf
+ \else\ifx\fontalternative\c!sl % \ifnum\fam=\slfam
+ \def\emphasistypeface{\sl}\tf
+ \else\ifx\fontalternative\c!bf % \ifnum\fam=\bffam
+ \emphasisboldface
+ \else\ifx\fontalternative\c!bs % \ifnum\fam=\bsfam
+ \def\emphasisboldface{\bs}\bf
+ \else\ifx\fontalternative\c!bi % \ifnum\fam=\bifam
+ \def\emphasisboldface{\bi}\bf
+ \else
+ \emphasistypeface
+ \fi\fi\fi\fi\fi
+ \the\everyemphasized
+ \ifconditional\emneeded\relax
+ \else
+ \expandafter\aftergroup
+ \fi
+ \emphasiscorrection}
+
+% compare ...
+%
+% \appendtoks \red \to \everyemphasized
+% \setupbodyfontenvironment [default] [em={\italic\color[red]}]
+
+%D The next feature was not present in previous versions. It
+%D takes care of \type {\em \bf ...} sitiations.
+
+\def\setemphasisboldface
+ {\let\normalbf\bf
+ \let\setemphasisboldface\relax
+ \unexpanded\def\bf
+ {%\relax
+ \let\bf\relax % new
+ \ifx\fontalternative\c!it % \ifnum\fam=\itfam
+ \bi
+ \else\ifx\fontalternative\c!sl % \ifnum\fam=\slfam
+ \bs
+ \else
+ \normalbf
+ \fi\fi
+ \let\bf\normalbf}}
+
+%D Donald's (adapted) macros take the next character into
+%D account when placing italic correction. As a bonus we also
+%D look for something that looks like a dash, in which case we
+%D don't correct.
+
+\let\italiccorrection=\/
+
+\def\emphasiscorrection
+ {\ifhmode
+ \expandafter\emphasislook
+ \fi}
+
+\def\emphasislook
+ {\begingroup
+ \beginrobusttest
+ \futurelet\next\emphasistest}
+
+\def\emphasistest
+ {\normalifcat\noexpand\next,%
+ \endrobusttest\expandafter\doemphasiscorrection
+ \normalelse
+ \endrobusttest\expandafter\dododoemphasiscorrection
+ \normalfi}
+
+\def\doemphasiscorrection
+ {\futurelet\next\dodoemphasiscorrection}
+
+\def\dodoemphasiscorrection
+ {\setbox\scratchbox\hbox{\next}%
+ \ifdim\ht\scratchbox=\zeropoint % probably a space
+ \expandafter\dododoemphasiscorrection
+ \else\ifdim\ht\scratchbox<.3ex
+ \expandafter\expandafter\expandafter\endgroup
+ \else
+ \expandafter\expandafter\expandafter\dododoemphasiscorrection
+ \fi\fi}
+
+\def\dododoemphasiscorrection
+ {\scratchskip\lastskip
+ \ifdim\scratchskip=\zeropoint\relax % == \ifzeropt\scratchskip
+ \italiccorrection\relax
+ \else
+ \unskip\italiccorrection\hskip\scratchskip
+ \fi
+ \endgroup}
+
+%D We end with some examples which show the behavior when
+%D some punctuation is met. We also show how the mechanism
+%D adapts itself to bold, italic and slanted typing.
+%D
+%D \startbuffer
+%D test {test}test \par
+%D test {\sl test}test \par
+%D test {\em test}test \par
+%D test {\em test}--test \par
+%D
+%D test {test}, test \par
+%D test {\em test}, test \par
+%D
+%D test {\em test {\em test {\em test} test} test} test \par
+%D test {\bf test {\em test {\em test} test} test} test \par
+%D test {\sl test {\em test {\em test} test} test} test \par
+%D test {\it test {\em test {\em test} test} test} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \startvoorbeeld
+%D \startpacked
+%D \getbuffer
+%D \stoppacked
+%D \stopvoorbeeld
+
+%D \macros
+%D {emphbf,emphit,emphsl,emphtf}
+%D
+%D The next emphasis alternatives are for \THANH. They adapt
+%D their style as good as possible.
+
+\def\emphbf{\groupedcommand{\bf\def\emphit{\bi}\def\emphsl{\bs}}{}}
+\def\emphit{\groupedcommand{\it\def\emphbf{\bi}\def\emphsl{\sl}}{}}
+\def\emphsl{\groupedcommand{\sl\def\emphbf{\bs}\def\emphit{\it}}{}}
+\def\emphtf{\groupedcommand{\tf\def\emphbf{\bf}\def\emphit{\it}\def\emphsl{\sl}}{}}
+
+%D \startbuffer
+%D TEXT {\emphbf text \emphit text \emphtf text \emphsl text} TEXT
+%D TEXT \emphbf{text \emphit{text} \emphtf{text} \emphsl{text}} TEXT
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+%D \macros
+%D {setfont}
+%D
+%D Every now and then we want to define a font directly, for
+%D instance when we typeset title pages. The next macro saves
+%D some typing:
+
+\def\setfont% geen \dosetfont mogelijk
+ {\def\next{\nextfont\setupinterlinespace}%
+ \afterassignment\next\font\nextfont=}
+
+%D One can call this macro as:
+%D
+%D \starttyping
+%D \setfont cmr10 at 60pt
+%D \stoptyping
+%D
+%D After which the font is active and the baselines and
+%D struts are set.
+
+%D \macros
+%D {showbodyfont}
+%D
+%D One can call for a rather simple overview of a bodyfont and the
+%D relations between its alternative fonts.
+%D
+%D \showsetup{showbodyfont}
+%D
+%D The current bodyfont (here we omitted the argument) looks like:
+%D
+%D \showbodyfont
+%D
+%D The implementation is rather straightforward in using
+%D \type{\halign}.
+
+\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run}
+
+%D \macros
+%D {showfontstrip, testminimalbaseline, showminimalbaseline}
+%D
+%D The next command can come in handy when combining
+%D different fonts into a collection (typeface) and
+%D determining optimal baseline distances.
+%D
+%D \showfontstrip \blank \showminimalbaseline
+
+\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run}
+
+%D \macros
+%D {showkerning}
+%D
+%D A goody is:
+%D
+%D \showkerning{Can you guess what kerning is?}
+
+\fetchruntimecommand \showkerning {\f!fontprefix\s!run}
+
+%D \macros
+%D {showbodyfontenvironment}
+%D
+%D The current bodyfontenvironment is:
+%D
+%D \showbodyfontenvironment
+%D
+%D This overview is generated using:
+%D
+%D \showsetup{showbodyfontenvironment}
+
+\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run}
+
+%D \macros
+%D {showfont,showfontstyle,showligatures}
+%D
+%D The following command generates a fontmap:
+%D
+%D \startbuffer
+%D \showfont[SansBold at 12pt]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Below the table the name, encoding, mapping and handling are
+%D shown. Special characters like the \type {\skewchar} and
+%D \type {\hyphenchar} als marked.
+%D
+%D \getbuffer
+
+% 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}
+
+%D \macros
+%D {getglyph, symbolicfont}
+%D
+%D Individual glyphs can be accessed by using
+%D
+%D \starttyping
+%D \getglyph{fontname}{character}
+%D \stoptyping
+%D
+%D This macro is used in for instance the symbol modules and
+%D as one can see, it does obey the small and even smaller
+%D sizes. The \type {\symbolicfont} macro can be used to
+%D switch to a font named \type {fontname} (see \type
+%D {cont-log} and \type {symb-eur} for examples of symbolic
+%D definitions.
+
+\def\fontstringA
+ {\ifx\fontstyle\c!rm \s!Serif \else
+ \ifx\fontstyle\c!ss \s!Sans \else
+ \ifx\fontstyle\c!tt \s!Mono \else
+ \s!Serif \fi\fi\fi}
+
+\def\fontstringB
+ {\ifx\fontstyle\c!rm \s!Regular \else
+ \ifx\fontstyle\c!ss \s!Support \else
+ \ifx\fontstyle\c!tt \s!Type \else
+ \s!Serif \fi\fi\fi}
+
+\def\fontstringC
+ {\ifx\fontalternative\c!bf \s!Bold \else
+ \ifx\fontalternative\c!sl \s!Slanted \else
+ \ifx\fontalternative\c!it \s!Italic \else
+ \ifx\fontalternative\c!bs \s!BoldSlanted \else
+ \ifx\fontalternative\c!bi \s!BoldItalic \fi\fi\fi\fi\fi}
+
+\def\fontstringD % default fontstyle
+ {\expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!rm \s!Serif \else
+ \expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!ss \s!Sans \else
+ \expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!tt \s!Mono \else
+ \s!Serif \fi\fi\fi}
+
+% potential generalization:
+
+% \letvalue{\??ff:t:\c!rm}\s!Serif
+% \letvalue{\??ff:t:\c!ss}\s!Sans
+% \letvalue{\??ff:t:\c!tt}\s!Mono
+%
+% \letvalue{\??ff:s:\c!bf}\s!Bold
+% \letvalue{\??ff:s:\c!sl}\s!Slanted
+% \letvalue{\??ff:s:\c!it}\s!Italic
+% \letvalue{\??ff:s:\c!bs}\s!BoldSlanted
+% \letvalue{\??ff:s:\c!bi}\s!BoldItalic
+%
+% \letvalue{\??ff:a:\c!rm}\s!Regular
+% \letvalue{\??ff:a:\c!ss}\s!Support
+% \letvalue{\??ff:a:\c!tt}\s!Type
+%
+% \def\fontstringA{\executeifdefined{\??ff:t:\fontstyle}\s!Serif}
+% \def\fontstringB{\executeifdefined{\??ff:a:\fontstyle}\s!Serif}
+% \def\fontstringC{\executeifdefined{\??ff:s:\fontstyle}\empty}
+% \def\fontstringD{\executeifdefined{\??ff:t:\csname\??tf\fontclass\s!default\endcsname}\s!Serif}
+
+\def\glyphfontfile#1%
+ {#1%
+ \ifcsname\??ff#1\fontstringA\fontstringC\endcsname
+ \fontstringA\fontstringC
+ \else\ifcsname\??ff#1\fontstringB\fontstringC\endcsname
+ \fontstringB\fontstringC
+ \else\ifcsname\??ff#1\fontstringA\endcsname
+ \fontstringA
+ \else\ifcsname\??ff#1\fontstringB\endcsname
+ \fontstringB
+ \else\ifcsname\??ff#1\fontstringC\endcsname
+ \fontstringC
+ \fi\fi\fi\fi\fi}
+
+%D The next macro can be used to make decisions based on the shape:
+
+\def\doifitalicelse#1#2%
+ {\ifx\fontalternative\c!sl#1\else
+ \ifx\fontalternative\c!it#1\else
+ \ifx\fontalternative\c!bs#1\else
+ \ifx\fontalternative\c!bi#1\else#2\fi\fi\fi\fi}
+
+%D For an example of usage of the following command,
+%D see \type {cont-log.tex}.
+%D
+%D \starttyping
+%D \def\symbolicfont#1{\definedfont[\glyphfontfile{#1} sa *]}
+%D \stoptyping
+%D
+%D Since we know what scaling it to be applied, we can
+%D implement a much faster alternative:
+
+\let\thedefinedfont\relax
+
+\def\symbolicsizedfont#1#2#3%
+ {\scaledfontsize#1%
+ \scaledfontsize#2\scaledfontsize
+ \font\thedefinedfont=\truefontname{\glyphfontfile{#3}} at \currentfontbodyscale\scaledfontsize\relax
+ \thedefinedfont}
+
+\def\symbolicscaledfont
+ {\symbolicsizedfont\fontbody}
+
+\unexpanded\def\symbolicfont
+ {\symbolicsizedfont\fontbody\plusone}
+
+\unexpanded\def\getglyph#1#2% slow, faster, much faster
+ %{{\definefont[\s!dummy][\glyphfontfile{#1} sa \currentfontscale]\dummy#2}}
+ %{{\definefont[\s!dummy][\glyphfontfile{#1} sa *]\dummy#2}}
+ %{{\symbolicfont{#1}#2}}
+ {{\symbolicfont{#1}\doifnumberelse{#2}\char\donothing#2}}
+
+\unexpanded\def\getscaledglyph#1#2#3%
+ {{\symbolicscaledfont{#1}{#2}\doifnumberelse{#3}\char\donothing#3}}
+
+\unexpanded\def\getrawglyph#1#2% for simple symbols
+ {{\scaledfontsize\fontbody
+ \font\thedefinedfont=#1 at \currentfontbodyscale\scaledfontsize\relax
+ \thedefinedfont\doifnumberelse{#2}\char\donothing#2}}
+
+%D The last implementation of \type {\getglyph} permits
+%D definitions like:
+%D
+%D \starttyping
+%D \definefontsynonym [EuroSans] [eurose]
+%D \definefontsynonym [EuroSansBold] [euroseb]
+%D \definefontsynonym [EuroSansItalic] [eurosei]
+%D \definefontsynonym [EuroSansSlanted] [eurosei]
+%D \definefontsynonym [EuroSansBoldItalic] [eurosebi]
+%D \definefontsynonym [EuroSansBoldSlanted] [eurosebi]
+%D
+%D \definesymbol [euro] [\getglyph{Euro}{\char160}]
+%D
+%D \def\euro{\symbol[euro]}
+%D \stoptyping
+%D
+%D These definitions guarantee that the next calls work okay:
+%D
+%D \starttyping
+%D \ss \tf\euro \bf\euro \sla\euro \itd\euro \bs\euro \bic\euro
+%D \stoptyping
+%D
+%D The shape as well as the size is adapted to the current
+%D environment.
+
+%D Fonts can only be used when loaded. In \CONTEXT\ we
+%D postpone the loading of fonts, even when we load \PLAIN.
+%D This means that we have to redefine one of the \PLAIN\
+%D macros. Let's tell that to the user first:
+
+\writestatus{loading}{Postponed Plain TeX Font Definitions}
+
+%D \macros
+%D {bordermatrix}
+%D
+%D In \PLAIN\ \TEX\ the width of a parenthesis is stored in
+%D the \DIMENSION\ \type{\p@renwd}. This value is derived from
+%D the width of \type{\tenrm B}, so let's take care of it now:
+
+\let\normalbordermatrix=\bordermatrix
+
+\def\bordermatrix%
+ {\bgroup
+ \setbox0\hbox{\getvalue{\textface\c!mm\c!ex}B}%
+ \global\p@renwd\wd0\relax
+ \egroup
+ \normalbordermatrix}
+
+%D Because we want to be as \PLAIN\ compatible as possible, we
+%D make most of \PLAIN's font mechanisme available to the
+%D \CONTEXT\ user.
+
+\def\setplainfonts#1#2%
+ {\setvalue {ten#1}{\getvalue{\!!tenpoint #2}}%
+ \setvalue{seven#1}{\getvalue{\!!sevenpoint#2}}%
+ \setvalue {five#1}{\getvalue{\!!fivepoint #2}}}
+
+\setplainfonts {\c!rm} {\c!rm\c!tf}
+\setplainfonts {\c!bf} {\c!rm\c!bf}
+\setplainfonts {\c!sl} {\c!rm\c!sl}
+\setplainfonts {\c!it} {\c!rm\c!it}
+\setplainfonts {\c!tt} {\c!rm\c!tt}
+\setplainfonts {\c!sy} {\c!mm\c!sy}
+\setplainfonts {\c!ex} {\c!mm\c!ex}
+\setplainfonts {\c!i} {\c!mm\c!mi}
+
+\let\setplainfonts=\undefined
+
+%D \macros
+%D {ss, SS, sz}
+%D
+%D We are going to redefine \type{\ss} but for those wo still
+%D want to have access to the german \SS, we save it's value in
+%D \type{\SS}. Ok, I should have used \type{\sf} instead of
+%D \type{\ss} in the first place.
+
+\ifx\undefined\SS \let\SS=\ss \fi
+\ifx\undefined\sz \let\sz=\ss \fi
+
+%D \macros
+%D {xi}
+%D
+%D We are going to redefine \type{\xi}, but fortunately this
+%D is a math mode character, so we can just say:
+
+\let\normalxi=\xi
+
+%D \macros
+%D {smashaccent}
+%D
+%D When we let \TEX\ put an accent on top of a character, such
+%D composed characters can get more height that height of a
+%D standard \type{\strut}. The next macro takes care of such
+%D unwanted compositions.
+%D
+%D We need to reach over the number that specifies the accent,
+%D and in doing so we use \type{\scratchcounter} as a placeholder
+%D because it accepts 8 bit numbers in octal, decimal or
+%D hexadecimal format. Next we set the height of the accented
+%D character to the natural height of the character.
+
+\unexpanded\def\smashaccent#1%
+ {\dontleavehmode
+ \bgroup
+ \setbox\scratchbox\hbox{#1}%
+ \ifdim\ht\scratchbox>\strutheight\relax\ht\scratchbox\strutheight\fi
+ \ifdim\dp\scratchbox>\strutdepth \relax\dp\scratchbox\strutdepth \fi
+ \box\scratchbox
+ \egroup}
+
+%D For instance we can say:
+%D
+%D \starttyping
+%D \smashaccent{\"Uberhaupt}
+%D \stoptyping
+%D
+%D But normally one will use it as a prefix in definitions.
+%D The difference is in the height:
+%D
+%D \leavevmode\ruledhbox
+%D {\ruledhbox{\smashaccent{\"U}berhaupt}\quad
+%D oder\quad
+%D \ruledhbox{\"Uberhaupt}}
+
+%D \macros
+%D {moveaccent}
+%D
+%D Exact positioning of accents can be realized by saying:
+%D
+%D \starttyping
+%D \moveaccent{-.1ex}{\"u}berhaupt
+%D \stoptyping
+%D
+%D Again, this one will mostly used as a prefix in definitions.
+%D Here the difference is in the position:
+%D
+%D \leavevmode\ruledhbox
+%D {\ruledhbox{\moveaccent{-.1ex}{\"}Uberhaupt}\quad
+%D oder\quad
+%D \ruledhbox{\"Uberhaupt}}
+
+\unexpanded\def\moveaccent#1#2%
+ {\smashaccent
+ {\dimen0\exheight
+ \dimen2\dimen0
+ \advance\dimen2 -#1%
+ \exheight\dimen2
+ #2\relax
+ \exheight\dimen0}}
+
+%D Personally I think that using \TEX\ is complicated by the
+%D way fonts are handled. Apart from the many encodings, we
+%D also deal with different naming schemes. Confronted with
+%D this problem, I decided to change the definitions into:
+%D
+%D \starttyping
+%D \definebodyfont [12pt] [rm] [tf=Times-Roman at 12pt]
+%D \stoptyping
+%D
+%D combined with for instance:
+%D
+%D \starttyping
+%D \definefontsynonym [Times-Roman] [tir]
+%D \stoptyping
+
+%D Now we're up to some definitions.
+
+\definebodyfontenvironment
+ [\s!default]
+ [ \s!text=1.0,
+ \s!script=0.7,
+ \s!scriptscript=0.5,
+ \c!a=1.200,
+ \c!b=1.440,
+ \c!c=1.728,
+ \c!d=2.074,
+ *=\currentfontscale, % wildcard
+ \c!x=0.8,
+ \c!xx=0.6,
+ \c!big=1.2,
+ \c!small=0.8,
+ \c!interlinespace=,
+ \c!em=\v!slanted]
+
+\definebodyfontenvironment
+ [20.7pt]
+ [ \s!text=20.7pt,
+ \s!script=\!!fourteenpointfour,
+ \s!scriptscript=\!!twelvepoint,
+ \c!x=17.3pt,
+ \c!xx=\!!fourteenpointfour,
+ \c!big=20.7pt, % !!!!
+ \c!small=17.3pt]
+
+\definebodyfontenvironment
+ [17.3pt]
+ [ \s!text=17.3pt,
+ \s!script=\!!twelvepoint,
+ \s!scriptscript=\!!tenpoint,
+ \c!x=\!!fourteenpointfour,
+ \c!xx=\!!twelvepoint,
+ \c!big=20.7pt,
+ \c!small=\!!fourteenpointfour]
+
+\definebodyfontenvironment
+ [\!!fourteenpointfour]
+ [ \s!text=\!!fourteenpointfour,
+ \s!script=\!!elevenpoint,
+ \s!scriptscript=\!!ninepoint,
+ \c!x=\!!twelvepoint,
+ \c!xx=\!!tenpoint,
+ \c!big=17.3pt,
+ \c!small=\!!twelvepoint]
+
+\definebodyfontenvironment
+ [\!!twelvepoint]
+ [ \s!text=\!!twelvepoint,
+ \s!script=\!!ninepoint,
+ \s!scriptscript=\!!sevenpoint,
+ \c!x=\!!tenpoint,
+ \c!xx=\!!eightpoint,
+ \c!big=\!!fourteenpointfour,
+ \c!small=\!!tenpoint]
+
+\definebodyfontenvironment
+ [\!!elevenpoint]
+ [ \s!text=\!!elevenpoint,
+ \s!script=\!!eightpoint,
+ \s!scriptscript=\!!sixpoint,
+ \c!x=\!!ninepoint,
+ \c!xx=\!!sevenpoint,
+ \c!big=\!!twelvepoint,
+ \c!small=\!!ninepoint]
+
+\definebodyfontenvironment
+ [\!!tenpoint]
+ [ \s!text=\!!tenpoint,
+ \s!script=\!!sevenpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!eightpoint,
+ \c!xx=\!!sixpoint,
+ \c!big=\!!twelvepoint,
+ \c!small=\!!eightpoint]
+
+\definebodyfontenvironment
+ [\!!ninepoint]
+ [ \s!text=\!!ninepoint,
+ \s!script=\!!sevenpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sevenpoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!elevenpoint,
+ \c!small=\!!sevenpoint]
+
+\definebodyfontenvironment
+ [\!!eightpoint]
+ [ \s!text=\!!eightpoint,
+ \s!script=\!!sixpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sixpoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!tenpoint,
+ \c!small=\!!sixpoint]
+
+\definebodyfontenvironment
+ [\!!sevenpoint]
+ [ \s!text=\!!sevenpoint,
+ \s!script=\!!sixpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sixpoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!ninepoint,
+ \c!small=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!sixpoint]
+ [ \s!text=\!!sixpoint,
+ \s!script=\!!fivepoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!fivepoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!eightpoint,
+ \c!small=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!fivepoint]
+ [ \s!text=\!!fivepoint,
+ \s!script=\!!fivepoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!fivepoint,
+ \c!xx=\!!fivepoint,
+ \c!big=\!!sevenpoint,
+ \c!small=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!fourpoint]
+ [ \s!text=\!!fourpoint,
+ \s!script=\!!fourpoint,
+ \s!scriptscript=\!!fourpoint,
+ \c!x=\!!fourpoint,
+ \c!xx=\!!fourpoint,
+ \c!big=\!!sixpoint,
+ \c!small=\!!fourpoint]
+
+\definebodyfontswitch [fourteenpointfour] [\!!fourteenpointfour]
+\definebodyfontswitch [twelvepoint] [\!!twelvepoint]
+\definebodyfontswitch [elevenpoint] [\!!elevenpoint]
+\definebodyfontswitch [tenpoint] [\!!tenpoint]
+\definebodyfontswitch [ninepoint] [\!!ninepoint]
+\definebodyfontswitch [eightpoint] [\!!eightpoint]
+\definebodyfontswitch [sevenpoint] [\!!sevenpoint]
+\definebodyfontswitch [sixpoint] [\!!sixpoint]
+\definebodyfontswitch [fivepoint] [\!!fivepoint]
+\definebodyfontswitch [fourpoint] [\!!fourpoint]
+
+\definebodyfontswitch [xii] [\!!twelvepoint]
+\definebodyfontswitch [xi] [\!!elevenpoint]
+\definebodyfontswitch [x] [\!!tenpoint]
+\definebodyfontswitch [ix] [\!!ninepoint]
+\definebodyfontswitch [viii] [\!!eightpoint]
+\definebodyfontswitch [vii] [\!!sevenpoint]
+\definebodyfontswitch [vi] [\!!sixpoint]
+
+%D So far.
+
+\definefontstyle [\c!rm,\v!roman,\v!serif,\v!regular] [\c!rm]
+\definefontstyle [\c!ss,\v!sansserif,\v!sans,\v!support] [\c!ss]
+\definefontstyle [\c!tt,\v!teletype,\v!type,\v!mono] [\c!tt]
+\definefontstyle [\c!hw,\v!handwritten] [\c!hw]
+\definefontstyle [\c!cg,\v!calligraphic] [\c!cg]
+
+\definefontsize[\c!a] \definefontsize[\c!b]
+\definefontsize[\c!c] \definefontsize[\c!d]
+
+\definealternativestyle [\v!mediaeval] [\os] []
+\definealternativestyle [\v!normal] [\tf] []
+\definealternativestyle [\v!bold] [\bf] []
+\definealternativestyle [\v!type] [\tt] []
+\definealternativestyle [\v!mono] [\tt] []
+\definealternativestyle [\v!slanted] [\sl] []
+\definealternativestyle [\v!italic] [\it] []
+\definealternativestyle [\v!boldslanted,\v!slantedbold] [\bs] []
+\definealternativestyle [\v!bolditalic,\v!italicbold] [\bi] []
+\definealternativestyle [\v!small,\v!smallnormal] [\tfx] []
+\definealternativestyle [\v!smallbold] [\bfx] []
+\definealternativestyle [\v!smalltype] [\ttx] []
+\definealternativestyle [\v!smallslanted] [\slx] []
+\definealternativestyle [\v!smallboldslanted,\v!smallslantedbold] [\bsx] []
+\definealternativestyle [\v!smallbolditalic,\v!smallitalicbold] [\bix] []
+
+\definealternativestyle [\v!sans,\v!sansserif] [\ss] []
+\definealternativestyle [\v!sansbold] [\ss\bf] []
+
+%D Slow but handy:
+
+\definealternativestyle [\v!smallbodyfont] [\setsmallbodyfont] []
+\definealternativestyle [\v!bigbodyfont] [\setbigbodyfont] []
+
+%D We treat {\sc Small Caps} and \cap {Pseudo Caps} a bit
+%D different. We also provide an \WORD {uppercase} style.
+
+\definealternativestyle [\v!cap,\v!capital] [\smallcapped] [\smallcapped]
+\definealternativestyle [\v!smallcaps] [\sc] [\sc]
+\definealternativestyle [\v!WORD] [\WORD] [\WORD]
+
+%D \macros
+%D {...math}
+%D
+%D New or old?
+
+% tzt proper \define...
+%
+% watch out: \synchronizesymb resets the family so we need a second
+% \mf (or maybe \mr): messy and to be sorted out
+
+\def\tfmath{\tf\mf\synchronizesymb\mf}
+\def\bfmath{\bf\mf\synchronizesymb\mf}
+\def\slmath{\sl\mf\synchronizesymb\mf}
+\def\itmath{\it\mf\synchronizesymb\mf}
+\def\bsmath{\bs\mf\synchronizesymb\mf}
+\def\bimath{\bi\mf\synchronizesymb\mf}
+\def\scmath{\sc\mf\synchronizesymb\mf}
+\def\nnmath{\nn\mf\synchronizesymb\mf}
+
+\def\textmath {\synchronizesymb}
+
+%D \macros
+%D {fontstylesuffix}
+%D
+%D The next macro is used to map non latin fontnames on
+%D fonts. See \type {font-uni} for an example of its use.
+
+%\def\fontstylesuffix%
+% {\ifnum\fam=\tffam \s!Regular \else
+% \ifnum\fam=\bffam \s!Bold \else
+% \ifnum\fam=\slfam \s!Slanted \else
+% \ifnum\fam=\itfam \s!Italic \else
+% \ifnum\fam=\bsfam \s!BoldSlanted \else
+% \ifnum\fam=\bifam \s!BoldItalic \else
+% \s!Regular \fi\fi\fi\fi\fi\fi}%
+
+\def\fontstylesuffix% why the \s!Regular ? see \getglyph
+ {\ifx\fontalternative\c!tf \s!Regular \else
+ \ifx\fontalternative\c!bf \s!Bold \else
+ \ifx\fontalternative\c!sl \s!Slanted \else
+ \ifx\fontalternative\c!it \s!Italic \else
+ \ifx\fontalternative\c!bs \s!BoldSlanted \else
+ \ifx\fontalternative\c!bi \s!BoldItalic \else
+ \ifx\fontalternative\c!sc \s!Caps \else
+ \s!Regular \fi\fi\fi\fi\fi\fi\fi}%
+
+%D We still have to take care of \type{\xi}, so:
+
+\def\xi{\ifmmode\normalxi\else\elevenpoint\fi}
+
+%D \macros
+%D {definefontvariant,fontvariant,variant}
+%D
+%D A slightly adapted version of Adam Lindsays variant patches:
+%D
+%D \starttyping
+%D \usetypescriptfile[type-psc] \loadmapfile[texnansi-public-fpl]
+%D \usetypescript[palatino][texnansi] \setupbodyfont[palatino]
+%D
+%D \definefontvariant [Serif][osf] [OsF]
+%D
+%D \startlines
+%D {\sc abcdefgHIJKlmnop}
+%D 123{\Var[osf]456}789
+%D {\Var[osf] 123{\Var[reset]456}789}
+%D {\it 123{\Var[osf]456}789
+%D {\Var[osf]123{\Var[reset]456}789}}
+%D {\tfb\bf 123{\Var[osf]456}789
+%D {\Var[osf] 123{\Var[reset]456}789}}
+%D {\sc 123{\Var[osf]456}789
+%D {\Var[osf] 123{\Var[reset]456}789}}
+%D \stoplines
+%D \stoptyping
+
+\def\definefontvariant
+ {\dotripleargument\dodefinefontvariant}
+
+\def\dodefinefontvariant[#1][#2][#3]%
+ {\setvalue{\??fv#1#2}{#3}}
+
+\def\fontvariant#1#2{\executeifdefined{\??fv#1#2}\empty}
+
+\def\dosetscaledfont
+ {\checkrelativefontsize\fontstyle
+ \scaledfontsize\currentfontscale\bodyfontsize
+ \scaledfontsize\relativefontsize\scaledfontsize}
+
+\unexpanded\def\variant[#1]% slow
+ {\dosetscaledfont
+ \expanded{\definedfont[\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1} at \the\dimexpr\scaledfontsize\relax]}%
+ \ignoreimplicitspaces}
+
+\ifx\Var\undefined \let\Var\variant \fi
+
+%D By default we load the Computer Modern Roman fonts (but
+%D not yet at this moment) and activate the 12pt roman
+%D bodyfont. Sans serif and teletype are also available and
+%D can be called for by \type{\ss} and \type{\tt}.
+
+\setupbodyfont [unk, rm]
+
+%D Also needed is:
+
+\definefont[tinyfont][Mono at 1ex]
+
+%D \macros
+%D {doiffontpresentelse}
+%D
+%D \starttyping
+%D \doiffontpresentelse{texnansi-lmr10}{YES}{NO}
+%D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO}
+%D \stoptyping
+
+\def\doiffontpresentelse#1{\ctxlua{commands.doifelse(fonts.names.exists("#1"))}}
+
+%D OPTIMIZATIONS
+
+\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontname{#1}%
+ \edef\@@fontfile{#3}%
+ \@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile % maybe just #1 #3, saves expansion
+ \doifnextcharelse[\dodefinefontsynonym\nodefinefontsynonym}
+
+\def\dodefinefontsynonym[#1]%
+ {\let\@@ff@@features \undefined
+ \let\@@ff@@fallbacks\undefined
+ \let\@@ff@@skewchar \undefined
+ \expandafter\dogetfontparameter#1,]=,}
+
+\def\dogetfontparameter#1=#2,%
+ {\if]#1%
+ \dododefinefontsynonym
+ \else
+ \expandafter\def\csname @@ff@@#1\endcsname{#2}%
+ \expandafter\dogetfontparameter
+ \fi}
+
+\def\nodefinefontsynonym
+ {\ifx\fontclass\empty
+ \@EA\let\csname\??ff\@@fontname\s!features \endcsname\undefined
+ \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\undefined
+ \@EA\let\csname\??ff\@@fontfile\s!skewchar \endcsname\undefined
+ \else
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\undefined
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\undefined
+ \global\@EA\let\csname\??ff\fontclass\@@fontfile\s!skewchar \endcsname\undefined
+ \fi}
+
+\def\dododefinefontsynonym
+ {\ifx\fontclass\empty
+ \@EA\let\csname\??ff\@@fontname\s!features \endcsname\@@ff@@features
+ \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks
+ \@EA\let\csname\??ff\@@fontfile\s!skewchar \endcsname\@@ff@@skewchar
+ \else
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\@@ff@@features
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks
+ \global\@EA\let\csname\??ff\fontclass\@@fontfile\s!skewchar \endcsname\@@ff@@skewchar
+ \fi}
+
+\def\truefontname#1%
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ \@EA\truefontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+\def\updatefontparameters
+ {\edef\@@fontfeatures {\@@thefeatures \somefontname}%
+ \edef\@@fontfallbacks{\@@thefallbacks\somefontname}%
+ \edef\@@fontskewchar {\@@theskewchar \somefontname}}
+
+\def\@@thefeatures#1%
+ {\ifcsname\??ff\fontclass#1\s!features\endcsname \csname\??ff\fontclass#1\s!features\endcsname\else % class + symbolic_name
+ \ifcsname\??ff #1\s!features\endcsname \csname\??ff #1\s!features\endcsname\else % symbolic_name
+ \ifcsname\??ff\fontclass#1\endcsname \@EA\@@thefeatures\csname\??ff\fontclass#1\endcsname \else % fontclass + parent_name
+ \ifcsname\??ff #1\endcsname \@EA\@@thefeatures\csname\??ff #1\endcsname \fi\fi\fi\fi} % parent_name
+
+\def\@@thefallbacks#1%
+ {\ifcsname\??ff\fontclass#1\s!fallbacks\endcsname \csname\??ff\fontclass#1\s!fallbacks\endcsname\else % class + symbolic_name
+ \ifcsname\??ff #1\s!fallbacks\endcsname \csname\??ff #1\s!fallbacks\endcsname\else % symbolic_name
+ \ifcsname\??ff\fontclass#1\endcsname \@EA\@@thefallbacks\csname\??ff\fontclass#1\endcsname \else % fontclass + parent_name
+ \ifcsname\??ff #1\endcsname \@EA\@@thefallbacks\csname\??ff #1\endcsname \fi\fi\fi\fi} % parent_name
+
+\def\@@theskewchar#1% skew chars will be done differently (just a hash with registered skewchars)
+ {\ifcsname\??ff\fontclass#1\s!skewchar\endcsname \csname\??ff\fontclass#1\s!skewchar\endcsname\else % class + symbolic_name
+ \ifcsname\??ff #1\s!skewchar\endcsname \csname\??ff #1\s!skewchar\endcsname\else % symbolic_name
+ \ifcsname\??ff\fontclass#1\endcsname \@EA\@@theskewchar\csname\??ff\fontclass#1\endcsname \else % fontclass + parent_name
+ \ifcsname\??ff #1\endcsname \@EA\@@theskewchar\csname\??ff #1\endcsname \fi\fi\fi\fi} % parent_name
+
+% more efficient ?
+
+\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontname{#1}%
+ \edef\@@fontfile{#3}%
+ \ifx\fontclass\empty
+ \expandafter\dodefinefontsynonymnop
+ \else
+ \expandafter\dodefinefontsynonymyes
+ \fi}
+
+\def\dodefinefontsynonymyes
+ {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile % maybe just #1 #3, saves expansion
+ \doifnextcharelse[\dododefinefontsynonymyes\nonodefinefontsynonymyes}
+\def\dodefinefontsynonymnop
+ {\@EA\let\csname\??ff\@@fontname\endcsname\@@fontfile % maybe just #1 #3, saves expansion
+ \doifnextcharelse[\dododefinefontsynonymnop\nonodefinefontsynonymnop}
+
+\def\dododefinefontsynonymyes[#1]%
+ {\let\@@ff@@features \undefined
+ \let\@@ff@@fallbacks\undefined
+ \let\@@ff@@skewchar \undefined
+ \expandafter\dogetfontparameteryes#1,]=,}
+\def\dododefinefontsynonymnop[#1]%
+ {\let\@@ff@@features \undefined
+ \let\@@ff@@fallbacks\undefined
+ \let\@@ff@@skewchar \undefined
+ \expandafter\dogetfontparameternop#1,]=,}
+
+\def\dogetfontparameteryes#1=#2,%
+ {\if]#1%
+ \dodododefinefontsynonymyes
+ \else
+ \expandafter\def\csname @@ff@@#1\endcsname{#2}%
+ \expandafter\dogetfontparameteryes
+ \fi}
+\def\dogetfontparameternop#1=#2,%
+ {\if]#1%
+ \dodododefinefontsynonymnop
+ \else
+ \expandafter\def\csname @@ff@@#1\endcsname{#2}%
+ \expandafter\dogetfontparameternop
+ \fi}
+
+\def\nonodefinefontsynonymyes
+ {\global\@EA\let\csname\??ff\@@fontname\s!features \endcsname\undefined
+ \global\@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\undefined
+ \global\@EA\let\csname\??ff\@@fontfile\s!skewchar \endcsname\undefined}
+\def\nonodefinefontsynonymnop
+ {\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\undefined
+ \@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\undefined
+ \@EA\let\csname\??ff\fontclass\@@fontfile\s!skewchar \endcsname\undefined}
+
+\def\dodododefinefontsynonymyes
+ {\global\@EA\let\csname\??ff\@@fontname\s!features \endcsname\@@ff@@features
+ \global\@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks
+ \global\@EA\let\csname\??ff\@@fontfile\s!skewchar \endcsname\@@ff@@skewchar}
+\def\dodododefinefontsynonymnop
+ {\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\@@ff@@features
+ \@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks
+ \@EA\let\csname\??ff\fontclass\@@fontfile\s!skewchar \endcsname\@@ff@@skewchar}
+
+% resolve
+
+\def\@@thefeaturesyes#1%
+ {\ifcsname\??ff\fontclass#1\s!features \endcsname\@EA\let\@EA\@@fontfeatures \csname\??ff\fontclass#1\s!features \endcsname\else
+ \ifcsname\??ff #1\s!features \endcsname\@EA\let\@EA\@@fontfeatures \csname\??ff #1\s!features \endcsname\else
+ \ifcsname\??ff\fontclass #1\endcsname\@EA \@@thefeaturesyes \csname\??ff\fontclass #1\endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@thefeaturesyes \csname\??ff #1\endcsname\else
+ \let \@@fontfeatures \empty \fi\fi\fi\fi}
+\def\@@thefallbacksyes#1%
+ {\ifcsname\??ff\fontclass#1\s!fallbacks\endcsname\@EA\let\@EA\@@fontfallbacks \csname\??ff\fontclass#1\s!fallbacks\endcsname\else
+ \ifcsname\??ff #1\s!fallbacks\endcsname\@EA\let\@EA\@@fontfallbacks \csname\??ff #1\s!fallbacks\endcsname\else
+ \ifcsname\??ff\fontclass #1\endcsname\@EA \@@thefallbacksyes\csname\??ff\fontclass #1\endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@thefallbacksyes\csname\??ff #1\endcsname\else
+ \let \@@fontfallbacks \empty \fi\fi\fi\fi}
+\def\@@theskewcharyes#1%
+ {\ifcsname\??ff\fontclass#1\s!skewchar \endcsname\@EA\let\@EA\@@fontskewchar \csname\??ff\fontclass#1\s!skewchar \endcsname\else
+ \ifcsname\??ff #1\s!skewchar \endcsname\@EA\let\@EA\@@fontskewchar \csname\??ff #1\s!skewchar \endcsname\else
+ \ifcsname\??ff\fontclass #1\endcsname\@EA \@@theskewcharyes \csname\??ff\fontclass #1\endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@theskewcharyes \csname\??ff #1\endcsname\else
+ \let \@@fontskewchar \empty \fi\fi\fi\fi}
+
+\def\@@thefeaturesnop#1%
+ {\ifcsname\??ff#1\s!features \endcsname\@EA\let\@EA\@@fontfeatures \csname\??ff#1\s!features \endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@thefeaturesnop \csname\??ff #1\endcsname\else
+ \let \@@fontfeatures \empty \fi\fi}
+\def\@@thefallbacksnop#1%
+ {\ifcsname\??ff#1\s!fallbacks\endcsname\@EA\let\@EA\@@fontfallbacks \csname\??ff#1\s!fallbacks\endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@thefallbacksnop\csname\??ff #1\endcsname\else
+ \let \@@fontfallbacks \empty \fi\fi}
+\def\@@theskewcharnop#1%
+ {\ifcsname\??ff#1\s!skewchar \endcsname\@EA\let\@EA\@@fontskewchar \csname\??ff#1\s!skewchar \endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@theskewcharnop \csname\??ff #1\endcsname\else
+ \let \@@fontskewchar \empty \fi\fi}
+
+\def\updatefontparametersyes
+ {\@@thefeaturesyes \somefontname
+ \@@thefallbacksyes\somefontname
+ \@@theskewcharyes \somefontname}
+\def\updatefontparametersnop
+ {\@@thefeaturesnop \somefontname
+ \@@thefallbacksnop\somefontname
+ \@@theskewcharnop \somefontname}
+
+\def\updatefontparameters
+ {\ifx\fontclass\empty\updatefontparametersnop\else\updatefontparametersyes\fi}
+
+\protect \endinput
+
+% bewaren
+%
+% \def\truefontdata#1#2%
+% {\ifcsname\??ff\fontclass#1#2\endcsname
+% % raw(Regular) raw(key)
+% \csname\??ff\fontclass#1#2\endcsname
+% \else\ifcsname\??ff\fontclass#1\endcsname
+% % exp(palatino Regular) raw(key)
+% \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
+% \else\ifcsname\??ff#1\endcsname
+% % exp(Regular) raw(key)
+% \expandafter\truefontdata\csname\??ff#1\endcsname#2%
+% \else\ifcsname\??ff#2\endcsname
+% % raw(key)
+% \csname\??ff#2\endcsname
+% \fi\fi\fi\fi}
+
+% test file
+%
+% \starttypescript[serif][mine-1]
+% \definefontsynonym[Serif] [TeXGyrePagella-Regular]
+% \definefontsynonym[TeXGyrePagella-Regular][file:texgyrepagella-regular]
+% \stoptypescript
+%
+% \starttypescript[serif][mine-2]
+% \definefontsynonym[Serif] [TeXGyrePagella-Regular] [features=default]
+% \definefontsynonym[TeXGyrePagella-Regular][file:texgyrepagella-regular] [features=oldstyle]
+% \stoptypescript
+%
+% \starttypescript[serif][mine-3]
+% \definefontsynonym[Serif] [TeXGyrePagella-Regular] [features=oldstyle]
+% \definefontsynonym[TeXGyrePagella-Regular][file:texgyrepagella-regular] [features=default]
+% \stoptypescript
+%
+% \starttypescript[serif][mine-4]
+% \definefontsynonym[Serif] [TeXGyrePagella-Regular] [features=default]
+% \definefontsynonym[TeXGyrePagella-Regular][file:texgyrepagella-regular] [features=default]
+% \stoptypescript
+%
+% \starttypescript[serif][mine-5]
+% \definefontsynonym[Serif] [TeXGyrePagella-Regular] [features=oldstyle]
+% \definefontsynonym[TeXGyrePagella-Regular][file:texgyrepagella-regular] [features=oldstyle]
+% \stoptypescript
+%
+% \starttext
+% \dorecurse {5} {
+% \expanded{\definetypeface[mine-\recurselevel][rm][serif][mine-\recurselevel][default]}
+% \expanded{\setupbodyfont [mine-\recurselevel] mine-\recurselevel: text 1234567890 done}
+% \par
+% }
+% \blank
+% \dorecurse {5} {
+% \expanded{\definetypeface[more-\recurselevel][rm][serif][mine-\recurselevel][default][features=oldstyle]}
+% \expanded{\setupbodyfont [more-\recurselevel] mine-\recurselevel: text 1234567890 done}
+% \par
+% }
+% \stoptext
diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex
deleted file mode 100644
index bcc0ead46..000000000
--- a/tex/context/base/font-ini.tex
+++ /dev/null
@@ -1,4849 +0,0 @@
-%D \module
-%D [ file=font-ini,
-%D version=1998.09.11, % (second)
-%D version=2001.02.20, % (third)
-%D title=\CONTEXT\ Font 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.
-
-\writestatus{loading}{Context Font Macros (ini)}
-
-\loadmarkfile{font-ini}
-
-\unprotect
-
-% \def\fontrange#1%
-% {\dofontrange{#1 =\bodyfontsize}}
-%
-% \def\dofontrange#1%
-% {\dodofontrange#1 \relax}% \fontstringA
-%
-% \def\dodofontrange#1 #2 %
-% {\ifdim\bodyfontsize#2%
-% #1\expandafter\gobbleuntilrelax
-% \else
-% \expandafter\dodofontrange
-% \fi}
-%
-% \definefont
-% [crap]
-% [\fontrange
-% {Regular <10pt
-% RegularBold <12pt
-% RegularSlanted <15pt
-% Regular} sa 1]
-%
-% may be better:
-%
-% \definefontrange
-% [crap]
-% [Regular <10pt
-% RegularBold <12pt
-% RegularSlanted <15pt]
-% [Regular sa 1]
-%
-%
-% \dostepwiserecurse{2}{15}{1}
-% {{\switchtobodyfont[\recurselevel pt]\crap test}\endgraf}
-
-% adapted, else wrong interlinespace
-
-\def\setfontparameters
- {\synchronizefontsfalse
- \the\everybodyfont
- \synchronizefontstrue}
-
-% handy
-
-\newcounter\pushedfont
-
-\def\savefont
- {\edef\savedfont{\the\font}%
- \pushmacro\savedfont
- \pushmacro\currentregime
- \pushmacro\charactermapping
- \pushmacro\characterencoding}
-
-\def\restorefont
- {\popmacro\characterencoding
- \popmacro\charactermapping
- \popmacro\currentregime
- \popmacro\savedfont
- \savedfont}
-
-\def\pushcurrentfont
- {\edef\popcurrentfont
- {\noexpand\def\noexpand\fontbody{\fontbody}%
- \noexpand\def\noexpand\fontstyle{\fontstyle}%
- \noexpand\dosetcurrentfontalternative{\fontalternative}%
- \noexpand\dosetcurrentfontsize{\fontsize}%
- \noexpand\synchronizefont}}
-
-% \definetypeface[one][rm][serif][computer-roman][default]
-% \definetypeface[two][rm][serif][computer-roman][default][rscale=.9]
-%
-% {\one \bf test \two test}
-% {\one \bf test \pushcurrentfont \two \popcurrentfont test}
-
-%D \macros
-%D {definedfont,startfont,doiffontcharelse}
-%D
-%D A couple of relatively new macros:
-
-\newevery \everydefinedfont \relax
-
-\def\dodefinedfont[#1]%
- {\iffirstargument\definefont[\string\thedefinedfont][#1]\fi
- \csname\string\thedefinedfont\endcsname % can be \relax
- \the\everydefinedfont}
-
-\unexpanded\def\definedfont
- {\dosingleempty\dodefinedfont}
-
-\unexpanded\def\startfont
- {\bgroup\definedfont}
-
-\def\stopfont
- {\egroup}
-
-\def\doiffontcharelse#1#2%
- {\bgroup
- \definedfont[#1]%
- \iffontchar\font#2\relax
- \egroup\expandafter\firstoftwoarguments
- \else
- \egroup\expandafter\secondoftwoarguments
- \fi}
-
-%%% message 14 added
-
-\startmessages dutch library: fonts
- title: korps
- 1: codering --
- 2: variant -- wordt geladen
- 3: onbekende variant --
- 4: korps -- is niet gedefinieerd
- 5: stijl -- is niet gedefinieerd
- 6: -- wordt geladen
- 7: onbekend formaat --
- 8: stijl -- gedefinieerd
-% 9: mapping -- is geladen
- 10: onbekende font file --
- 14: korps -- is gedefinieerd (kan beter globaal plaatsvinden)
-\stopmessages
-
-\startmessages english library: fonts
- title: bodyfont
- 1: coding --
- 2: variant -- is loaded
- 3: unknown variant --
- 4: bodyfont -- is not defined
- 5: style -- is not defined
- 6: -- is loaded
- 7: unknown format --
- 8: style -- defined
-% 9: mapping -- is loaded
- 10: unknown font file --
- 14: bodyfont -- is defined (can better be done global)
-\stopmessages
-
-\startmessages german library: fonts
- title: Fliesstext
- 1: Kodierung --
- 2: Variante -- ist geladen
- 3: Unbekannte Variante --
- 4: Fliesstext -- ist nicht definiert
- 5: Stil -- ist nicht definiert
- 6: -- ist geladen
- 7: unbekanntes Format --
- 8: Stil -- definiert
-% 9: Map -- ist geladen
- 10: unbekanntes Font --
- 14: Fliesstext -- wurde definiert (besser waere globale Definition)
-\stopmessages
-
-\startmessages czech library: fonts
- title: zakladnifont
- 1: kodovani --
- 2: varianta -- je nactena
- 3: neznama varianta --
- 4: zakladni font -- neni definovan
- 5: styl -- neni definovan
- 6: -- je nacten
- 7: neznamy format --
- 8: styl -- definovan
-% 9: mapovani -- je nacteno
- 10: neznamy font --
- 14: bodyfont -- is defined (can better be done global)
-\stopmessages
-
-\startmessages italian library: fonts
- title: font del corpo
- 1: codifica --
- 2: variante -- caricata
- 3: variante sconosciuta --
- 4: corpo del testo -- non definito
- 5: stile -- non definito
- 6: -- caricato
- 7: formato sconosciuto --
- 8: stile -- definito
-% 9: mappatura -- caricata
- 10: file di font sconosciuto --
- 14: corpo del testo -- definito (sarebbe meglio globale)
-\stopmessages
-
-\startmessages norwegian library: fonts
- title: hovedfont
- 1: koding --
- 2: variant -- er lest inn
- 3: ukjent variant --
- 4: hovedfont -- er ikke definert
- 5: stil -- er ikke definert
- 6: -- er lest inn
- 7: ukjent format --
- 8: stil -- definert
-% 9: avbildning -- er lest inn
- 10: ukjent fontfil --
- 14: bodyfont -- is defined (can better be done global)
-\stopmessages
-
-\startmessages romanian library: fonts
- title: corp de litere
- 1: codificarea --
- 2: varianta -- este incarcata
- 3: varianta necunoscuta --
- 4: corpul de litere -- nu este definit
- 5: stilul -- nu este definit
- 6: -- este incarcat
- 7: format necunoscut --
- 8: stilul -- definit
-% 9: maparea -- este incarcat
- 10: fisier font necunoscut --
- 14: bodyfont -- is defined (can better be done global)
-\stopmessages
-
-\startmessages french library: fonts
- title: corps de texte
- 1: encodage --
- 2: la variante -- est chargée
- 3: variante -- inconnue
- 4: policecorps -- n'est pas définie
- 5: le style -- n'est pas défini
- 6: -- est chargé
- 7: format -- inconnu
- 8: style -- défini
-% 9: mapping -- is loaded
- 10: fichier de police -- inconnu
- 14: policecorps -- est défini (une définition globale pourrait être plus adéquat)
-\stopmessages
-
-%D This module is one of the oldest modules of \CONTEXT. The
-%D macros below evolved out of the \PLAIN\ \TEX\ macros and
-%D therefore use a similar naming scheme (\type{\rm},
-%D \type{\bf}, etc). This module grew out of our needs. We
-%D started with the \PLAIN\ \TEX\ definitions, generalized the
-%D underlaying macros, and extended those to a level at which
-%D probably no one will ever recognize them.
-%D
-%D In 2001 we ran into a couple of projects where more than
-%D one combined set of fonts was involved in a document. To
-%D make definitions more readable, as well as to overcome the
-%D problem of ever growing file name lists, and also because
-%D we needed to scale fonts relative to each other, the low
-%D level implementation was partly rewritten. Global
-%D font assignments, relative scaling, font classes and alike
-%D were added then. At the same time some macros were made a
-%D bit more readable, and math support was extended to the
-%D larger sizes.
-%D
-%D One important characteristic of the font mechanism presented
-%D here is the postponing of font loading. This makes it
-%D possible to distribute \type{fmt} files without bothering
-%D about the specific breed of \type{tfm} files.
-%D
-%D Another feature implemented here is the massive switching
-%D from roman to {\ss sans serif}, {\tt teletype} or else. This
-%D means one doesn't have to take care of all kind of relations
-%D between fonts.
-%D
-%D \page[bigpreference]
-
-%D \macros
-%D {rm,ss,tt,hw,cg}
-%D
-%D Fonts are defined in separate files. When we define a font,
-%D we distinguish between several styles. In most cases we will
-%D use:
-%D
-%D \startlinecorrection
-%D \starttable[|l||]
-%D \HL
-%D \NC roman regular serif \NC \type{\rm} \NC\FR
-%D \NC sansserif sans support \NC \type{\ss} \NC\MR
-%D \NC type teletype mono \NC \type{\tt} \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D The number of styles is not limited to these three. When
-%D using Lucida Bright we can for instance also define:
-%D
-%D \startlinecorrection
-%D \starttable[|l||]
-%D \HL
-%D \NC handwritten \NC \type{\hw} \NC\FR
-%D \NC calligraphic \NC \type{\cg} \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D Anyone who feels the need, can define additional ones, like
-%D
-%D \startlinecorrection
-%D \starttable[|l||]
-%D \HL
-%D \NC faxfont \NC \type{\ff} \NC\FR
-%D \NC blackboard \NC \type{\bb} \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D Or even
-%D
-%D \startlinecorrection
-%D \starttable[|l||]
-%D \HL
-%D \NC hebrew \NC \type{\hb} \NC\SR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D Styles are grouped in font sets. At the moment there are
-%D three main sets defined:
-%D
-%D \startlinecorrection
-%D \starttable[|l|l||]
-%D \HL
-%D \NC Computer Modern Roman \NC Knuth \NC \type{cmr} \NC\FR
-%D \NC Lucida Bright \NC Bigelow \& Holmes \NC \type{lbr} \NC\MR
-%D \NC Standard Postscript Fonts \NC Adobe \NC \type{pos} \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D There are also some Computer Modern Roman alternatives:
-%D
-%D \startlinecorrection
-%D \starttable[|l|l||]
-%D \HL
-%D \NC Computer Modern Roman \NC Knuth \& Sauter \NC \type{sau} \NC\FR
-%D \NC Euler fonts \NC Zapf \NC \type{eul} \NC\MR
-%D \NC Computer Modern Concrete \NC Knuth \& Zapf \NC \type{con} \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D All these definitions are ordered in files with names like
-%D \type{font-cmr} and \type{font-pos}, where the last three
-%D characters specify the name as known to \CONTEXT.
-%D
-%D Within such a font set (\type{cmr}) and style (\type{\rm})
-%D we can define a number of text font alternatives:
-%D
-%D \startlinecorrection
-%D \starttable[|l||]
-%D \HL
-%D \NC typeface \NC \type{\tf} \NC\FR
-%D \NC boldface \NC \type{\bf} \NC\MR
-%D \NC slanted \NC \type{\sl} \NC\MR
-%D \NC italic \NC \type{\it} \NC\MR
-%D \NC boldslanted \NC \type{\bs} \NC\MR
-%D \NC bolditalic \NC \type{\bi} \NC\MR
-%D \NC smallcaps \NC \type{\sc} \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-
-%D For old stylish Frans Goddijn we have:
-%D
-%D \startlinecorrection
-%D \starttable[|l||]
-%D \HL
-%D \NC oldstyle \NC \type{\os} \NC\SR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D The availability of these alternatives depends on the
-%D completeness of a font family and of course the definitions
-%D in the font files.
-%D
-%D But let's not forget math. In addition to the previous \TEX\
-%D families (the mysterious \type{\fam}'s) we've got some more:
-%D
-%D \startlinecorrection
-%D \starttable[|l||]
-%D \HL
-%D \NC Math Roman \NC \type{\mr} \NC\FR
-%D \NC Math Italic \NC \type{\mi} \NC\MR
-%D \NC Math Symbol \NC \type{\sy} \NC\MR
-%D \NC Math Extra \NC \type{\ex} \NC\MR
-%D \NC Math A \NC \type{\ma} \NC\MR
-%D \NC Math B \NC \type{\mb} \NC\MR
-%D \NC Math C \NC \type{\mc} \NC\LR
-%D \HL
-%D \stoptable
-%D \stoplinecorrection
-%D
-%D Users can call for specific fonts in many ways. Switches to
-%D other typefaces, like the switch from normal to bold, are as
-%D intuitive as possible, which means that all dependant fonts
-%D also switch. One can imagine that this takes quite some
-%D processing time.
-%D
-%D Internally fonts are stored as combination of size, style
-%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}.
-%D Users are not confronted with sizes, but use the style or
-%D style+alternative to activate them.
-%D
-%D During the definition of a bodyfont one can also declare the
-%D available larger alternatives:
-%D
-%D \starttyping
-%D \tf \tfa \tfb \tfc ...
-%D \bf \bfa \bfb \bfc ...
-%D \sl \sla \slb \slc ...
-%D \stoptyping
-%D
-%D The smaller ones are automatically supplied and derived from
-%D the the bodyfont environment.
-%D
-%D \starttyping
-%D \tfx \tfxx
-%D \bfx \bfxx
-%D \slx \slxx
-%D \stoptyping
-%D
-%D There are only two smaller alternatives per style. The
-%D larger alternatives on the other hand have no limitations.
-%D
-%D These larger alternatives are mostly used in chapter and
-%D section titles or on title pages. When one switches to a
-%D larger alternative, the bold an other ones automatically
-%D adapt themselves:
-%D
-%D \startbuffer
-%D \tfd Hi \bf there\sl, here \tfb I \bf am
-%D \stopbuffer
-%D
-%S \startnarrower
-%D \typebuffer
-%S \stopnarrower
-%D
-%D therefore becomes:
-%D
-%D \startvoorbeeld
-%D \getbuffer
-%D \stopvoorbeeld
-%D
-%D Maybe this mechanism isn't always as logic, but as said
-%D before, we tried to make it as intuitive as possible.
-%D
-%D So a specific kind of glyph can be characterized by:
-%D
-%D \startnarrower
-%D family (cmr) + bodyfont (12pt) + style (rm) + alternative (bf) + size (a)
-%D \stopnarrower
-%D
-%D The last component (the size) is optional.
-%D
-%D We introduced \type{\tf} as command to call for the current
-%D normally sized typeface. This commands results in roman,
-%D sans serif, teletype or whatever style is in charge. Such
-%D rather massive switches of style sometimes take more
-%D processing time than comfortable. Of course there is a
-%D workaround for this: we can call fonts directly by means of
-%D commands like:
-%D
-%D \starttyping
-%D \rmtf \sssl \tttf \rmbsa
-%D \stoptyping
-%D
-%D One should realize that this fast calls have limitations,
-%D they lack for instance automatic super- and subscript
-%D support.
-%D
-%D This leaves us two more commands: \type{\tx} and
-%D \type{\txx}. These activate a smaller and even more smaller
-%D font than the current one and adapt themselves to the
-%D current alternative, so when \type{\bf} is active,
-%D \type{\tx} gives a smaller boldface, which in turn can be
-%D called directly by \type{\bfx}.
-%D
-%D These two smaller alternatives are specified by the bodyfont
-%D environment and therefore not necessarily have similar sizes
-%D as \type{\scriptsize} and \type{\scriptscriptsize}. The main
-%D reason for this incompatibility (which can easily be undone)
-%D lays in the fact that we often want a bit bigger characters
-%D than in math mode. In \CONTEXT\ for instance the \type{\tx}
-%D and \type{\txx} commands are used for surrogate
-%D \cap{smallcaps} which support both nesting and alternatives,
-%D like in {\bf\cap{a \cap{small} world}}, which was typeset by
-%D
-%D \starttyping
-%D \bf\cap{a \cap{small} world}
-%D \stoptyping
-%D
-%D And compare $\rm \scriptstyle THIS$ with the slightly larger
-%D \cap{THIS}: \ruledhbox{$\rm \scriptstyle scriptstyle: THIS$}
-%D or \ruledhbox{\cap{x style: THIS}} makes a big difference.
-
-%D The \type{x..d} sizes should be used grouped. If you
-%D don't group them, i.e. call them in a row, \CONTEXT\ will
-%D not be able to sort out your intention (\type {x} inside
-%D \type {d} inside \type {x}. etc.). The following table
-%D demonstrates this:
-%D
-%D \def\FontState{\setstrut\ruledhbox{\strut Hello}}
-%D
-%D \starttabulate[|||||]
-%D \HL
-%D \NC \rlap{\quad\bf grouped} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
-%D \HL
-%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
-%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
-%D \NC \type{\tf} \NC \tf \FontState \NC \tf \tx \FontState \NC \tf \txx \FontState \NC \NR
-%D \NC \type{\tfa} \NC \tfa \FontState \NC \tfa \tx \FontState \NC \tfa \txx \FontState \NC \NR
-%D \NC \type{\tfb} \NC \tfb \FontState \NC \tfb \tx \FontState \NC \tfb \txx \FontState \NC \NR
-%D \NC \type{\tfc} \NC \tfc \FontState \NC \tfc \tx \FontState \NC \tfc \txx \FontState \NC \NR
-%D \NC \type{\tfd} \NC \tfd \FontState \NC \tfd \tx \FontState \NC \tfd \txx \FontState \NC \NR
-%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
-%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
-%D \HL
-%D \stoptabulate
-%D
-%D \blank
-%D
-%D \starttabulate[|||||]
-%D \HL
-%D \NC \rlap{\quad\bf stacked} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
-%D \HL
-%D \NC \type{\tfx}
-%D \NC \tfx \FontState
-%D \NC \tfx \tx \FontState
-%D \NC \tfx \txx \FontState
-%D \NC \NR
-%D \NC \type{\tfxx}
-%D \NC \tfx\tfxx \FontState
-%D \NC \tfx\tfxx \tx \FontState
-%D \NC \tfx\tfxx \txx \FontState
-%D \NC \NR
-%D \NC \type{\tf}
-%D \NC \tfx\tfxx\tf \FontState
-%D \NC \tfx\tfxx\tf \tx \FontState
-%D \NC \tfx\tfxx\tf \txx \FontState
-%D \NC \NR
-%D \NC \type{\tfa}
-%D \NC \tfx\tfxx\tf\tfa \FontState
-%D \NC \tfx\tfxx\tf\tfa \tx \FontState
-%D \NC \tfx\tfxx\tf\tfa \txx \FontState
-%D \NC \NR
-%D \NC \type{\tfb}
-%D \NC \tfx\tfxx\tf\tfa\tfb \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb \tx \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb \txx \FontState
-%D \NC \NR
-%D \NC \type{\tfc}
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \tx \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \txx \FontState
-%D \NC \NR
-%D \NC \type{\tfd}
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \tx \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \txx \FontState
-%D \NC \NR
-%D \NC \type{\tfx}
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \tx \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \txx \FontState
-%D \NC \NR
-%D \NC \type{\tfxx}
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \tx \FontState
-%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \txx \FontState
-%D \NC \NR
-%D \HL
-%D \stoptabulate
-
-%D \macros
-%D {mf}
-%D
-%D Math fonts are a species in their own. They are tightly
-%D hooked into smaller and even smaller ones of similar breed
-%D to form a tight family. Let's first see how these are
-%D related:
-%D
-%D \startbuffer
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\rm 6x^2$
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\rm 6x^2$
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\tf 6x^2$
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\tf 6x^2$
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\bf 6x^2$
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\bf 6x^2$
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\sl 6x^2$
-%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\sl 6x^2$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Gives both an expected and unexpected result:
-%D
-%D \startvoorbeeld
-%D \startlines
-%D \getbuffer
-%D \stoplines
-%D \stopvoorbeeld
-%D
-%D We see here that the character shapes change accordingly to
-%D the current family, but that the symbols are always typeset
-%D in the font assigned to \type{\fam0}.
-%D
-%D \startbuffer
-%D $\tf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
-%D $\bf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
-%D $\sl\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
-%D $\bs\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
-%D $\it\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
-%D $\bi\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
-%D \stopbuffer
-%D
-%D \startvoorbeeld
-%D \startlines
-%D \getbuffer
-%D \stoplines
-%D \stopvoorbeeld
-%D
-%D In this example we see a new command \type{\mf} surface
-%D which means as much as {\em math font}. This commands
-%D reactivates the last font alternative and therefore equals
-%D \type{\bf}, \type{\sl} etc. but by default it equals
-%D \type{\tf}:
-
-\unexpanded\def\mf
- {\dodosetmathfont\fontalternative
- \csname\fontalternative\endcsname}
-
-%D The previous example was typeset saying:
-%D
-%D \typebuffer
-%D
-%D Beware: the exact location of \type{\mf} is not that
-%D important, we could as well has said
-%D
-%D \startbuffer
-%D $\bf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = \mf 6x^2$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D This is due to the way \TEX\ handles fonts in math mode.
-%D
-%D Of course we'll have to redefine \type{\mf} every time we
-%D change the current \type{\fam}.
-
-%D \macros
-%D {mbox,enablembox,mathop}
-%D
-%D Now how can we put this to use? Will the next sequence
-%D give the desired result?
-%D
-%D \startbuffer
-%D $\bf x^2 + \hbox{\mf whatever} + \sin(2x)$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D It won't!
-%D
-%D \startvoorbeeld
-%D \let\mathop=\normalmathop \getbuffer
-%D \stopvoorbeeld
-%D
-%D The reason for this is that \type{\sin} is defined as:
-%D
-%D \starttyping
-%D \def\sin{\mathop{\rm sin}\nolimits}
-%D \stoptyping
-%D
-%D We can fix this by defining
-
-\let\normalmathop=\mathop
-
-\def\mathop
- {\normalmathop
- \bgroup
- \let\rm\mf
- \let\next=}
-
-%D We can fix arbitrary horizontal boxes by redefining the
-%D \TEX\ primitive \type{\hbox}:
-%D
-%D \starttyping
-%D \let\normalhbox=\hbox
-%D
-%D \def\hbox{\ifmmode\mbox\else\normalhbox\fi}
-%D \stoptyping
-%D
-%D with
-%D
-%D \starttyping
-%D \def\mbox#1#%
-%D {\normalhbox#1\bgroup\mf\let\next=}
-%D \stoptyping
-%D
-%D or more robust, that is, also accepting \type{\hbox\bgroup}:
-%D
-%D \starttyping
-%D \def\mbox%
-%D {\normalhbox\bgroup\mf
-%D \dowithnextbox{\flushnextbox\egroup}%
-%D \normalhbox}
-%D \stoptyping
-%D
-%D And now:
-%D
-%D \startbuffer
-%D $\bf x^2 + \hbox{whatever} + \sin(2x)$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Indeed gives:
-%D
-%D \startvoorbeeld
-%D \enablembox\getbuffer
-%D \stopvoorbeeld
-%D
-%D But, do we want this kind of trickery to be activated? No,
-%D simply because we cannot be sure of incompatibilities,
-%D although for instance unboxing goes ok. Therefore we
-%D introduce:
-
-% best can go to math-ini and make \mf a hook then
-
-% better use \dowithnextboxcontent
-
-\def\normalmbox
- {\normalhbox\bgroup\mf
- \dowithnextbox{\flushnextbox\egroup}\normalhbox}
-
-% to test:
-%
-% \def\normalmbox
-% {\dowithnextboxcontent\mf\flushnextbox\normalhbox}
-
-\def\mbox
- {\ifmmode\normalmbox\else\normalhbox\fi}
-
-\def\enablembox
- {\appendtoks
- \ifx\normalhbox\undefined\let\normalhbox\hbox\fi
- \let\hbox\mbox
- \to\everymathematics}
-
-%D So in fact one can enable this feature if needed. I would say:
-%D go along, but use grouping if needed!
-
-%D \macros
-%D {mrfam,mifam,syfam,exfam,
-%D bsfam,bifam,scfam,tffam,
-%D mafam,mbfam,msfam}
-%D
-%D After this short mathematical excursion, we enter the world
-%D of fonts and fontswitching. We start with something very
-%D \TEX: \type{\fam} specified font families. \TEX\ uses
-%D families for managing fonts in math mode. Such a family has
-%D three members: text, script and scriptscript: $x^{y^z}$. In
-%D \CONTEXT\ we take a bit different approach than \PLAIN\
-%D \TEX\ does. \PLAIN\ \TEX\ needs at least four families for
-%D typesetting math. We use those but give them symbolic names.
-
-\chardef\mrfam = 0 % (Plain TeX) Math Roman
-\chardef\mifam = 1 % (Plain TeX) Math Italic
-\chardef\syfam = 2 % (Plain TeX) Math Symbol
-\chardef\exfam = 3 % (Plain TeX) Math Extra
-
-%D \PLAIN\ \TEX\ also defines families for {\it italic}, {\sl
-%D slanted} and {\bf bold} typefaces, so we don't have to
-%D define them here.
-
-\ifx\itfam\undefined
-
-\chardef\itfam = 4 % (Plain TeX) Italic
-\chardef\slfam = 5 % (Plain TeX) Slanted
-\chardef\bffam = 6 % (Plain TeX) Boldface
-
-\fi
-
-%D Family~7 in \PLAIN\ \TEX\ is not used in \CONTEXT, because
-%D we do massive switches from roman to sans serif, teletype or
-%D other faces.
-
-\ifx\ttfam\undefined
-
-\chardef\ttfam = 7 % (Plain TeX) can be reused!
-
-\fi
-
-%D We define ourselves some more families for {\bs bold
-%D slanted}, {\bi bold italic} and {\sc Small Caps}, so
-%D we can use them in math mode too. Instead of separate
-%D families for {\ss sans serif} and \type{teletype} we use the
-%D more general \type{\tffam}, which stands for typeface.
-
-\chardef\bsfam = 8 % (ConTeXt) BoldSlanted
-\chardef\bifam = 9 % (ConTeXt) BoldItalic
-\chardef\scfam = 10 % (ConTeXt) SmallCaps
-\chardef\tffam = 11 % (ConTeXt) TypeFace
-
-%D Because Taco needs a few more math families, we reuse
-%D family~7 for all those typefaces that have no related
-%D family, and therefore are grouped into one.
-
-\chardef\nnfam = 7 % (ReUsed) NoName
-
-%D Normally \type{\mrfam} equals \type{\tffam}, but a more
-%D distinctive alternatives are possible, for instance the
-%D Euler and Concrete Typefaces.
-%D
-%D After having defined all those in nature non||mathematical
-%D families, we define ourselves some real math ones. These are
-%D needed for the \AMS\ Symbol Fonts and Extended Lucida
-%D Bright.
-
-\chardef\mafam = 12 % (ConTeXt) Math A Fam (AmsTeX A)
-\chardef\mbfam = 13 % (ConTeXt) Math B Fam (AmsTeX B)
-\chardef\mcfam = 14 % (ConTeXt) Math C Fam (MathTime)
-\chardef\mdfam = 15 % (ConTeXt) Math D Fam (MathTime)
-
-%D Because there are 16~families and because \type{\ttfam}
-%D is reused, at the moment we have no so many families
-%D left. By default, we map any newly defined family on the
-%D last one (F).
-
-\def\newfam#1{\chardef#1=15 }
-
-%D This hack is also needed because in \ETEX\ we are going
-%D to reuse the \type {\newfam} allocation counter.
-
-%D To ease the support of font packages, we als define
-%D shortcuts to these familynames. This is necessary because
-%D the family names are in fact \type{\chardef}'s, which means
-%D that we're dealing with numbers (one can check this by
-%D applying \type{\showthe} and \type{\show}). In the
-%D specification of math symbols however we need hexadecimal
-%D numbers, so we have to convert the \type{\fam}'s value.
-
-\edef\hexmrfam {\hexnumber\mrfam} \edef\hexbsfam {\hexnumber\bsfam}
-\edef\hexmifam {\hexnumber\mifam} \edef\hexbifam {\hexnumber\bifam}
-\edef\hexsyfam {\hexnumber\syfam} \edef\hexscfam {\hexnumber\scfam}
-\edef\hexexfam {\hexnumber\exfam} \edef\hextffam {\hexnumber\tffam}
-\edef\hexitfam {\hexnumber\itfam} \edef\hexmafam {\hexnumber\mafam}
-\edef\hexslfam {\hexnumber\slfam} \edef\hexmbfam {\hexnumber\mbfam}
-\edef\hexbffam {\hexnumber\bffam} \edef\hexmcfam {\hexnumber\mcfam}
-\edef\hexnnfam {\hexnumber\nnfam} \edef\hexmdfam {\hexnumber\mdfam}
-
-%D \macros
-%D {uchar}
-%D
-%D This macro prepares \CONTEXT\ for \UNICODE\ support. By
-%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
-
-%D We define some (very private) constants to improve speed,
-%D memory usage and consistency.
-
-\def\@size@ {@f@si@} % bodyfont size prefix (12pt etc)
-\def\@style@ {@f@st@} % full style prefix (roman etc)
-\def\@shortstyle@ {@f@sh@} % short style prefix (rm etc)
-\def\@letter@ {@f@le@} % first alternative typeface
-\def\@noletter@ {@f@no@} % second alternative typeface
-
-%D The families can be grouped into math specific ones and
-%D more text related families, although text ones can be
-%D mapped onto the math ones to get for instance bold math.
-%D
-%D Both groups of families are handles by a couple of token
-%D list tagged as strategies. This implementation makes
-%D implementing extensions more comfortable.
-
-\newtoks \textstrategies
-\newtoks \mathstrategies
-\newtoks \symbstrategies
-
-\newif\ifsynchronizemathfonts \synchronizemathfontstrue
-
-\def\synchronizetext % stylish text in mmode
- {\ifsynchronizemathfonts\the\textstrategies\fi} % \if...\fam\minusone\fi}
-
-\def\synchronizemath % math stuff in mmode
- {\ifsynchronizemathfonts\the\mathstrategies\fi} % \if...\fam\minusone\fi}
-
-\def\synchronizesymb % stylish math stuff in mmode
- {\ifsynchronizemathfonts\the\symbstrategies\fi} % \if...\fam\minusone\fi}
-
-%D By not setting the family we can append a font switch to \type
-%D {\everymath}. On the other hand, one never knows in what family
-%D state the strategies brought us.
-%D
-%D \starttyping
-%D {\bfa $\the\fam$} {\bfa \everymath{} $\the\fam$}
-%D \stoptyping
-
-%D \macros
-%D {textonly}
-%D
-%D We can inhibit this slow||downer with:
-
-\def\textonly{\synchronizemathfontsfalse} % document this
-
-\appendtoks
- \dosettextfamily\c!tf
- \dosettextfamily\c!bf
- \dosettextfamily\c!sl
- \dosettextfamily\c!it
- \dosettextfamily\c!bs
- \dosettextfamily\c!bi
- \dosettextfamily\c!sc
-\to \textstrategies
-
-\def\dosettextfamily#1% better pass fontbody to dodoset
- {\let\savedfontbody\fontbody
- \let\fontfamily#1%
- \let\fontbody\scriptscriptface\dodosettextfamily\scriptscriptfont
- \let\fontbody\scriptface \dodosettextfamily \scriptfont
- \let\fontbody\textface \dodosettextfamily \textfont
- \let\fontbody\savedfontbody}
-
-% \def\s!nullfont{nullfont}
-
-\def\dodosettextfamily
- {\ifx\fontclass\empty
- \@EA\dodosettextfamilyA
- \else
- \@EA\dodosettextfamilyB
- \fi}
-
-\def\dodosettextfamilyA#1%
- {\ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
- \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
- \ifcsname \fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
- \csname \fontbody\c!mm\fontfamily\endcsname \else
- \ifcsname \fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
- \csname \fontbody\c!rm\fontfamily\fontsize\endcsname \else
- \ifcsname \fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
- \csname \fontbody\c!rm\fontfamily\endcsname \else
- \nullfont \autofontsizetrue
- \fi\fi\fi\fi
- #1\csname\fontfamily\s!fam\endcsname\font}
-
-\def\dodosettextfamilyB#1%
- {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
- \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
- \ifcsname\fontclass\fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
- \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \else
- \ifcsname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
- \csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \else
- \ifcsname\fontclass\fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
- \csname\fontclass\fontbody\c!rm\fontfamily\endcsname \else
- \dodosettextfamilyA#1%
- \fi\fi\fi\fi
- #1\csname\fontfamily\s!fam\endcsname\font}
-
-\def\mrfallback{\c!rm\c!tf}
-
-\appendtoks
- \dosetmathfamily\mrfam\textface\scriptface\scriptscriptface\c!mr\mrfallback
- \dosetmathfamily\mifam\textface\scriptface\scriptscriptface\c!mi\empty
- \dosetmathfamily\syfam\textface\scriptface\scriptscriptface\c!sy\empty
- \dosetmathfamily\exfam\textface\textface \textface \c!ex\empty
- \dosetmathfamily\mafam\textface\scriptface\scriptscriptface\c!ma\empty
- \dosetmathfamily\mbfam\textface\scriptface\scriptscriptface\c!mb\empty
- \dosetmathfamily\mcfam\textface\scriptface\scriptscriptface\c!mc\empty
-% \dosetmathfamily\mdfam\textface\scriptface\scriptscriptface\c!md\empty
- \dosetmathfamily\nnfam\textface\scriptface\scriptscriptface\c!nn\empty
-\to \mathstrategies
-
-\appendtoks
- \dosetskewchar\mifam\defaultskewcharmi % implemented later on
- \dosetskewchar\syfam\defaultskewcharsy % implemented later on
-\to \mathstrategies
-
-\def\dosetmathfamily#1#2#3#4#5#6%
- {\let\savedfontbody\fontbody % op hoger plan
- \let\fontfamily#5%
- \let\backfamily#6%
- \let\fontbody #4\dodosetmathfamily\scriptscriptfont#1%
- \let\fontbody #3\dodosetmathfamily \scriptfont#1%
- \let\fontbody #2\dodosetmathfamily \textfont#1%
- \let\fontbody\savedfontbody}
-
-\def\dodosetmathfamily
- {\ifx\fontclass\empty
- \@EA\dodosetmathfamilyA
- \else
- \@EA\dodosetmathfamilyB
- \fi}
-
-\def\dodosetmathfamilyA#1#2%
- {\ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
- \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
- \ifcsname \fontbody\c!mm\fontfamily \endcsname \autofontsizetrue
- \csname \fontbody\c!mm\fontfamily \endcsname \else
- \ifcsname \fontbody \backfamily\fontsize\endcsname \autofontsizefalse
- \csname \fontbody \backfamily\fontsize\endcsname \else
- \ifcsname \fontbody \backfamily \endcsname \autofontsizetrue
- \csname \fontbody \backfamily \endcsname \else
- \nullfont \autofontsizetrue
- \fi\fi\fi\fi
- #1#2\font}
-
-\def\dodosetmathfamilyB#1#2%
- {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
- \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
- \ifcsname\fontclass\fontbody\c!mm\fontfamily \endcsname \autofontsizetrue
- \csname\fontclass\fontbody\c!mm\fontfamily \endcsname \else
- \ifcsname\fontclass\fontbody \backfamily\fontsize\endcsname \autofontsizefalse
- \csname\fontclass\fontbody \backfamily\fontsize\endcsname \else
- \ifcsname\fontclass\fontbody \backfamily \endcsname \autofontsizetrue
- \csname\fontclass\fontbody \backfamily \endcsname \else
- \dodosetmathfamilyA#1#2%
- \fi\fi\fi\fi
- #1#2\font}
-
-\appendtoks
- \dosetsymbfamily\mrfam\textface\scriptface\scriptscriptface\c!mr
- \dosetsymbfamily\mifam\textface\scriptface\scriptscriptface\c!mi
- \dosetsymbfamily\syfam\textface\scriptface\scriptscriptface\c!sy
- \dosetsymbfamily\exfam\textface\textface \textface \c!ex
- \dosetsymbfamily\mafam\textface\scriptface\scriptscriptface\c!ma
- \dosetsymbfamily\mbfam\textface\scriptface\scriptscriptface\c!mb
- \dosetsymbfamily\mcfam\textface\scriptface\scriptscriptface\c!mc
-% \dosetsymbfamily\mdfam\textface\scriptface\scriptscriptface\c!md % also ?
-\to \symbstrategies
-
-\def\dosetsymbfamily#1#2#3#4#5%
- {\let\savedfontbody\fontbody
- \let\fontfamily#5%
- \let\fontbody #4\dodosetsymbfamily\scriptscriptfont#1%
- \let\fontbody #3\dodosetsymbfamily \scriptfont#1%
- \let\fontbody #2\dodosetsymbfamily \textfont#1%
- \let\fontbody\savedfontbody}
-
-\def\dodosetsymbfamily#1#2%
- {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
- \csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
- #1#2\font
- \else\ifcsname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
- \csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
- #1#2\font
- \fi\fi}
-
-%D All used styles, like rm, ss and tt, are saved in a comma
-%D separated list. Appart from practical limitations one can
-%D define as many styles as needed.
-
-\let\stylelist=\empty
-
-\def\fontsizelist{\s!text,\s!script,\s!scriptscript,\c!x,\c!xx,\c!big,\c!small}
-
-%D \macros
-%D {magfactor,magfactorhalf}
-%D
-%D There are several ways to specify a font. Three of them are
-%D pure \TeX\ ones, the fourth one is new:
-%D
-%D \starttyping
-%D \font\name=cmr12
-%D \font\name=cmr12 at 10pt
-%D \font\name=cmr12 scaled \magstep2
-%D \font\name=cmr12 sa 1.440
-%D \stoptyping
-%D
-%D The non||\TEX\ alternative \type{sa} stands for {\em scaled
-%D at}. This means as much as: scale the bodyfontsize with this
-%D factor. The value 1.440 in this example is derived
-%D from the \type{\magstep}'s as mentioned in
-%D \in{table}[tab:magstep]. We therefore introduce
-%D \type{\magfactor} as an alternative for \type{\magstep}.
-%D
-%D \placetable[here][tab:magstep]
-%D {Factors to be used with \type{sa.}}
-%D \starttable[|c|c|c|]
-%D \HL
-%D \NC \bf magstep \NC \bf equivalent \NC \bf factor \NC\SR
-%D \HL
-%D \NC 1 \NC \type{\magfactor1} \NC 1.200 \NC\FR
-%D \NC 2 \NC \type{\magfactor2} \NC 1.440 \NC\MR
-%D \NC 3 \NC \type{\magfactor3} \NC 1.728 \NC\MR
-%D \NC 4 \NC \type{\magfactor4} \NC 2.074 \NC\MR
-%D \NC 5 \NC \type{\magfactor5} \NC 2.488 \NC\LR
-%D \HL
-%D \stoptable
-
-\def\magstep#1% \relax removed, otherwise space after it sticks, else added
- {\ifcase#1 \@m\or1200\or1440\or1728\or2074\or2488\or\@m\fi}
-
-\def\magstephalf
- {1095}
-
-\def\magfactor#1%
- {\ifcase#1 1.000\or1.200\or1.440\or1.728\or2.074\or2.488\or1\fi}
-
-\def\magfactorhalf
- {1.095}
-
-%D These macros enable the use of definitions like \type{sa
-%D \magfactor3} which saves us both (mis|)|calculations and
-%D potential mistypings.
-%D
-%D Because \type {sa} (scaled at) and \type {mo} (mapped on)
-%D are not low level \TEX\ supported alternatives, we have to
-%D test for it ourselves. In doing so, we need an auxiliary
-%D \DIMENSION. We cannot use \type{\scratchdimen} because font
-%D loading can happen at any moment due to postponed loading.
-%D We could instead have used dirty grouping tricks, but this
-%D one works too.
-
-\let\defaultrelativefontsize \plusone
-\let\localrelativefontsize \plusone
-\def\localabsolutefontsize {\fontbody}
-
-\let\relativefontsize \defaultrelativefontsize
-
-\def\saverelativefontsize#1#2% #1=rm|ss|.. #2=waarde
- {\setxvalue{\fontclass#1\s!rscale}{#2}}
-
-\def\checkrelativefontsize#1%
- {\edef\relativefontsize
- {\ifcsname\fontclass#1\s!rscale\endcsname
- \csname\fontclass#1\s!rscale\endcsname
- \else
- \defaultrelativefontsize
- \fi}}
-
-%D We also save:
-
-\def\savemathtextstyle#1% #1=rm|ss|..
- {\doifsomething{#1}{\setxvalue{\fontclass\c!mm\s!text}{#1}}}
-
-\def\currentmathtextstyle % we default to empty !
- {\executeifdefined{\fontclass\c!mm\s!text}\empty}
-
-%D Scaling macros:
-
-\newdimen\scaledfont
-
-\let\somefontspec\empty
-
-\def\@fs@{@fs@}
-
-% \def\parsefontspec#1%
-% {\xdef\somefontspec{#1\space\relax}%
-% \@EA\doparsefontspec\somefontspec]% =>#1 \relax]
-% \donoparsefontspec}
-%
-% but, better:
-
-\let\somefontname\empty
-
-\def\parsefontspec#1%
- {\xdef\somefontspec{#1\space}%
- \@EA\doparsefontspec\somefontspec\relax]% =>#1 \relax]
- \donoparsefontspec}
-
-\def\doparsefontspec#1 #2%
- {\def\somefontname{#1}%
- \ifx\somefontname\empty % space before fontname
- \@EA\doparsefontspec
- \else\ifx#2\relax
- \@EAEAEA\setnaturalfontspec
- \else
- \@EAEAEA\setforcedfontspec
- \fi\fi
- #2}
-
-\def\setnaturalfontspec#1]%
- {\@fs@scaled\plusthousand\relax}
-
-\def\setforcedfontspec#1 #2\relax]%
- {\csname\@fs@#1\endcsname#2\relax}
-
-\def\@fs@scaled
- {\afterassignment\do@fs@scaled\scratchcounter}
-
-\def\do@fs@scaled#1\relax
- {\scaledfont\number\scratchcounter\points
- \scaledfont\localrelativefontsize\scaledfont
- \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi
- \scratchcounter\scaledfont % \scaledfont is now pretty large
- \advance\scratchcounter \medcard
- \divide\scratchcounter \maxcard
- \xdef\somefontspec{ scaled \the\scratchcounter}}
-
-\def\@fs@at
- {\afterassignment\do@fs@at\scaledfont}
-
-\def\do@fs@at#1\relax
- {\scaledfont\localrelativefontsize\scaledfont
- \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi
- \xdef\somefontspec{ at \the\scaledfont}}
-
-\def\@fs@sa
- {\scaledfont\localabsolutefontsize
- \setsamofontspec}
-
-\def\@fs@mo
- {\scaledfont\setmappedfontsize\localabsolutefontsize
- \setsamofontspec}
-
-\def\setsamofontspec#1\relax
- {\checkfontscale#1\end\scaledfont
- \scaledfont\localrelativefontsize\scaledfont
- \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi
- \xdef\somefontspec{ at \the\scaledfont}}
-
-\def\getfontparameters
- {\expandafter\dogetfontparameter\@@fontdata,]=,}
-
-\def\getglobalfontparameters
- {\expandafter\dogetglobalfontparameter\@@fontdata,]=,}
-
-\def\dogetfontparameter#1=#2,%
- {\if]#1\else
- \expandafter\def\csname\??ff\@@fontfile#1\endcsname{#2}%
- \expandafter\dogetfontparameter
- \fi}
-
-\def\dogetglobalfontparameter#1=#2,%
- {\if]#1\else
- \expandafter\gdef\csname\??ff\@@fontfile#1\endcsname{#2}%
- \expandafter\dogetglobalfontparameter
- \fi}
-
-\let\@@fontencoding\empty
-\let\@@fontmapping \empty
-\let\@@fonthandling\empty
-\let\@@fontfeatures\empty
-\let\@@skewchar \empty
-\let\@@hyphenchar \empty % todo, will go to encoding
-
-%D This brings down maps processing from 466 to 309 seconds
-%D ($-33$\%) and mfonts from 42 to 34 seconds ($-15$\%).
-
-\newif\ifskipfontcharacteristics \skipfontcharacteristicstrue
-
-%D When fontclasses are used, we define the font global,
-%D since namespaces are used. Otherwise we parse the specs
-%D each time.
-
-% wrong: this way we cannot set encoding etc
-%
-% \def\donoparsefontspec#1%
-% {\edef\fontfile{\truefontname\somefontname}%
-% \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi
-% \edef\lastfontname{\fontfile\somefontspec}%
-% \ifx\fontclass\empty\else\global\fi
-% \expandafter\font\csname#1\endcsname\lastfontname\relax
-% \relax}
-
-\let\fontfile\s!unknown
-
-\ifx\checkfontfilename\undefined \let\checkfontfilename\relax \fi
-
-% \definefontsynonym
-% [blabla]
-% [name:Latin Modern Something]
-% \definefontsynonym
-% [blabla]
-% [file:texnansi-lmr10]
-% [encoding=texnansi]
-% \definedfont[blabla] test \currentencoding/\fontfile \par
-% \definefontsynonym
-% [blabla]
-% [texnansi-lmtt10]
-% [encoding=texnansi]
-% \definedfont[blabla] test \currentencoding/\fontfile \par
-% \definefontsynonym
-% [blabla]
-% [ec-lmtt10]
-% [encoding=ec]
-% \definedfont[blabla] test \currentencoding/\fontfile \par
-
-\beginOLDTEX
-
- \def\checkfontfilename
- {\expandafter\docheckfontfilename\fontfile:\empty:\empty\relax}
-
- \def\docheckfontfilename#1:#2:#3#4\relax
- {\edef\!!stringa{#1}%
- \edef\!!stringb{#2}%
- \ifx\!!stringb\empty
- \edef\checkedfontfile{\!!stringa}%
- \else\ifx\!!stringa\v!file
- \edef\checkedfontfile{"\!!stringb"}%
- \else\ifx\!!stringa\v!name
- \edef\checkedfontfile{"\!!stringb"}%
- \else
- \edef\checkedfontfile{\!!stringb}%
- \fi\fi\fi}
-
-\endOLDTEX
-
-% \definefontfeature[default] [liga=yes,texligatures=yes,texquotes=yes]
-% \definefontfeature[default-caps][liga=yes,texligatures=yes,texquotes=yes,smcp=yes,script=latn]
-%
-% \starttypescript [serif] [palatino-nova-regular] [name]
-% \definefontsynonym[Serif] [palatinonova-regular][features=default]
-% \definefontsynonym[SerifCaps][palatinonova-regular][features=default-caps] % also sets Serif
-% \stoptypescript
-%
-% \starttypescript [serif] [palatino-nova-regular] [name]
-% \definefontsynonym[Serif] [palatinonova-regular*default]
-% \definefontsynonym[SerifCaps] [palatinonova-regular*default-caps]
-% \stoptypescript
-
-% \definetypeface[mainface][rm][serif][palatino-nova-regular][default] \setupbodyfont[mainface]
-%
-% \starttext
-% ``Test'' -- --- ff fi fl \sc ``Test'' -- --- ff fi fl
-% \stoptext
-
-% \starttext
-% \definefont
-% [blabla]
-% [name:Latin Modern Something]
-% \definefont
-% [blabla]
-% [file:texnansi-lmr10]
-% \blabla test
-% \definefont
-% [blabla]
-% [texnansi-lmtt10]
-% \blabla test
-% \stoptext
-
-% \starttext
-%
-% \setupcolors[state=start]
-%
-% \definefontfeature
-% [default-base]
-% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes]
-% \definefontfeature
-% [default-node]
-% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,mode=node]
-% \definefontfeature
-% [default-none]
-% [script=latn,language=dflt,liga=yes,kern=no, tlig=yes,trep=yes]
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:lmroman12regular*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:lmroman12regular*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:lmroman12regular*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \blank
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:texgyrepagella*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:texgyrepagella*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:texgyrepagella*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \blank
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:palatinonovaregular*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:palatinonovaregular*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:palatinonovaregular*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:OfficinaSerifBookITC*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:OfficinaSerifBookITC*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:OfficinaSerifBookITC*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \definefontfeature[superdefault][default][compose=yes]
-%
-% {\font\oeps=name:lmroman10regular*default at 30pt \oeps test \char7683}
-% {\font\oeps=name:lmroman10regular*superdefault at 30pt \oeps test \char7683}
-%
-% \stoptext
-
-\beginLUATEX
-
- \def\checkfontfilename% -- todo: integrate so that we call do.. directly
- {\expandafter\docheckfontfilename\fontfile*\empty*\relax}
-
- \def\docheckfontfilename#1*#2#3*#4\relax % class overrules file
- {\edef\checkedfontfile{{%
- #1%
- \ifcsname\fontclass\s!features\endcsname
- \expandafter\ifx\csname\fontclass\s!features\endcsname\empty
- \ifx\@@fontfeatures\empty\ifx#2\empty\else*#2#3\fi\else*\@@fontfeatures\fi
- \else
- *\csname\fontclass\s!features\endcsname
- \fi
- \fi
- }}%
- \doshowcheckedfontfeatures}
-
-\endLUATEX
-
-% xetex / todo: disable default features ! file:, name:, [], "" etc etc
-
-\beginXETEX
-
- % for some reason xetex does not support [filename] for tfm files and
- % quotes also behave kind of strange " vs ' vs [ vs ...
-
- % we need to use the specs,
- %
- % \font\myfont = msam7 % ok
- % \font\myfont = "msam7" % also ok
- % \font\myfont = "msam7" at 8pt % error
-
- \ifx\suppressfontnotfounderror\undefined
-
- \newcount\xetexsavedinteractionmode
- \newbox \xetexcrappyhackbox
-
- \def\doiffoundxetexfontelse#1#2%
- {\xetexsavedinteractionmode\interactionmode
- \batchmode
- \setbox\xetexcrappyhackbox\vbox{\par}% resets error count
- \font\xetextempfont=#2\somefontspec\relax
- \edef\xetextempfont{\fontname\xetextempfont}%
- \ifx\xetextempfont\nullfontname
- \interactionmode\xetexsavedinteractionmode
- %\writestatus\m!fonts{fails #1: #2 (\xetextempfont)}%
- \expandafter\secondoftwoarguments
- \else
- \interactionmode\xetexsavedinteractionmode
- %\writestatus\m!fonts{succeeds #1: #2 (\xetextempfont)}%
- \expandafter\firstoftwoarguments
- \fi}
-
- \else
-
- \def\doiffoundxetexfontelse#1#2%
- {\suppressfontnotfounderror\plusone
- \font\xetextempfont=#2\somefontspec\relax
- \suppressfontnotfounderror\zerocount
- \edef\xetextempfont{\fontname\xetextempfont}%
- \ifx\xetextempfont\nullfontname
- %\writestatus\m!fonts{fails #1: #2 (\xetextempfont)}%
- \expandafter\secondoftwoarguments
- \else
- %\writestatus\m!fonts{succeeds #1: #2 (\xetextempfont)}%
- \expandafter\firstoftwoarguments
- \fi}
-
- \fi
-
- \def\docheckfontfilenameprefix#1:#2:#3#4\relax
- {\edef\!!stringa{#1}%
- \edef\!!stringb{#2}%
- \ifx\!!stringb\empty
- % no prefix
- \let\checkedfontfile\!!stringa
- \doiffoundxetexfontelse{1a}{\checkedfontfile\checkedfontfeatures}
- {\edef\checkedfontfile{\checkedfontfile\checkedfontfeatures}}
- {\doiffoundxetexfontelse{1b}{"\checkedfontfile\checkedfontfeatures"}
- {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
- {\doiffoundxetexfontelse{1c}{"[\checkedfontfile]\checkedfontfeatures"}
- {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
- {}}}%
- \else\ifx\!!stringa\v!file
- % force file, only file check when no spaces
- \let\checkedfontfile\!!stringb
- \doiffoundxetexfontelse{2b}{"[\checkedfontfile]\checkedfontfeatures"}
- {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
- {\doiffoundxetexfontelse{2c}{"\checkedfontfile\checkedfontfeatures"}
- {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
- {}}%
- \else\ifx\!!stringa\v!name
- % force name, always lookup by xetex itself, "" forces otf/ttf/type1
- \edef\checkedfontfile{"\!!stringb\checkedfontfeatures"}%
- \else
- % whatever, maybe even xetex spec, forget about features
- \edef\checkedfontfile{"\!!stringa\!!stringb"}%
- \fi\fi\fi}
-
- \def\checkfontfilename% -- todo: integrate so that we call do.. directly
- {\expandafter\docheckfontfilename\fontfile*\empty*\relax}
-
- \def\docheckfontfilename#1*#2#3*#4\relax % class overrules file
- {\edef\checkedfontfeatures
- {\expandafter\ifx\csname\fontclass\s!features\endcsname\empty
- \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
- \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away
- \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
- \else
- \csname\fontclass\s!features\endcsname
- \fi\fi}%
- \ifx\checkedfontfeatures\empty
- % done
- \else
- \edef\checkedfontfeatures{\executeifdefined{\??fa\checkedfontfeatures}\empty}%
- \ifx\checkedfontfeatures\empty
- % done
- \else
- \let\convertedfontfeatures\empty
- \processcommacommand[\checkedfontfeatures]\doconvertfontfeatures % raw
- \ifx\convertedfontfeatures\empty
- \let\checkedfontfeatures\empty
- \else
- \edef\checkedfontfeatures{:\convertedfontfeatures}%
- \fi
- \fi
- \fi
- \docheckfontfilenameprefix#1:\empty:\empty\relax
- \doshowcheckedfontfeatures}
-
- \def\dodoconvertfontfeatures#1=#2#3=#4\relax
- {\ifx#2\empty
- % invalid feature
- \else\ifcsname @xtx@#1@#2#3\endcsname
- \expandafter\ifx\csname @xtx@#1@#2#3\endcsname\empty\else
- \edef\convertedfontfeatures{\convertedfontfeatures\csname @xtx@#1@#2#3\endcsname;}%
- \fi
- \else
- \edef\!!stringa{#1}%
- \edef\!!stringb{#2#3}%
- \edef\convertedfontfeatures
- {\convertedfontfeatures
- \ifx\!!stringb\v!yes
- +\!!stringa
- \else\ifx\!!stringb\v!no
- -\!!stringa
- \else
- \!!stringa=\!!stringb
- \fi\fi;}%
- \fi\fi}
-
- \def\doconvertfontfeatures#1%
- {\dodoconvertfontfeatures#1=\empty=\relax}
-
- \def\remapfontfeature #1 #2 #3 {\setevalue{@xtx@#1@#2}{#3}}
-
- % this may move to another file, maybe font-xtx
-
- \remapfontfeature tlig yes mapping=tlig
- %remapfontfeature tlig no mapping=
- \remapfontfeature trep yes {}
- \remapfontfeature trep no {}
- \remapfontfeature texligatures yes mapping=tlig
- %remapfontfeature texligatures no mapping=
- %remapfontfeature texquotes yes mapping=tex-text
- %remapfontfeature texquotes no mapping=
-
-\endXETEX
-
-\let\doshowcheckedfontfeatures\relax
-
-\def\showcheckedfontfeatures
- {\def\doshowcheckedfontfeatures{\writestatus\m!fonts{checked: \checkedfontfile}}}
-
-\def\checkedfontfile{\fontfile} % default
-
-% todo: adapt this to luatex, i.e. no encoding etc mess
-
-\def\donoparsefontspec % #1 == \cs
- {\edef\fontfile{\truefontname\somefontname}%
- \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi
- \updatefontparameters
- \checkfontfilename
- \edef\lastfontname{\checkedfontfile\somefontspec}%
- \ifx\fontclass\empty
- \expandafter\definefontlocal
- \else
- \expandafter\definefontglobal
- \fi} % #1 == \cs
-
-\def\definefontlocal#1%
- {\expandafter\edef\csname#1\endcsname % ! ! ! ! not needed in luatex ! ! ! !
- {\noexpand\csname#1:\endcsname
- \noexpand\reactivatefont{\somefontname}{\fontfile}}%
- \expandafter\font\csname#1:\endcsname\lastfontname\relax}
-
-\def\definefontglobal#1% stores \somefontname=Mono and \fontfile=cmtt10
- {\expandafter\xdef\csname#1\endcsname % ! ! ! ! not needed in luatex ! ! ! !
- {\noexpand\csname#1:\endcsname
- \noexpand\reactivatefont{\somefontname}{\fontfile}}%
- \global\expandafter\font\csname#1:\endcsname\lastfontname\relax}
-
-\def\reactivatefont#1#2%
- {\def\somefontname{#1}%
- \def\fontfile {#2}%
- \updatefontparameters}
-
-% can be handy for tracing purposes
-%
-% \def\reportfontdefinition
-% {\bgroup
-% \expanded{\infofont
-% [\lastfontidentifier
-% ->\newfontidentifier
-% ->\fontname\csname\newfontidentifier\endcsname]}%
-% \endgraf
-% \egroup}
-
-%D An additional the second \type {\font} definition can
-%D prevent fuzzy font refs
-%D
-%D \starttyping
-%D \expandafter\font\csname\dummyfontname\endcsname\lastfontname
-%D \stoptyping
-%D
-%D but somehow they changed \TEX\ so that it does not matter
-%D any more.
-
-\def \defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone
-\edef\nullfontname {\fontname\nullfont}
-\edef\dummyfontname {font\strippedcsname\\}
-
-\beginXETEX
- \def\defaultfontfile{lmtypewriter10-regular}
-\endXETEX
-
-%D \macros
-%D {everyfont,everyfontswitch}
-%D
-%D For special purposes, we provide a hook.
-
-% \newevery \everyfont \relax
-% \newevery \everyfontswitch \relax
-
-% safer but sometimes introducing newlines in the log
-%
-% \batchmode
-% \font\lastloadedfont\fontfile\somefontspec\relax
-% \errorstopmode
-% \edef\lastfontname{\fontname\lastloadedfont}%
-% \ifx\lastfontname\nullfontname
-% \showmessage\m!fonts{10}{\fontfile}%
-% \expandafter\font\csname#1\endcsname=\defaultfontfile\somefontspec\relax
-% \else
-% \expandafter\let\csname#1\endcsname\lastloadedfont
-% \fi
-
-%D We also accept \type{sa a}||\type{sa d} as specification.
-
-\def\checkfontscale#1#2\end#3%
- {#3\ifcsname\??ft\s!default\noexpand#1\endcsname
- \csname\??ft\s!default\noexpand#1\endcsname\else#1#2%
- \fi#3}
-
-%D The duplicate font definition, using the ever the same dummy
-%D font name, results in less fuzzy error messages. In the log
-%D file, for instance when overfull boxes are reported, the
-%D simple keyword `font' replaces the \TEX\ ordinated name. The
-%D latter can be too misleading, due to the fact that \TEX\ has
-%D a rather optimized font memory management. Thanks to Taco
-%D for helping me sort this out.
-
-%D \macros
-%D {definefontsynonym, doifelsefontsynonym,
-%D expandfontsynonym, truefontname, truefontdata}
-%D
-%D While looking for fonts, fontsynonyms are used for accessing
-%D the files!
-%D
-%D \starttyping
-%D \definefontsynonym[Serif][Lucida-Bright]
-%D \definefontsynonym[Lucida-Bright][lbr][encoding=texnansi]
-%D \stoptyping
-%D
-%D The definitions can be accessed by:
-%D
-%D \startlines
-%D name: \type {\truefontname{Lucida-Bright}}
-%D data: \type {\truefontdata{\truefontname{Lucida-Bright}}}
-%D \stoplines
-
-% \def\definefontsynonym
-% {\dotripleempty\dodefinefontsynonym}
-%
-% \def\dodefinefontsynonym[#1][#2][#3]%
-% {\@EA\edef\csname\??ff\fontclass#1\endcsname{#2}%
-% \ifthirdargument
-% \edef\@@fontdata{#3}%
-% \ifx\@@fontdata\empty \else
-% \edef\@@fontfile{#2}%
-% \ifx\fontclass\empty
-% \getfontparameters
-% \else
-% \getglobalfontparameters
-% \fi
-% \fi
-% \fi}
-%
-% slightly faster, noticable when loading many typefaces,
-%
-% \testfeatureonce{5000}{\definefontsynonym[somefont][somename]} \end
-
-\def\classfont#1#2{#1#2} % \definefont[whatever][\classfont{xx}{yy} at 10pt]
-
-\beginOLDTEX
-
-\def\definefontsynonym[#1]#2[#3]%
- {\edef\@@fontfile{#3}%
- \@EA\let\csname\??ff\fontclass#1\endcsname\@@fontfile
- \doifnextcharelse[\dodefinefontsynonym\donothing}
-
-\def\dodefinefontsynonym[#1]%
- {\edef\@@fontdata{#1}%
- \ifx\@@fontdata\empty \else \ifx\fontclass\empty
- \getfontparameters
- \else
- \getglobalfontparameters
- \fi \fi}
-
-\endOLDTEX
-
-% We need to move the feature into the filename else it may be
-% overloaded by another reference. For instance the definition of
-% a regular and caps variant can use the same font.
-
-% We could use an indirect method ... store in 'array' and refer to
-% slot.
-
-\beginNEWTEX
-
-\def\definefontsynonym[#1]#2[#3]%
- {\edef\@@fontname{#1}%
- \edef\@@fontfile{#3}%
- \doifnextcharelse[\dodefinefontsynonym\nodefinefontsynonym}
-
-\def\nodefinefontsynonym
- {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile}
-
-\def\dodefinefontsynonym[#1]%
- {\edef\@@fontdata{#1}%
- \ifx\@@fontdata\empty
- \nodefinefontsynonym
- \else
- \ifx\fontclass\empty
- \getfontparameters
- \else
- \getglobalfontparameters
- \fi
- \ifcsname\??ff\@@fontfile\s!features\endcsname
- \@EA\edef\csname\??ff\fontclass\@@fontname\endcsname{\@@fontfile*\csname\??ff\@@fontfile\s!features\endcsname}%
- \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined
- \else
- \nodefinefontsynonym
- \fi
- \fi}
-
-\endNEWTEX
-
-% \def\resetfontsynonym[#1]% fails
-% {\letbeundefined{\??ff\fontclass#1}\letbeundefined{\??ff#1}}
-
-\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
-
-\def\setupfontsynonym
- {\dodoubleempty\dosetupfontsynonym}
-
-\def\dosetupfontsynonym[#1][#2]%
- {\edef\@@fontdata{#2}%
- \ifx\@@fontdata\empty \else
- \edef\@@fontfile{#1}%
- \ifx\fontclass\empty
- \getfontparameters
- \else
- \getglobalfontparameters
- \fi
- \fi}
-
-\def\truefontdata#1#2%
- {\ifcsname\??ff#1#2\endcsname
- % raw(Regular) raw(key)
- \csname\??ff#1#2\endcsname
- \else\ifcsname\??ff\fontclass#1\endcsname
- % exp(palatino Regular) raw(key)
- \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
- \else\ifcsname\??ff#1\endcsname
- % exp(Regular) raw(key)
- \expandafter\truefontdata\csname\??ff#1\endcsname#2%
- \else\ifcsname\??ff#2\endcsname
- % raw(key)
- \csname\??ff#2\endcsname
- \fi\fi\fi\fi}
-
-\beginOLDTEX
-
-\def\truefontname#1%
- {\ifcsname\??ff\fontclass#1\endcsname
- \@EA\truefontname\csname\??ff\fontclass#1\endcsname
- \else\ifcsname\??ff#1\endcsname
- \@EA\truefontname\csname\??ff#1\endcsname
- \else
- #1%
- \fi\fi}
-
-\endOLDTEX
-
-\beginNEWTEX
-
-% simple version
-%
-% \def\truefontname#1%
-% {\@EA\dotruefontname#1*\relax}
-%
-% \def\dotruefontname#1*#2\relax
-% {\ifcsname\??ff\fontclass#1\endcsname
-% \@EA\truefontname\csname\??ff\fontclass#1\endcsname
-% \else\ifcsname\??ff#1\endcsname
-% \@EA\truefontname\csname\??ff#1\endcsname
-% \else
-% #1%
-% \fi\fi}
-%
-% last counts
-%
-% \def\truefontname#1%
-% {\@EA\dotruefontname#1*\empty*\relax}
-%
-% \def\dotruefontname#1*#2#3*#4\relax
-% {\ifcsname\??ff\fontclass#1\endcsname
-% \ifx#2\empty
-% \@EA\truefontname\csname\??ff\fontclass#1\endcsname
-% \else
-% \@EA\truefontname\csname\??ff\fontclass#1\endcsname*#2#3%
-% \fi
-% \else\ifcsname\??ff#1\endcsname
-% \ifx#2\empty
-% \@EA\truefontname\csname\??ff#1\endcsname
-% \else
-% \@EA\truefontname\csname\??ff#1\endcsname*#2#3%
-% \fi
-% \else
-% \ifx#2\empty
-% #1%
-% \else
-% #1*#2#3%
-% \fi
-% \fi\fi}
-%
-% first counts
-
-\def\truefontname#1%
- {\@EA\dotruefontname#1*\empty*\relax}
-
-\def\dotruefontname#1*#2#3*#4\relax
- {\ifcsname\??ff\fontclass#1\endcsname
- \ifx#2\empty
- \@EA\truefontname\csname\??ff\fontclass#1\endcsname
- \else
- \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname*#2#3%
- \fi
- \else\ifcsname\??ff#1\endcsname
- \ifx#2\empty
- \@EA\truefontname\csname\??ff#1\endcsname
- \else
- \@EA\redotruefontname\csname\??ff#1\endcsname*#2#3%
- \fi
- \else
- #1\ifx#2\empty\else*#2#3\fi
- \fi\fi}
-
-\def\redotruefontname#1%
- {\@EA\dodotruefontname#1*\relax}
-
-\def\dodotruefontname#1*#2\relax
- {\ifcsname\??ff\fontclass#1\endcsname
- \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname
- \else\ifcsname\??ff#1\endcsname
- \@EA\redotruefontname\csname\??ff#1\endcsname
- \else
- #1%
- \fi\fi}
-
-\endNEWTEX
-
-\def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1)
- {\ifcsname\??ff\fontclass#2\endcsname
- \expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}%
- \fi}
-
-\def\doifelsefontsynonym#1%
- {\ifcsname\??ff\fontclass#1\endcsname
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
-
-% \definetypeface[palatino][rm][serif][palatino,allbold][default]
-%
-% \startfontclass[palatino]
-% \definefontsynonym [Serif] [SerifBold]
-% \definefontsynonym [SerifItalic] [SerifBoldItalic]
-% \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
-% \definefontsynonym [SerifCaps] [SerifBold]
-% \stopfontclass
-%
-% \setupbodyfont[palatino]
-
-\def\startfontclass
- {\dosingleempty\dostartfontclass}
-
-\def\dostartfontclass[#1]%
- {\pushmacro\fontclass
- \doifelse{#1}{\v!each}
- {\let\fontclass\empty}
- {\doifsomething{#1}{\def\fontclass{#1}}}}
-
-\def\stopfontclass
- {\popmacro\fontclass}
-
-%D \macros
-%D {tracedfontname}
-%D
-%D A goody:
-
-\def\tracedfontencoding#1%
- {\ifcsname\??ff#1\s!encoding\endcsname
- \space[\csname\??ff#1\s!encoding\endcsname]%
- \fi}
-
-\def\tracedfontname#1%
- {\ifcsname\??ff\fontclass#1\endcsname
- #1\tracedfontencoding{\fontclass#1}\space->\space
- \@EA\tracedfontname\csname\??ff\fontclass#1\endcsname
- \else\ifcsname\??ff#1\endcsname
- #1\tracedfontencoding{#1}\space->\space
- \@EA\tracedfontname\csname\??ff#1\endcsname
- \else
- #1%
- \fi\fi}
-
-%D \macros
-%D {getfontfileparameters}
-%D
-%D For special purposes, one can use the next macro to
-%D access font file characteristics, for instance:
-%D
-%D \starttyping
-%D \getfontfileparameters{Regular}
-%D \stoptyping
-%D
-%D can result in:
-%D
-%D \starttyping
-%D \def\currentfontfileencoding{texnansi}
-%D \stoptyping
-
-% \def\@@currentfontfile{currentfontfile}
-%
-% \def\getfontfileparameters#1%
-% {\edef\fontdata{\truefontdata{\truefontname{#1}}}%
-% \expanded{\getparameters[\@@currentfontfile][\fontdata]}}
-
-\def\getfontfileparameters#1% can be simpler for mkii
- {\edef\@@truefontname{\truefontname{#1}}%
- \edef\currentfontfileencoding{\truefontdata\@@truefontname\s!encoding}%
- \edef\currentfontfilemapping {\truefontdata\@@truefontname\s!mapping }%
- \edef\currentfontfilehandling{\truefontdata\@@truefontname\s!handling}%
- \edef\currentfontfilefeatures{\truefontdata\@@truefontname\s!features}}
-
-%D \macros
-%D {definefont}
-%D
-%D Before we implement the main definition macro, we first show
-%D one for local use:
-%D
-%D \starttyping
-%D \definefont[Some][LucidaBright at 100pt] \Some some
-%D \definefont[More][LucidaBright scaled 3000] \More more
-%D \definefont[Nice][LucidaBright mp 2] \Nice nice
-%D \definefont[Text][LucidaBright sa 5.4] \Text last
-%D \stoptyping
-%D
-%D The implementation looks as follows:
-
-\def\definefont
- {\dotripleempty\dodefinefont}
-
-\def\dodefinefont[#1][#2][#3]% [name][spec][1.6 | line=10pt | setup_id]
- {\doifinstringelse{ }{#2}
- {\ifthirdargument
- \unexpanded\setvalue{#1}{\redodefinefont{#1}{#2}{#3}}%
- \else
- \unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}%
- \fi}
- {\definefont[#1][#2 sa *][#3]}}
-
-\def\redodefinefont#1#2#3%
- {\dododefinefont{#1}{#2}%
- \doifsetupselse{#3}
- {\setups[#3]} % don't forget to document this !
- {\setuplocalinterlinespace[#3]%
- \setupspacing}} % needed ?
-
-\def\definefrozenfont
- {\dotripleempty\dodefinefrozenfont}
-
-\def\dodefinefrozenfont[#1][#2][#3]%
- {\dodefinefont[#1][#2][#3]%
- \expandafter\let\csname\lastfontidentifier\expandafter\endcsname\csname\rawfontidentifier\endcsname}
-
-% \def\defineclassfont
-% {\doquadrupleempty\dodefineclassfont}
-%
-% \def\dodefineclassfont[#1][#2][#3][#4]% #2 = class
-% {\iffourthargument
-% \definefont[#1][#2#3][#4]%
-% %\else\ifthirdargument
-% % \definefont[#1][#2#3]%
-% \else
-% \definefont[#1][#2]%
-% \fi}
-
-%D The \type {*} makes the switch local, so that we can redefine a
-%D logical name and/or change the size in between.
-
-\newif\ifautofontsize \autofontsizetrue
-
-\let\lastfontidentifier\empty
-
-\def\rawfontidentifier{**\lastfontidentifier\fontsize**}
-\def\newfontidentifier{*\fontclass\lastfontidentifier\fontsize*}
-
-% 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%
- {\edef\lastfontidentifier{#1}%
- \let\localrelativefontsize\defaultrelativefontsize
- \let\localabsolutefontsize\fontbody
- \parsefontspec{#2}\rawfontidentifier
- \let\localrelativefontsize\defaultrelativefontsize % not needed
- \csname\rawfontidentifier\endcsname
- \autofontsizefalse
- \setfontcharacteristics
- \the\everyfontswitch}
-
-\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine
- {\edef\lastfontidentifier{#3}%
- \ifcsname\newfontidentifier\endcsname\else
- \def\localrelativefontsize{#1}%
- \def\localabsolutefontsize{#2}%
- \parsefontspec{#4}\newfontidentifier
- \let\localrelativefontsize\defaultrelativefontsize % not needed
- \fi
- \csname\newfontidentifier\endcsname
- \autofontsizefalse
- %\edef\lastfontidentifier{#3}%
- \ifskipfontcharacteristics \else
- \setfontcharacteristics
- \the\everyfontswitch
- \fi}
-
-%D I considered checking for mistakenly use of \PLAIN's
-%D \type{\magstep}'s but although it would take only a few
-%D lines of code, this would not add to consistent use. I
-%D therefore removed this check.
-
-%D \macros
-%D {mapfontsize}
-%D
-%D For special purposes, like in math, you may want to use
-%D slightly different sizes than the ones given. This happens
-%D for instance with the Math Times fonts. Mapped font sizes
-%D can be specified by using the \type {mo} key instead of
-%D \type {sa} in font definitions.
-%D
-%D \startbuffer
-%D \mapfontsize[10pt][11pt]
-%D \mapfontsize[11pt][12pt]
-%D \mapfontsize[12pt][13pt]
-%D
-%D \definefont[test][Serif]\test TEST \par
-%D \definefont[test][Serif sa 5]\test TEST \par
-%D \definefont[test][Serif mo 5]\test TEST \par
-%D \definefont[test][Serif sa d]\test TEST \par
-%D \definefont[test][Serif at 60pt]\test TEST \par
-%D \definefont[test][Serif scaled 6000]\test TEST \par
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \startpacked
-%D \getbuffer
-%D \stoppacked
-
-\def\mapfontsize
- {\dodoubleargument\domapfontsize}
-
-\def\domapfontsize[#1][#2]%
- {\scratchdimen#1\relax % \relax is really needed here
- \setvalue{\??ft*\the\scratchdimen}{#2}}
-
-\def\setmappedfontsize#1%
- {\ifcsname\??ft*#1\endcsname
- \csname\??ft*#1\endcsname
- \else
- #1%
- \fi}
-
-%D \macros
-%D {getfontname}
-%D
-%D The names of the fonts can be called with the rather simple
-%D macro \type{\getfontname}. When for instance we pass
-%D \type{12ptrmtf} as argument, we get \getfontname{12ptrmtf}.
-
-\def\getfontname#1%
- {\csname\??ft#1\endcsname}
-
-%D To be documented.
-
-\let\sizelist\empty
-
-\def\definefontsize[#1]% sneller met toks
- {\addtocommalist{#1}\sizelist
- \def\docommand##1%
- {\def\dodocommand####1%
- {\def\dododocommand########1%
- %{\checkbodyfont{}{########1}{####1}{##1}}%
- {\checkbodyfont{########1}{####1}{##1}}%
- \processcommacommand[\stylelist]\dododocommand}%
- \processcommacommand[\alternativelist]\dodocommand}%
- \processcommacommand[\sizelist]\docommand}
-
-\def\alternativetextlist{\c!tf,\c!bf,\c!it,\c!sl,\c!bs,\c!bi,\c!sc}
-\def\alternativemathlist{\c!mr,\c!mi,\c!sy,\c!ex,\c!ma,\c!mb}
-
-\let\alternativelist\alternativetextlist % upward compatible
-
-%\definefontsize[\c!a] \definefontsize[\c!b]
-%\definefontsize[\c!c] \definefontsize[\c!d]
-
-%D \macros
-%D {currentfontscale,currentfontbodyscale}
-%D
-%D Sometimes we need to have access to the font scale
-%D including the \type{a}||\type{d} sizes. The next macro
-%D returns the current scaling factor. Take a look at
-%D \type {cont-log.tex} for an example of its use.
-
-\def\currentfontscale
- {\csname\??ft\s!default
- \ifcsname\??ft\s!default\xfontsize\endcsname \xfontsize \else
- \ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi
- \endcsname}
-
-\def\currentfontbodyscale
- {\csname\??ft\s!default
- \ifcsname\??ft\s!default\fontsize\endcsname \fontsize \else
- \ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi
- \endcsname}
-
-\setvalue{\??ft\s!default}{1}
-
-%D Both alternatives use \type {\xfontsize}, a macro that
-%D expands to the current size in terms of \type {a} \unknown
-%D \type {d}, nothing, or \type {x} \unknown \type {xx}.
-
-\def\xfontsize{\ifcase\currentxfontsize\fontsize\or\c!x\else\c!xx\fi}
-
-%D A typical use of this command is in commands that switch
-%D to another font bypassing the font mechanism:
-%D
-%D \starttyping
-%D \font\myfont=\truefontname{MyFont} at \currentfontscale\bodyfontsize
-%D \stoptyping
-
-%D Now we enter the area of font switching. The switching
-%D mechanism has to take care of several situations, like:
-%D
-%D \startitemize[packed]
-%D \item changing the overal document fonts (including margins,
-%D headers and footers)
-%D \item changing local fonts (only the running text)
-%D \item smaller and even more smaller alternatives (super-
-%D and subscripts)
-%D \stopitemize
-%D
-%D \TEX\ offers a powerfull family mechanism for super- and
-%D subscripts in math mode. In text mode however, we don't use
-%D families for the smaller alternatives, and therefore have
-%D to take care of it otherwise.
-
-%D \macros
-%D {definebodyfontenvironment,setupbodyfontenvironment}
-%D
-%D The relationship between the several sizes of a font, is
-%D defined by:
-%D
-%D \showsetup{definebodyfontenvironment}
-%D
-%D Later on we will see how these parameters are used, so for
-%D the moment we stick with an example:
-%D
-%D \starttyping
-%D \definebodyfontenvironment
-%D [12pt]
-%D [ text=12pt,
-%D script=9pt,
-%D scriptscript=7pt,
-%D x=10pt,
-%D xx=8pt,
-%D big=12pt,
-%D small=10pt]
-%D \stoptyping
-%D
-%D The first argument specifies the bodyfont size to which the
-%D settings apply. All second parameters are specified in
-%D dimensions and tell us more about related sizes.
-%D
-%D Afterwards, one can change values with
-%D
-%D \showsetup{setupbodyfontenvironment}
-%D
-%D Due to the fact that \type{\c!text} and \type{\s!text} can
-%D have a similar meaning, and therefore can lead to an
-%D unwanted loop, we temporary redefine \type{\c!text}. For
-%D the moment this in only place that some trickery is needed
-%D to fool the multilingual interface.
-%D
-%D When instead of a size the keyword \type{unknown} is
-%D passed, fractions (relations) are used instead of fixed
-%D sizes.
-
-\let\bodyfontenvironmentlist\empty
-
-\newcount\@@fontdefhack
-
-\def\@@beginfontdef
- {\ifcase\@@fontdefhack
- \let\k!savedtext \k!text \let\k!text \s!text
- \let\k!k!savedtext \k!k!text \let\k!k!text \!!plusone
- \let\k!saveddefault \k!default \let\k!default \s!default
- \let\k!k!saveddefault\k!k!default \let\k!k!default \!!plusone
- \fi
- \advance\@@fontdefhack \plusone }
-
-\def\@@endfontdef
- {\advance\@@fontdefhack \minusone
- \ifcase\@@fontdefhack
- \let\k!k!default\k!k!saveddefault
- \let\k!default \k!saveddefault
- \let\k!k!text \k!k!savedtext
- \let\k!text \k!savedtext
- \fi}
-
-\def\definebodyfontenvironment
- {\dotripleempty\dodefinebodyfontenvironment}
-
-\def\dodefinebodyfontenvironment[#1][#2][#3]% class size settings
- {\ifthirdargument
- \@@beginfontdef
- \doifelse{#2}\s!default
- {\getparameters[\??ft\s!default][#3]}
- {\normalizebodyfontsize#2\to\tempbodyfontsize
- \addtocommalist\tempbodyfontsize\bodyfontenvironmentlist
- \@EA\dododefinebodyfontenvironment\@EA[\tempbodyfontsize][#1][#3]}%
- \@@endfontdef
- \else
- \definebodyfontenvironment[\fontclass][#1][#2]% change */*
- \fi}
-
-\def\dododefinebodyfontenvironment[#1][#2][#3]% size class settings
- {\@@beginfontdef
- \doifundefined{\??ft#2#1\c!em} % \s!text goes wrong in testing because
- {\def\docommand##1% % the 12pt alternative will called when
- {\scratchdimen#1\relax % typesetting the test (or so)
- \scratchdimen\csname\??ft\s!default##1\endcsname\scratchdimen
- \normalizebodyfontsize\scratchdimen\to\tempbodyfontsize
- \setevalue{\??ft#2#1##1}{\tempbodyfontsize}}%
- \processcommacommand[\fontsizelist]\docommand
- \copyparameters
- [\??ft#2#1][\??ft\s!default]
- [\c!interlinespace,\c!em]}%
- \getparameters[\??ft#2#1][#3]%
- \@@endfontdef
- % new code, see remark
- \ifloadingfonts \else % only runtime
- \doifundefined{\@size@#1} % only once
- {\letvalue{\@size@#1}\empty % prevent loop
- \defineunknownfont{#1}}% % safeguard
- \fi
- % so far
- \setvalue{\@size@#1}{\docompletefontswitch[#1]}}
-
-%D {\bf Remark:} We need to cover the following cases,
-%D otherwise users can get confused:
-%D
-%D \starttyping
-%D \setupbodyfont[23pt]
-%D
-%D \definebodyfontenvironment[23pt]
-%D \setupbodyfont[23pt]
-%D
-%D \definebodyfontenvironment[23pt]
-%D \definebodyfont[23pt][rm,ss,tt][default]
-%D \setupbodyfont[23pt]
-%D \stoptyping
-
-%D Beware: while some font defs can be global, the bodyfont
-%D environment checks local. This means that multiple local
-%D checks resulting in definitions are not that efficient.
-%D So, apart from an occasional switch, one should define an
-%D environment at the outer level.
-
-\def\checkbodyfontenvironment[#1]%
- {\definebodyfontenvironment[\fontclass][#1][]}
-
-% original
-%
-% \def\setupbodyfontenvironment
-% {\dotripleempty\dosetupbodyfontenvironment}
-%
-% \def\dosetupbodyfontenvironment[#1][#2][#3]% class size settings
-% {\@@beginfontdef
-% \ifthirdargument
-% \getparameters[\??ft#1#2][#3]%
-% \else
-% \getparameters[\??ft#1][#2]%
-% \fi
-% \@@endfontdef}
-%
-% this one already catches both define/setup
-
-\def\setupbodyfontenvironment{\definebodyfontenvironment}
-
-% officially, but not needed (yet):
-%
-% \def\dosetupbodyfontenvironment[#1][#2][#3]% class size settings
-% {\ifthirdargument
-% \localbodyfontsize#2\relax
-% \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
-% \doifundefinedelse{\??ft#1\normalizedbodyfontsize\c!em}
-% {\definebodyfontenvironment[#1][#2][#3]}%
-% {\getparameters[\??ft#1\normalizedbodyfontsize][#3]}%
-% \else
-% \localbodyfontsize#1\relax
-% \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
-% \doifundefinedelse{\??ft\normalizedbodyfontsize\c!em}
-% {\definebodyfontenvironment[#1][#2]}%
-% {\getparameters[\??ft\normalizedbodyfontsize][#2]}%
-% \fi}
-
-%D Just a couple of interface macros:
-
-\def\bodyfontvariable#1%
- {\??ft\ifcsname\??ft\fontclass#1\endcsname\fontclass\fi#1}
-
-\def\bodyfontcsname
- {\csname\bodyfontvariable}
-
-\def\bodyfontinterlinespecs
- {\bodyfontvariable{\normalizedbodyfontsize\c!interlinespace}}
-
-\def\bodyfontinterlinespace
- {\csname\bodyfontinterlinespecs\endcsname}
-
-%D We default all parameters to the main bodyfont size (begin
-%D \type{#1}), so the next setup is valid too:
-%D
-%D \starttyping
-%D \definebodyfontenvironment[24pt]
-%D \stoptyping
-%D
-%D All parameters can be redefined when needed, so one does
-%D not have to stick to the default ones.
-
-%D \macros
-%D {definebodyfont}
-%D
-%D The next step in defining a bodyfont involves the actual font
-%D files, which can be recognized by their extension
-%D \type{tfm}. Installing those file is often beyond the
-%D scope of the user and up to the system administrator.
-%D
-%D \showsetup{definebodyfont}
-%D
-%D This commands takes three arguments: a (series of) bodyfont
-%D size(s), the style group to which the definitions belong,
-%D and an alternative, as specified by the \TEX\ (math) families,
-%D extended with~a, b~\unknown.
-%D
-%D We show two examples, that show all the alternative
-%D scaling options. The \type{\tfa} alternatives can be
-%D extended with \type{\bfa}, \type{\slb}, etc. or even
-%D \type{e} and higher alternatives.
-%D
-%D \starttyping
-%D \definebodyfont [12pt] [rm]
-%D [tf=cmr12,
-%D bf=cmbx12,
-%D it=cmti12,
-%D sl=cmsl12,
-%D bi=cmbxti10 at 12pt,
-%D bs=cmbxsl10 at 12pt,
-%D tfa=cmr12 scaled \magstep1,
-%D tfb=cmr12 scaled \magstep2,
-%D tfc=cmr12 scaled \magstep3,
-%D tfd=cmr12 scaled \magstep4,
-%D sc=cmcsc10 at 12pt]
-%D
-%D \definebodyfont [12pt,11pt,10pt,9pt,8pt] [rm]
-%D [tf=lbr sa 1,
-%D bf=lbd sa 1,
-%D it=lbi sa 1,
-%D sl=lbsl sa 1,
-%D bi=lbdi sa 1,
-%D bs=lbdi sa 1,
-%D tfa=lbr sa 1.200,
-%D tfb=lbr sa 1.440,
-%D tfc=lbr sa 1.728,
-%D tfd=lbr sa 2.074,
-%D sc=lbr sa 0.833]
-%D \stoptyping
-%D
-%D The second example shows that we can define more sizes at
-%D once. The main difference between these examples is that the
-%D Computer Modern Roman come in many design sizes. This means
-%D that there we cannot define them in bulk using \type{sa}.
-%D Instead of \type{rm} (roman) one can define \type{ss} (sans
-%D serif), \type{tt} (teletype), \type{hw} (hand written),
-%D \type{cg} (calygraphic) and whatever styles.
-%D
-%D The first argument may be a comma separated list. This,
-%D combined with specifications using \type{sa} can save a lot
-%D of typing. Although all arguments should be specified, we
-%D treat the second argument as optional.
-%D
-%D Defining a bodyfont involves two actions: defining the
-%D specific style related alternatives, like \type{\rma},
-%D \type{\bfa} and \type{\rmsla}, and storing the definitions
-%D of their bodyfont size related fonts. The first step is
-%D bodyfont independant but executed every time. This permits
-%D user definitions like \type{\tfw} or \type{\bfq} for real
-%D large alternatives.
-
-\def\definebodyfont
- {\doquadrupleempty\redefinebodyfont}
-
-\def\redefinebodyfont[#1][#2][#3][#4]%
- {\iffourthargument
- \processcommacommand[#1]{\reredefinebodyfont[#2][#3][#4]}%
- \else
- \dodefinebodyfont[#1][#2][#3]%
- \fi}
-
-\def\reredefinebodyfont[#1][#2][#3]#4%
- {\pushmacro\fontclass
- \doifelse{#4}\s!default
- {\let\fontclass\empty}
- {\def\fontclass{#4}}%
- \definebodyfont[#1][#2][#3]%
- \popmacro\fontclass}
-
-\def\dodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
- {\ifthirdargument
- \doifnumberelse{#1}
- {\doifassignmentelse{#3}
- {% [12pt] [style] [settings]
- \doifundefined{#2}{\expanded{\definefontstyle[#2][#2]}}% new
- \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}}
- {% [12pt] [style] [identifier]
- \dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier
- {% [identifier] [style] [settings] % see ***
- \setvalue{\s!default#1#2}##1##2{\expanded{\xdodefinebodyfont[##1][##2][#3]}}}%
- \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.
- \fi\fi}
-
-\def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
- {%\writestatus{[#1]}{[#2][#3]}%
- \checkrelativefontsize{#2}% rather new, inherit from other defs
- \ifundefined{#2}\expanded{\definefontstyle[#2][#2]}\fi % new
- \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}%
- \let\relativefontsize\defaultrelativefontsize}
-
-\def\dododefinebodyfont#1#2#3% style defs body
- {\checkbodyfontenvironment[#3]% just to be sure.
- \processcommalist[#2]{\dodododefinebodyfont{#1}{#3}}}
-
-\def\dodododefinebodyfont#1#2#3% style body def
- {\dododododefinebodyfont{#1}{#2}[#3]}
-
-\newif \ifresolvefontfile % protected by fontclass anyway
-
-\def\resolvefontname#1 {\truefontname{#1} }
-
-\def\iflocalclassfonts{\ifx\fontclass\empty}
-
-\def\dododododefinebodyfont#1#2[#3#4#5=#6]% style body def
- {\ifundefined{#1#3#4#5}%
- %\checkbodyfont{#2}{#1}{#3#4}{#5}% not \definefontsize[#5]
- \checkbodyfont{#1}{#3#4}{#5}% not \definefontsize[#5]
- \fi
- \iflocalclassfonts
- \letbeundefined{*\fontclass#2#1#3#4#5*}%
- \scratchtoks{#6}%
- \expanded{\unexpanded\noexpand\setvalue{#2#1#3#4#5}%
- {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
- {#2#1#3#4#5}{\the\scratchtoks}}}%
- \else
- %\expanded{\writestatus{defining}{[\fontclass][#2#1#3#4#5] \resolvefontname#6 }}%
- \global\letbeundefined{*\fontclass#2#1#3#4#5*}%
- \ifresolvefontfile
- \unexpanded\setxvalue{\fontclass#2#1#3#4#5}%
- {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
- {#2#1#3#4#5}{\resolvefontname#6 }}%
- \else
- \scratchtoks{#6}%
- \expanded{\unexpanded\noexpand\setgvalue{\fontclass#2#1#3#4#5}%
- {\noexpand\xxdododefinefont{\relativefontsize}{#2}%
- {#2#1#3#4#5}{\the\scratchtoks}}}%
- \fi
- \fi}
-
-% \def\checkbodyfont#1#2#3#4% body style alt size / gdef % #4 can be empty
-% {\def\c!!mm{#2}%
-% \ifx\c!!mm\c!mm % prevents \max and alike (re)defs
-% \unexpanded\setgvalue {#2}{\setcurrentfontstyle {#2}}% \rm
-% \unexpanded\setgvalue {#3}{\setcurrentfontalternative {#3}}% \sl
-% \else
-% \unexpanded\setgvalue {#2#4}{\setcurrentfontstylesize {#2}{#4}}% \rma
-% \unexpanded\setgvalue {#3#4}{\setcurrentfontalternativesize {#3}{#4}}% \sla
-% \unexpanded\setgvalue {#2#3#4}{\setcurrentfontstylealternativesize{#2}{#3}{#4}}% \rmsla
-% \unexpanded\setgvalue {#2}{\setcurrentfontstyle {#2}}% \rm
-% \unexpanded\setgvalue {#3}{\setcurrentfontalternative {#3}}% \sl
-% \unexpanded\setgvalue {#2\c!x}{\setcurrentfontxstylealternative {#2}}% \rmx
-% \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxstylealternative {#2}}% \rmxx
-% \unexpanded\setgvalue {#3\c!x}{\setcurrentfontxalternative {#3}}% \slx
-% \unexpanded\setgvalue{#3\c!xx}{\setcurrentfontxxalternative {#3}}% \slxx
-% \unexpanded\setgvalue {#2#3}{\setcurrentfontstylealternative {#2}{#3}}% \rmsl
-% \fi}
-%
-% leaner
-
-\def\checkbodyfont#1% tests for ttsl mmbf
- {\def\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
-
-\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 {#1}{\setcurrentfontstyle {#1}}% \mm
- \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}}% \sl
-
-\def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty
- {%\message{!t #1 #2 #3!}%
- \unexpanded\setgvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% \rma
- \unexpanded\setgvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% \sla
- \unexpanded\setgvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \rmsla
- \unexpanded\setgvalue {#1}{\setcurrentfontstyle {#1}}% \rm
- \unexpanded\setgvalue {#2}{\setcurrentfontalternative {#2}}% \sl
- \unexpanded\setgvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% \rmx
- \unexpanded\setgvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% \rmxx
- \unexpanded\setgvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% \slx
- \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% \slxx
- \unexpanded\setgvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}}% \rmsl
-
-\def\dodefinedefaultbodyfont[#1][#2][#3]% sizes styles identifier
- {\def\dododefinedefaultbodyfont##1%
- {\def\dodododefinedefaultbodyfont####1%
- {\def\dododododefinedefaultbodyfont########1%
- {\doifdefined{\s!default########1####1}
- {% [12pt] [style] [identifier]
- \getvalue{\s!default########1####1}{##1}{####1}}}%
- \processcommalist[#3]\dododododefinedefaultbodyfont}%
- \processcommalist[#2]\dodododefinedefaultbodyfont}%
- \processcommalist[#1]\dododefinedefaultbodyfont}
-
-%D Unknown families are added to the family list! For the
-%D moment we also set the direct calls here. Some day a better
-%D solution will be implemented. The good news is that unknown
-%D fonts are defined automatically.
-
-\newif\ifdefiningunknownfont
-
-% \def\defineunknownfont#1%
-% {\let\c!savedtext\c!text
-% \let\c!text\s!text
-% \donefalse
-% \def\docommand##1%
-% {\doifdefined{\??ft\s!default##1}
-% {\donetrue
-% \scratchdimen#1\relax
-% \scratchdimen\csname\??ft\s!default##1\endcsname\scratchdimen
-% \normalizebodyfontsize\scratchdimen\to\!!stringa
-% \letvalue{\??ft#1##1}\!!stringa}}%
-% \processcommacommand[\fontsizelist]\docommand
-% \let\c!text\c!savedtext
-% \ifdone
-% \donefalse
-% \def\defineunknownbodyfont##1% see ***
-% %{\doifdefined{\s!default##1}
-% % {\donetrue\getvalue{\s!default##1}{#1}}}%
-% {\doifdefined{\s!default\s!default##1}
-% {\donetrue\getvalue{\s!default\s!default##1}{#1}{##1}}}%
-% \processcommacommand
-% [\stylelist]
-% \defineunknownbodyfont
-% \ifdone
-% \setvalue{\@size@#1}{\docompletefontswitch[#1]}%
-% \ifdefiningunknownfont \else
-% \definingunknownfonttrue
-% \def\defineunknownsubfont##1%
-% {\doifundefined{\@size@\getvalue{\??ft#1##1}}
-% {\defineunknownfont{\getvalue{\??ft#1##1}}}}%
-% \processcommacommand[\fontsizelist]\defineunknownsubfont
-% \definingunknownfontfalse
-% \fi
-% \fi
-% \ifdone
-% \showmessage\m!fonts{14}{#1}%
-% \fi
-% \fi}
-
-\def\dodefineunknownfont#1#2%
- {\doifdefined{\??ft\s!default#2}
- {\donetrue
- \scratchdimen#1\relax
- \scratchdimen\csname\??ft\s!default#2\endcsname\scratchdimen
- \normalizebodyfontsize\scratchdimen\to\!!stringa
- \letvalue{\??ft#1#2}\!!stringa}}
-
-% \def\dodefineunknownbodyfont#1#2% see ***
-% {\doifdefined{\s!default\s!default#2}
-% {\donetrue
-% \getvalue{\s!default\s!default#2}{#1}{#2}}}
-%
-% but ... it needs to be as follows:
-%
-% \def\dodefineunknownbodyfont#1#2% see ***
-% {\doifdefined{\s!default\fontclass#2}% was \s!default\s!default (related to change */*)
-% {\donetrue
-% \getvalue{\s!default\fontclass#2}{#1}{#2}}}
-%
-% eh ... this does not work so we revert back to:
-
-\def\dodefineunknownbodyfont#1#2% see ***
- {\doifdefined{\s!default\s!default#2}% somehow related to */*
- {\donetrue
- \getvalue{\s!default\s!default#2}{#1}{#2}}}
-
-\def\dodefineunknownsubfont#1#2%
- {\doifundefined{\@size@\getvalue{\??ft#1#2}}
- {\donetrue
- \defineunknownfont{\getvalue{\??ft#1#2}}}}
-
-\def\defineunknownfont#1%
- {\let\c!savedtext\c!text
- \let\c!text\s!text
- \donefalse
- \processcommacommand[\fontsizelist]{\dodefineunknownfont{#1}}%
- \let\c!text\c!savedtext
- \ifdone
- \donefalse
- \processcommacommand
- [\stylelist]
- {\dodefineunknownbodyfont{#1}}%
- \ifdone
- \donefalse
- \setvalue{\@size@#1}{\docompletefontswitch[#1]}%
- \ifdefiningunknownfont \else
- \definingunknownfonttrue
- \processcommacommand[\fontsizelist]{\dodefineunknownsubfont{#1}}%
- \definingunknownfontfalse
- \fi
- \fi
- \ifdone
- \showmessage\m!fonts{14}{#1}%
- \fi
- \fi}
-
-% \def\defineunknownfontstyles#1%
-% {\def\defineunknownbodyfont##1% see ***
-% {\executeifdefined{\s!default\s!default##1}\gobbletwoarguments{#1}{##1}}%
-% \rawprocesscommacommand[\stylelist]\defineunknownbodyfont}
-
-%D These macros show that quite some definitions take place.
-%D Fonts are not loaded yet! This means that at format
-%D generation time, no font files are preloaded.
-
-%D A previous implementation used:
-%D
-%D \starttyping
-%D \type {\setvalue{name}{\donottest...}}
-%D \stoptyping
-%D
-%D instead of the more memory hungry:
-%D
-%D \starttyping
-%D \unexpanded\setvalue{name}{...}
-%D \stoptyping
-%D
-%D The first alternative saves about 500 hash entries (about
-%D 2.5\% of the total number of entries used. The second
-%D alternative is currently used, because that one can more
-%D easily be made \ETEX\ aware.
-
-%D \macros
-%D {everybodyfont,Everybodyfont,everyglobalbodyfont}
-%D
-%D Every change in bodyfont size has conseqences for the baseline
-%D distance and skips between paragraphs. These are initialized
-%D in other modules. Here we only provide the hooks that
-%D garantees their handling.
-
-% \ifx\everybodyfont\undefined % permits reloading
-% \newevery \everybodyfont \EveryBodyFont
-% \fi
-
-%D At the system level one can initialize thing like:
-%D
-%D \starttyping
-%D \appendtoks \setupspacing \to \everybodyfont
-%D \stoptyping
-%D
-%D While users can add their own non standard commands like:
-%D
-%D \starttyping
-%D \EveryBodyFont{\message{changing to bodyfont \the\bodyfontsize}}
-%D \stoptyping
-%D
-%D Personnaly I never felt the need for such extensions, but
-%D at least its possible.
-
-%D \macros
-%D {globalbodyfontsize,localbodyfontsize}
-%D
-%D Next we'll do the tough job of font switching. Here we
-%D have to distinguish between the global (overal) bodyfont
-%D size and the local (sometimes in the textflow) size. We
-%D store these dimensions in two \DIMENSION\ registers.
-
-\newdimen\globalbodyfontsize \globalbodyfontsize=12pt
-\newdimen\localbodyfontsize \localbodyfontsize =\globalbodyfontsize
-
-%D \macros
-%D {bodyfontsize}
-%D
-%D These two registers are not to be misused in calculations.
-%D For this purpose we keep a copy:
-
-\newdimen\bodyfontsize \bodyfontsize=\globalbodyfontsize
-
-%D \macros
-%D {outputresolution}
-%D
-%D Sometimes (to be honest: not in this module) we need to
-%D take the system resolution into account. Therefore we also
-%D define a macro:
-
-\def\outputresolution {600}
-
-%D \macros
-%D {bodyfontfactor,bodyfontpoints}
-%D
-%D For multiplication purposes we keep an auxiliary counter
-%D and macro (here the expansion is not explicitly needed):
-
-\newcount\bodyfontpoints \dimensiontocount\bodyfontsize\bodyfontpoints
-
-\edef\bodyfontfactor{\withoutpt\the\bodyfontsize}
-
-%D When we assign for instance 12pt to a \DIMENSION\ register
-%D the \type{\the}'d value comes out as 12.0pt, which is
-%D often not the way users specify the bodyfont size. Therefore
-%D we also store the normalized value.
-
-\chardef\fontdigits=1
-
-\def\normalizebodyfontsize#1\to#2%
- {\scratchdimen#1\relax
- \ifcase\fontdigits\advance\scratchdimen.5\points\fi
- \@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\scratchdimen00\to#2}
-
-\def\donormalizedbodyfontsize#1.#2#3#4\to#5% \points ?
- {\edef#5%
- {#1%
- \ifcase\fontdigits\or
- \ifcase#2 \else.#2\fi % and not: \ifcase#2\else ...
- \else
- \ifcase#2#3 \else.#2\ifcase#3 \else#3\fi\fi % not: \ifcase#2#3\else ...
- \fi
- \s!pt}}
-
-\normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize
-\normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize
-\normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
-
-%D To be internationalized:
-
-\def\korpsgrootte {\bodyfontsize}
-\def\korpspunten {\bodyfontpoints}
-
-%D some day.
-
-%D \macros
-%D {fontstyle,fontalternative,fontsize}
-%D
-%D Within a bodyfont, fonts can come in different sizes. For
-%D instance \type{\tf} is accompanied by \type{\tfa},
-%D \type{\tfb} etc. The first two characters denote the
-%D alternative, while the third character in these sequences
-%D represents the size. The actual size is saved in a macro
-%D
-%D The style, being roman (\type{\rm}), sans serif (\type{\ss})
-%D etc. is also available in a macro in \type{rm}, \type{ss}
-%D etc. form:
-
-\let\defaultfontalternative = \c!tf
-\let\defaultfontstyle = \empty
-\let\defaultfontsize = \empty
-
-\let\fontalternative = \defaultfontalternative
-\let\fontstyle = \defaultfontstyle
-\let\fontsize = \defaultfontsize
-
-%D {\em The following approach is obsolete.}
-%D
-%D All things related to fonts are grouped into files with
-%D names like \type{font-cmr}. These files are loaded by:
-
-\def\resetfontdefinitionfile[#1]%
- {\letbeundefined{\c!file\f!fontprefix#1}}
-
-\newif\ifloadfontfileonce
-
-\def\doreadfontdefinitionfile#1#2% #1 = set/switch state
- {\doifundefined{\c!file\f!fontprefix#2}%
- {\ifloadfontfileonce
- \letvalue{\c!file\f!fontprefix#2}\empty
- \fi
- \makeshortfilename[\truefilename{\f!fontprefix#2}]%
- \startreadingfile
- \readsysfile\shortfilename
- {\showmessage\m!fonts2{#2}}
- {\showmessage\m!fonts3{#2}}%
- \stopreadingfile}}
-
-%D When \type {\loadfontfileoncetrue}, such files are
-%D only loaded once! This permits redundant loading, but at
-%D the same time forced grouping when we want continuously mix
-%D all kind of font, which of course is a kind of
-%D typographically sin. The \type{"} is made inactive if
-%D needed to prevent problems with loading files that use this
-%D character in numbers.
-
-\def\doswitchpoints[#1]%
- {\expanded{\dodoswitchpoints{#1}}}
-
-\def\dodoswitchpoints#1%
- {\doifundefined{\@size@#1}
- {\defineunknownfont{#1}}%
- %\defineunknownfontstyles{#1}%
- \doifdefinedelse{\@size@#1}
- {\getvalue{\@size@#1}%
- \localbodyfontsize#1\relax
- \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
- \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}}}
-
-%D \TEX\ loads font metric files like \type{cmr10.tfm} and
-%D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files
-%D are {\em preloaded}. This means that the font files are
-%D loaded, but not accessible yet by name. This is accomplished
-%D by saying:
-%D
-%D \starttyping
-%D \font\preloaded=cmr10 at 11pt
-%D \stoptyping
-%D
-%D and using the name \type{\preloaded} again and again, so
-%D fonts are indeed loaded, but unnamed, and therefore
-%D unaccessible. In \CONTEXT\ we don't preload fonts, not even
-%D the \PLAIN\ \TEX\ ones, although users can access them. Now
-%D why is this done?
-
-%D Defining fonts using \type{\definebodyfont} takes time, so we
-%D prefer to predefine at least the Computer Modern Roman
-%D fonts. However, loading all those fonts at definition time
-%D would take both time and space. But even worse, once fonts
-%D are loaded into memory, their encoding vector is fixed,
-%D which is a handicap when we want to distribute the compact
-%D \type{fmt} files. So what we want to do is defining fonts in
-%D a way that postpones the loading. We accomplish this by only
-%D loading the fonts when we switch to another bodyfont size.
-%D Among the other alternatives, such as loading the font at
-%D the moment of activation and redefining the activation
-%D macro afterwards, this proved to be the most efficient
-%D alternative.
-%D
-%D The next few macros take care of the one exeption on this
-%D scheme. When at format generation time we load the default
-%D font file, the one that defines the Computer Modern Fonts,
-%D we don't want the fonts metrics to end up in the format
-%D file, so we temporary prohibit loading. This means that at
-%D runtime we have to load the default bodyfont size just before
-%D we start typesetting.
-%D
-%D Therefore we have to signal the font switching macros that
-%D we are preloading fonts. As long as the next boolean is,
-%D true, no loading is done.
-
-\newif\ifloadingfonts \loadingfontstrue
-
-%D \macros
-%D {preloadfonts}
-%D
-%D Preloading is only called for once, during the startup
-%D sequence of a session. After the loading job is done, the
-%D macro relaxes itself and reset the signal.
-
-\def\preloadfonts % never called, needs a clean up
- {\showmessage\m!fonts6{\normalizedbodyfontsize\normalspace\fontstyle}%
- \global\loadingfontsfalse
- \doswitchpoints[\normalizedbodyfontsize]%
- \doswitchstyle[\fontstyle]%
- \the\everybodyfont
- \the\everyglobalbodyfont
- \saveinterlinespace
- \global\let\preloadfonts\relax}
-
-% \prependtoks \preloadfonts \to \everydump % saves .1 s on a DELL P60 - 2GHZ
-
-%D Here comes the main font switching macros. These macros
-%D handle changes in size as well as returning to the global
-%D bodyfont size.
-
-\def\dosetfont#1#2% #1 = set/switch state
- {\doifelse{#2}\v!global
- {\restoreglobalbodyfont}
- {\processcommacommand[#2]{\dodosetfont{#1}}% ##1 get also passed
- \ifloadingfonts\else
- \doswitchpoints[\normalizedbodyfontsize]%
- \doswitchstyle[\fontstyle]%
- \fi}%
- \chardef\currentxfontsize\zerocount}
-
-\def\dodosetfont#1#2% #1 = set/switch state | check fo rempty, else space
- {\doifsomething{#2}{\dododosetfont{#1}{#2}{\showmessage\m!fonts4{#2}}}}
-
-\def\dododosetfont#1#2#3% #1 = set/switch state
- {\doifnumberelse{#2}
- {\dodododosetfont{#1}{#2}{#3}}
- {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#2}}
- {\edef\fontstep{\bodyfontcsname\normalizedbodyfontsize\interfaced{#2}\endcsname}%
- \expanded{\dodododosetfont{#1}{\fontstep}}{#3}}
- {\doifelse{#2}\v!reset
- {\let\fontstyle\empty % new 31/7/2006
- \let\fontsize \empty}
- {\doifdefinedelse{\@style@#2}
- {\edef\fontstyle{#2}}
- {\doreadfontdefinitionfile{#1}{#2}}}}}}
-
-\def\dodododosetfont#1#2#3% #1 = set/switch state
- {\scratchdimen#2\relax
- \normalizebodyfontsize\scratchdimen\to\normalizedsetfont
- \doifundefined{\@size@\normalizedsetfont}
- {\defineunknownfont{#2}}%
- \doifdefinedelse{\@size@\normalizedsetfont}
- {\localbodyfontsize\normalizedsetfont
- \let\normalizedbodyfontsize\normalizedsetfont}
- {#3\dosetsubstitutefont{#1}{#2}}}
-
-%D In the previous macros we use \type{\currentxfontsize} to
-%D hold the current x||size of the font. This enables us to
-%D support for instance \type{\sl} inside a \type{\tx} switch.
-
-\chardef\currentxfontsize=0
-
-%D When users specify for instance a 13 point bodyfont while no
-%D such bodyfont is defined, the system automatically tries to
-%D find a best fit, that is the nearest smaller defined
-%D bodyfontzize. A smaller one is definitely better than a larger
-%D one, simply because otherwise a lot of overfull box messages
-%D are more probable to occur. By taking a value slightly
-%D smaller than half a point, we can use the next method.
-
-\def\dosetsubstitutefont#1#2% #1 = set/switch state
- {\scratchdimen#2\relax
- \advance\scratchdimen .499\points
- \dimensiontocount\scratchdimen\scratchcounter
- \advance\scratchcounter \minusone
- \ifnum\scratchcounter>\plusthree
- \dododosetfont{#1}{\the\scratchcounter\s!pt}{}%
- \fi}
-
-% The following bunch of macros deals with the (run time)
-% expansion of names onto the definitions made by \type
-% {\definebodyfont}.
-
-% \let\fontbody \empty % ... 10pt 11pt 12pt ...
-% \let\fontstyle \empty % rm ss tt mm hw cg ...
-% \let\fontalternative\empty % tf bf sl it bs bi sc ...
-% \let\fontsize \empty % xy-abcd ...
-
-\def\defaultfontbody{\normalizedbodyfontsize}
-
-\let\fontbody\defaultfontbody
-
-\let\fontclass\empty \let\globalfontclass\fontclass
-
-\def\setcurrentfontclass#1%
- {\edef\fontclass{#1}}
-
-\let\defaultfontstyle \c!rm
-\let\defaultfontalternative \c!tf
-\let\defaultfontsize \empty
-
-%D \macros
-%D {bigmath,nobigmath}
-%D
-%D We can inhibit this slow||downer with:
-
-% these can best be combined
-
-% 0=never 1=everymath 2=always
-
-\chardef\synchronizebigmathflag=1
-
-\appendtoks
- \ifcase\synchronizebigmathflag
- % never
- \or
- \synchronizebigmath
- \or
- % always
- \fi
-\to \everymathematics
-
-\def\nobigmath{\chardef\synchronizebigmathflag 0 }
-\def\bigmath {\chardef\synchronizebigmathflag 2 \synchronizebigmath}
-
-\let\bigmathfontsize\empty
-
-\def\synchronizebigmath
- {\ifx\bigmathfontsize\fontsize
- % already in sync
- \else
- \let\bigmathfontsize\fontsize
- \synchronizemath \synchronizetext
- \fi}
-
-\def\checkbigmathsynchronization
- {\ifcase\synchronizebigmathflag
- % never
- \or
- \ifmmode \synchronizebigmath \fi
- \or
- \synchronizebigmath
- \fi}
-
-%D So far for synchronisation.
-
-\def\dosetcurrentfontsize#1%
- {\edef\fontsize{#1}%
- \checkbigmathsynchronization}
-
-\def\dosetcurrentfontalternative#1%
- {\edef\fontalternative{#1}%
- \ifmmode % maybe no test, or actually, an option
- \fam\csname\fontalternative\s!fam\endcsname
- \fi}
-
-\def\setcurrentfont#1#2#3#4%
- {%\message{[1 #1 #2 #3 #4]}%
- \edef\fontbody{#1}%
- \edef\fontstyle{#2}%
- \dosetcurrentfontalternative{#3}%
- \dosetcurrentfontsize{#4}%
- \synchronizefont}
-
-\def\setcurrentfontbody#1%
- {%\message{[2 #1]}%
- \edef\fontbody{#1}%
- \synchronizefont}
-
-% \def\setcurrentfontstyle#1%
-% {%\message{[3 #1]}%
-% \edef\fontstyle{#1}%
-% \ifmmode\mr\fi % otherwise \rm not downward compatible
-% \synchronizefont}
-%
-% For Taco: optional fall backs:
-
-\ifx\checkfontclass\undefined \let\checkfontclass\gobbleoneargument \fi % implemented in type-ini
-
-\def\setcurrentfontstyle#1%
- {%\message{[3 #1]}%
- \checkfontclass{#1}%
- \edef\fontstyle{#1}%
- \ifmmode\mr\fi % otherwise \rm not downward compatible
- \synchronizefont}
-
-\def\setcurrentfontbodyalternative#1#2%
- {%\message{[4 #1 #2]}%
- \edef\fontbody{#1}%
- \dosetcurrentfontalternative{#2}%
- \synchronizefont}
-
-\def\setcurrentfontalternative#1%
- {%\message{[5 #1]}%
- \dosetcurrentfontalternative{#1}%
- \synchronizefont}
-
-\def\setcurrentfontsize#1%
- {%\message{[6 #1]}%
- \dosetcurrentfontsize{#1}%
- \synchronizefont}
-
-\def\setcurrentfontstylealternative#1#2% \rmsl
- {%\message{[7 #1 #2]}%
- \edef\fontstyle{#1}%
- \dosetcurrentfontalternative{#2}%
- \synchronizefont}
-
-\def\setcurrentfontstylesize#1#2% \rmsla
- {%\message{[8 #1 #2]}%
- \edef\fontstyle{#1}%
- \dosetcurrentfontsize{#2}%
- \synchronizefont}
-
-\def\setcurrentfontalternativesize#1#2% \sla
- {%\message{[9 #1 #2]}%
- \dosetcurrentfontalternative{#1}%
- \dosetcurrentfontsize{#2}%
- \synchronizefont}
-
-\def\setcurrentfontstylealternativesize#1#2#3% \rmsla
- {%\message{[10 #1 #2 #3]}%
- \edef\fontstyle{#1}%
- \dosetcurrentfontalternative{#2}%
- \dosetcurrentfontsize{#3}%
- \synchronizefont}
-
-%D In principle one can assign alternative fallback routines.
-%D Some day we will.
-
-\newtoks\fontstrategies
-\newif\iftryingfont
-
-\let\fontstrategy\relax
-
-\def\synchronizefont
- {\tryingfonttrue
- \ifx\fontclass\empty\else
- \global\let\fontstrategy\dofontclassstrategy
- \the\fontstrategies \relax % \relax still needed ?
- \fi
- \iftryingfont
- \global\let\fontstrategy\dofontstrategy
- \the\fontstrategies \relax % \relax still needed ?
- \fi
- \ifskipfontcharacteristics
- \setfontcharacteristics
- \the\everyfontswitch
- \fi}
-
-\def\dofontstrategy#1#2#3#4#5%
- {\ifcsname#2#3#4#5\endcsname
- #1\csname#2#3#4#5\endcsname \tryingfontfalse
- \fi}
-
-\def\dofontclassstrategy#1#2#3#4#5%
- {\ifcsname\fontclass#2#3#4#5\endcsname
- #1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse
- \fi}
-
-\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a
- \fontbody \fontstyle \fontalternative \fontsize
-\fi \to \fontstrategies
-
-\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- --- def % pt tt bf
- \fontbody \fontstyle \fontalternative \defaultfontsize
-\fi \to \fontstrategies
-
-\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def --- % pt tt tf a
- \fontbody \fontstyle \defaultfontalternative \fontsize
-\fi \to \fontstrategies
-
-\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def def % pt tt tf
- \fontbody \fontstyle \defaultfontalternative \defaultfontsize
-\fi \to \fontstrategies
-
-\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- def def def % pt rm tf
- \fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
-\fi \to \fontstrategies
-
-\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % def def def def % rm tf
- \defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
-\fi \to \fontstrategies
-
-%D Let's synchronize:
-
-\newif\ifsynchronizefonts \synchronizefontstrue
-
-\prependtoks
- \ifsynchronizefonts
- \synchronizemath
- \synchronizetext
- \synchronizefont % problem: syncs last font
- \fi
-\to \everybodyfont
-
-%D Setting the normal sized as well as the x and xx smaller
-%D sizes is accomplished by the next set of macros. When in
-%D math mode, the commands \type{\tx} and \type{\txx} are
-%D just a switch to the script and double script styles, but
-%D in text mode the values defined by the bodyfontenvironment are
-%D used. Here we also set \type{\currentxfontsize}.
-
-\def\dosetcurrentfontxxxalternative#1#2#3#4%
- {\chardef\currentxfontsize#2\relax
- \ifmmode
- #4%
- \else\ifcsname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname
- \setcurrentfontbodyalternative{\bodyfontcsname\normalizedbodyfontsize#3\endcsname}{#1}%
- \fi\fi}
-
-\def\setcurrentfontxalternative#1%
- {\dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle
- \let\tx\txx}
-
-\def\setcurrentfontxxalternative#1%
- {\dosetcurrentfontxxxalternative{#1}2\c!xx\scriptscriptstyle
- \let\tx\empty
- \let\txx\empty}
-
-\def\checknestedxfontsize % option
- {\ifcase\currentxfontsize\else\ifx\fontsize\empty\else
- \chardef\currentxfontsize\zeropoint
- \let\fontsize\empty
- \let\tx\normaltx
- \let\txx\normaltxx
- \fi\fi}
-
-\def\setcurrentfontxalternative#1%
- {\checknestedxfontsize
- \dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle
- \let\tx\txx}
-
-\def\setcurrentfontxxalternative#1%
- {\checknestedxfontsize
- \dosetcurrentfontxxxalternative{#1}2\c!xx\scriptscriptstyle
- \let\tx\empty
- \let\txx\empty}
-
-% This alterative is not really needed, but for old time's sake
-% we keep it there. We can speed it up when needed.
-
-% \def\setcurrentfontxstylealternative #1{\csname#1\endcsname\tfx}
-% \def\setcurrentfontxxstylealternative#1{\csname#1\endcsname\tfxx}
-
-\def\setcurrentfontxstylealternative #1{\csname#1\endcsname\tx}
-\def\setcurrentfontxxstylealternative#1{\csname#1\endcsname\txx}
-
-%D These macros also show us that when we call for \type{\tx},
-%D this macro is redefined to be \type{\txx}. Therefore calls
-%D like:
-%D
-%D \startbuffer
-%D {small \tx is \tx beautiful}
-%D {small \tx is \txx beautiful}
-%D {small \txx is \tx beautiful}
-%D {small \txx is \txx beautiful}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D result in:
-%D
-%D \startvoorbeeld
-%D \startlines
-%D \getbuffer
-%D \stoplines
-%D \stopvoorbeeld
-%D
-%D Setting the main size involves the style list and therefore
-%D takes a bit more time. Keep in mind that the fontsize is
-%D represented by a character or empty.
-
-\unexpanded\def\tx {\setcurrentfontxalternative \fontalternative}
-\unexpanded\def\txx{\setcurrentfontxxalternative\fontalternative}
-
-\let\normaltx \tx
-\let\normaltxx\txx
-
-%D \macros
-%D {definefontstyle}
-%D
-%D When setting of switching the overall style we can use the
-%D short identifier like rm and ss, but when defined we can
-%D also use more verbose names like roman or sansserif. Such
-%D names are defined by:
-%D
-%D \starttyping
-%D \definefontstyle [serif,rm] [rm]
-%D \definefontstyle [sansserif,ss] [ss]
-%D \stoptyping
-
-\def\dodefinefontstyle[#1][#2]%
- {\rawdoifinsetelse{#2}{\stylelist}
- {}%\debuggerinfo\m!fonts{unknown style #2}}
- {\addtocommalist{#2}\stylelist
- \showmessage\m!fonts8{#2\space (#1)}}%
- % check kan hier
- \def\docommand##1%
- {\setvalue{\@shortstyle@##1}{#2}%
- \setvalue{\@style@##1}{\csname#2\endcsname}}%
- \processcommalist[#1]\docommand}
-
-\def\definefontstyle
- {\dodoubleargument\dodefinefontstyle}
-
-\def\setfontstyle#1#2% #1:name (roman, romaan) #2:style (rm)
- {\edef\fontstyle{#1}%
- \setcurrentfontstyle\normalizedbodyfontsize}
-
-\chardef\defaultskewcharmi=127 % '177
-\chardef\defaultskewcharsy= 48 % '60
-
-% \def\dosetskewchar#1%
-% {\skewchar\font\ifx\@@fontskewchar\empty#1\else\@@fontskewchar\fi}
-
-\def\dosetskewchar#1#2%
- {\ifx\@@fontskewchar\empty
- \skewchar\textfont #1#2%
- \skewchar\scriptfont #1#2%
- \skewchar\scriptscriptfont#1#2%
- \else
- \skewchar\textfont #1\@@fontskewchar
- \skewchar\scriptfont #1\@@fontskewchar
- \skewchar\scriptscriptfont#1\@@fontskewchar
- \fi}
-
-%D The previous macros show that it's is not always
-%D neccessary to define the whole bunch of fonts, take for
-%D instance the sequence:
-%D
-%D \starttyping
-%D \setupbodyfont
-%D [ams]
-%D
-%D \definebodyfont [24pt] [mm]
-%D [ma=msam10 at 24pt,
-%D mb=msbm10 at 24pt]
-%D
-%D \switchtobodyfont
-%D [24pt]
-%D
-%D This is a 24pt $\blacktriangleleft$
-%D \stoptyping
-%D
-%D Here we didn't define the 24 point bodyfont environment, so
-%D it's defined automatically. Of course one can always use the
-%D \TEX\ primitive \type{\font} to switch to whatever font
-%D needed.
-
-%D When asking for a complete font switch, for instance from 10
-%D to 12~points, the next macro does the job. First we
-%D normalize the size, next we define the current range of
-%D text, script and scriptscript sizes, then we set the text
-%D fonts and the math families and finally we activate the
-%D default typeface and also set the font specific parameters
-%D assigned to \type{\everybodyfont}
-
-\def\dosetbodyfontface#1#2%
- {\edef#1{\bodyfontcsname\normalizedbodyfontsize#2\endcsname}}
-
-\def\docompletefontswitch[#1]%
- {\bodyfontsize#1\relax
- \dimensiontocount\bodyfontsize\bodyfontpoints
- \edef\bodyfontfactor{\withoutpt\the\bodyfontsize}%
- \normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
- \dosetbodyfontface \textface \s!text
- \dosetbodyfontface \scriptface \s!script
- \dosetbodyfontface \scriptscriptface \s!scriptscript}
-
-\docompletefontswitch[12pt] % init
-
-%D \macros
-%D {setupbodyfont,switchtobodyfont}
-%D
-%D The next two macros are user ones. With \type{\setupbodyfont}
-%D one can set the document bodyfont size, font family, style
-%D and/or options defined in files, for example:
-%D
-%D \starttyping
-%D \setupbodyfont[cmr,ams,12pt,roman]
-%D \stoptyping
-%D
-%D This command affects the document as a whole: text, headers
-%D and footers. The second macro however affects only the text:
-%D
-%D \starttyping
-%D \switchtobodyfont[10pt]
-%D \stoptyping
-%D
-%D So we've got:
-%D
-%D \showsetup{setupbodyfont}
-%D \showsetup{switchtobodyfont}
-%D
-%D Both macros look alike. The second one also has to take
-%D all kind of keywords into account.
-
-\ifx\saveinterlinespace \undefined \let\saveinterlinespace \relax \fi
-\ifx\restoreinterlinespace\undefined \let\restoreinterlinespace\relax \fi
-
-\chardef\bodyfontsetstate=0
-
-\definecomplexorsimple\setupbodyfont
-
-\def\simplesetupbodyfont
- {\restoreglobalbodyfont
- \saveinterlinespace}
-
-\def\complexsetupbodyfont[#1]%
- {\doifsomething{#1}
- {\dosetfont1{#1}%
- \globalbodyfontsize\localbodyfontsize
- \normalizebodyfontsize\globalbodyfontsize\to\normalizedglobalbodyfontsize
- \let\globalfontstyle\fontstyle
- \ifloadingfonts\else
- \the\everybodyfont
- \the\everyglobalbodyfont
- \saveinterlinespace
- \fi}}
-
-\unexpanded\def\switchtobodyfont[#1]%
- {\doifsomething{#1}
- {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}}
- {\setbodyfontstep{#1}} % so we have a fast [small] switch
- {\dosetfont0{#1}}%
- \the\everybodyfont}} % indeed needed in case nothing is executed
-
-%D The following alternative is meant for math||to||text
-%D switching and will be optimized.
-
-\def\fastswitchtobodyfont#1%
- {\ifcsname\??ft\normalizedbodyfontsize#1\endcsname
- \edef\futurebodyfontsize
- {\csname\??ft\normalizedbodyfontsize#1\endcsname}%
- \ifcsname\@size@\futurebodyfontsize\endcsname
- \csname\@size@\futurebodyfontsize\endcsname
- \localbodyfontsize\futurebodyfontsize\relax
- \fi
- \fi
- \csname\@style@\fontstyle\endcsname
- \the\everybodyfont}
-
-%D Because the last macro can appear in arguments or be assigned
-%D to parameters, we protect this one for unwanted expansion.
-
-\def\dodosetmathfont#1%
- {\setcurrentfontalternative{#1}%
- % \doifdefinedelse{#1\s!fam} % adapted
- % {\edef\mffam{\getvalue{#1\s!fam}}}
- % {\edef\mffam{\getvalue{\c!nn\s!fam}}}%
- \textfont \mrfam\textfont \mffam
- \scriptfont \mrfam\scriptfont \mffam
- \scriptscriptfont\mrfam\scriptscriptfont\mffam}
-
-\def\domffam#1%
- {\csname\ifcsname#1\s!fam\endcsname#1\else\c!nn\fi\s!fam\endcsname}
-
-\def\mffam
- {\domffam\fontalternative}
-
-\def\dosetmathfont
- {\def\rm{\fam\mrfam}\dodosetmathfont}
-
-\def\enableencodinginmath
- {\appendtoks
- \everyhbox{\mr\everyhbox\emptytoks}%
- \everyvbox{\mr\everyvbox\emptytoks}%
- \to \everymathematics} % was \everymath
-
-% \enableencodinginmath % too untested to enable by default
-
-%D \starttyping
-%D $\cases{& \ccaron}$ $x=\hbox{\ccaron $x=\hbox{\ccaron}$}$
-%D \stoptyping
-
-%D The font specific features are bound to the filename.
-
-\ifx\updatefontparameters \undefined \let\updatefontparameters \relax \fi
-\ifx\setfontcharacteristics\undefined \let\setfontcharacteristics\relax \fi
-
-%D Experimental:
-
-\def\definefontfeature
- {\dotripleargument\dodefinefontfeature}
-
-\def\dodefinefontfeature[#1][#2][#3]%
- {\mkdefinefontfeature{#1}{#2}{#3}}
-
-\ifx\mkdefinefontfeature\undefined \let\mkdefinefontfeature\gobbletwoarguments \fi
-
-\definefontfeature
- [default]
- [liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
-
-\definefontfeature
- [smallcaps]
- [liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes
-
-\definefontfeature
- [oldstyle]
- [liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes
-
-%D The next auxilliary macro is an alternative to \type
-%D {\fontname}.
-
-% \def\purefontname#1{\expandafter\splitoffpurefontname\fontname#1 \\}
-%
-% extra level is needed:
-
-\def\purefontname#1{\@EA\splitoffpurefontname\@EA{\@EA{\@EA\unstringed\fontname#1}} \\}
-
-\def\splitoffpurefontname#1 #2\\{#1}
-
-%D \macros
-%D {switchstyleonly}
-%D
-%D For switching a style but keeping the alternative, there
-%D is:
-%D
-%D \starttyping
-%D {\bf text \switchstyleonly\ss text}
-%D {\bf text \switchstyleonly[ss]text}
-%D {\sl text \switchstyleonly[sansserif]text}
-%D \stoptyping
-
-\definecomplexorsimple\switchstyleonly
-
-\def\simpleswitchstyleonly#1% stupid version
- {\complexswitchstyleonly[\strippedcsname#1]}
-
-\def\complexswitchstyleonly[#1]% todo : check
- {\setcurrentfontstyle{\getvalue{\@shortstyle@#1}}%
- \the\everybodyfont} % needed ?
-
-%D \macros
-%D {os,frak, goth, cal}
-%D
-%D Old style numerals can be typeset with \type{\os} and look
-%D like {\os 1234567890} instead of the more common looking
-%D 1234567890.
-%D
-%D On behalf of {\frac Tobias Burnus}, we define some more of
-%D these. Later we will link these names to real file names.
-
-% older
-%
-% \definefont [os] [OldStyle sa *]
-% \definefont [frak] [Fraktur sa *]
-% \definefont [goth] [Gothic sa *]
-% \definefont [cal] [Calligraphic sa *]
-% \definefont [bbd] [Blackboard sa *]
-%
-% newer
-
-\def\os {\mathortext{\fam\purefamily {oldstyle}}{\symbolicfont {OldStyle}}}
-\def\frak{\mathortext{\fam\purefamily {fraktur}}{\symbolicfont {Fraktur}}}
-\def\goth{\mathortext{\fam\purefamily {gothic}}{\symbolicfont {Gothic}}}
-\def\cal {\mathortext{\fam\purefamily{calligraphic}}{\symbolicfont{Calligraphic}}}
-\def\bbd {\mathortext{\fam\purefamily {blackboard}}{\symbolicfont {Blackboard}}}
-
-\definefontsynonym [OldStyle] [Serif]
-\definefontsynonym [Fraktur] [Serif]
-\definefontsynonym [Gothic] [Serif]
-\definefontsynonym [Calligraphic] [Serif]
-\definefontsynonym [Blackboard] [Serif]
-
-%D \macros
-%D {fraktur, gothic, calligraphic, blackboard}
-%D
-%D These macros assume that we use text fonts, and not math
-%D families.
-
-\ifx\mathtext\undefined \let\mathtext\hbox \fi
-
-\def\fraktur #1{\mathortext\domathtext\donothing{\frak#1}}
-\def\gothic #1{\mathortext\domathtext\donothing{\goth#1}}
-\def\calligraphic#1{\mathortext\domathtext\donothing{\cal #1}}
-\def\blackboard #1{\mathortext\domathtext\donothing{\bbd#1}}
-
-%D Torture test:
-%D
-%D \starttyping
-%D \usetypescript[modern] [texnansi]
-%D \usetypescript[lucida] [texnansi]
-%D \usetypescript[palatino][texnansi]
-%D \usetypescript[times] [texnansi]
-%D \usetypescript[fourier] [ec]
-%D
-%D \startbuffer
-%D \section{\blackboard{T\high{\blackboard{T}}} \blackboard{E}\high{\blackboard{E}} \blackboard{X}\high{\blackboard{X}}}
-%D
-%D {\fontclass: 123 \os123 \cal TEX $\os 123$}
-%D
-%D $\blackboard{T}^{\blackboard{T}} \blackboard{E}^{\blackboard{E}} \blackboard{X}^{\blackboard{X}}$
-%D \blackboard{T}\high{\blackboard{T}} \blackboard{E}\high{\blackboard{E}} \blackboard{X}\high{\blackboard{X}}
-%D \stopbuffer
-%D
-%D {\setupbodyfont[lucida] \getbuffer}
-%D {\setupbodyfont[modern] \getbuffer}
-%D {\setupbodyfont[palatino] \getbuffer}
-%D {\setupbodyfont[times] \getbuffer}
-%D {\setupbodyfont[fourier] \getbuffer}
-%D \stoptyping
-
-%D \macros
-%D {definebodyfontswitch}
-%D
-%D \PLAIN\ \TEX\ defines some macro's like \type{\tenpoint}
-%D to switch to a specific bodyfontsize. Just for the sake of
-%D compatibility we can define them like:
-%D
-%D \starttyping
-%D \definebodyfontswitch [twelvepoint] [12pt]
-%D \stoptyping
-%D
-%D We don't support language specific synonyms here, mainly
-%D because \PLAIN\ \TEX\ is english anyway.
-
-\def\dodefinebodyfontswitch[#1][#2]%
- {\def\docommand##1{\setvalue{##1}{\switchtobodyfont[#2]}}%
- \processcommalist[#1]\docommand}
-
-\def\definebodyfontswitch
- {\dodoubleargument\dodefinebodyfontswitch}
-
-%D \macros
-%D {setsmallbodyfont,setmainbodyfont,setbigbodyfont}
-%D
-%D When we're typesetting at for instance 10pt, we can call for
-%D the \type{small} as well as the \type{big} alternative,
-%D related to this main size, using \type{\switchtobodyfont[small]}.
-%D The three alternatives can be activated by the next three
-%D system calls and are defined by the bodyfontenvironment.
-
-\let\fontstep\empty % we can use \fontstep for tracing purposes
-
-\def\setbodyfontstep#1%
- {\edef\fontstep{\bodyfontcsname\normalizedbodyfontsize\interfaced{#1}\endcsname}%
- \doswitchpoints[\fontstep]%
- \doswitchstyle[\fontstyle]}
-
-\unexpanded\def\setsmallbodyfont{\setbodyfontstep\v!small\the\everybodyfont}
-\unexpanded\def\setbigbodyfont {\setbodyfontstep\v!big \the\everybodyfont}
-
-\unexpanded\def\setmainbodyfont
- {\doswitchpoints[\normalizedbodyfontsize]%
- \doswitchstyle[\fontstyle]%
- \the\everybodyfont
- \the\everyglobalbodyfont
- \saveinterlinespace}
-
-%D \macros
-%D {restoreglobalbodyfont}
-%D
-%D Users can set whatever font available while typesetting text.
-%D Pagenumbers, footers, headers etc. however must be typeset
-%D in the main bodyfont and style of the document. Returning to
-%D the global state can be done with the next macro:
-
-\let\mainfontclass\empty
-
-\def\fullrestoreglobalbodyfont
- {\let\fontsize\defaultfontsize
- \let\fontbody\defaultfontbody
- \chardef\currentxfontsize\zerocount
- \let\fontclass\globalfontclass
- \doswitchpoints[\normalizedglobalbodyfontsize]%
- \doswitchstyle[\globalfontstyle]%
- \redoconvertfont % just in case a pagebreak occurs
- \tf
- \the\everybodyfont
- \the\everyglobalbodyfont
- \saveinterlinespace}
-
-\def\partialrestoreglobalbodyfont
- {\let\fontsize\defaultfontsize
- \let\fontbody\defaultfontbody
- \chardef\currentxfontsize\zerocount
- \redoconvertfont
- \tf
- \saveinterlinespace}
-
-\def\restoreglobalbodyfont % ook style etc
- {\ifx\fontclass\globalfontclass
- \ifx\fontstyle\globalfontstyle
- \ifx\normalizedbodyfontsize\normalizedglobalbodyfontsize
- \partialrestoreglobalbodyfont
- \else
- \fullrestoreglobalbodyfont
- \fi
- \else
- \fullrestoreglobalbodyfont
- \fi
- \else
- \fullrestoreglobalbodyfont
- \fi}
-
-% in case of troubles: \let\restorebodyfont\fullrestoreglobalbodyfont
-
-%D This macro has to be called when entering the pagebody
-%D handling routine as well as the footnote insert routine.
-%D Users can access this feature |<|for instance when one wants
-%D to typeset tables and alike in the main bodyfont and style
-%D while the running text is temporary set to a smaller one|>|
-%D by saying \type{\switchtobodyfont[global]}.
-
-%D \macros
-%D {rasterfont}
-%D
-%D There are (at the moment) two situations in which we want to
-%D have fast access to a particular font. When we are using
-%D \TEX\ to typeset rasters, we use small {\rasterfont.}'s
-%D (a rather small period indeed), the same as \PICTEX\ uses
-%D for drawing purposes.
-
-\definefont [rasterfont] [Serif at 5pt]
-
-%D \macros
-%D {infofont}
-%D
-%D The second situation occurs when we enable the info mode,
-%D and put all kind of status information in the margin. We
-%D don't want huge switches to the main bodyfont and style, so
-%D here too we use a direct method.
-
-% old mechanism
-%
-% \def\infofont{\getvalue{\!!sixpoint\c!tt\c!tf}\the\everybodyfont}
-
-\let\infofont\relax % satisfy dep checker
-
-\definefont [infofont] [Mono at 6pt] % todo \the\everybodyfont
-
-%D \macros
-%D {definealternativestyle}
-%D
-%D In the main modules we are going to implement lots of
-%D parameterized commands and one of these parameters will
-%D concern the font to use. To suit consistent use of fonts we
-%D here implement a mechanism for defining the keywords that
-%D present a particular style or alternative.
-%D
-%D \starttyping
-%D \definealternativestyle [keywords] [\style] [\nostyle]
-%D \stoptyping
-%D
-%D The first command is used in the normal textflow, while the
-%D second command takes care of headings and alike. Consider
-%D the next two definitions:
-%D
-%D \starttyping
-%D \definealternativestyle [bold] [\bf] []
-%D \definealternativestyle [cap] [\cap] [\cap]
-%D \stoptyping
-%D
-%D A change \type{\bf} in a heading which is to be set in
-%D \type{\tfd} does not look that well, so therefore we leave
-%D the second argument of \type{\definealternativestyle} empty.
-%D When we capatalize characters using the pseudo small cap
-%D command \type{\cap}, we want this to take effect in both
-%D text and headings, which is accomplished by assigning both
-%D arguments.
-
-\def\dodefinealternativestyle[#1][#2][#3]%
- {\def\docommand##1%
- {\doifundefined{##1}{\setvalue{##1}{\groupedcommand{#2}{}}}%
- \setvalue{\@letter@ ##1}{#2}%
- \setvalue{\@noletter@##1}{#3}}%
- \processcommalist[#1]\docommand}
-
-\def\definealternativestyle
- {\dotripleempty\dodefinealternativestyle}
-
-\def\definestyle{\definealternativestyle}
-
-%D Maybe too geneneric, but probably ok is the following. (Maybe one
-%D day we will use a dedicated grouped command for styles.)
-
-\appendtoks
- \let\groupedcommand\thirdofthreearguments
-\to \simplifiedcommands
-
-%D This command also defines the keyword as command. This means
-%D that the example definition of \type{bold} we gave before,
-%D results in a command \type{\bold} which can be used as:
-%D
-%D \startbuffer
-%D He's a \bold{bold} man with a {\bold head}.
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D or
-%D
-%D \startvoorbeeld
-%D \definealternativestyle[bold][\bf][]\getbuffer
-%D \stopvoorbeeld
-%D
-%D Such definitions are of course unwanted for \type{\cap}
-%D because this would result in an endless recursive call.
-%D Therefore we check on the existance of both the command and
-%D the substitution. The latter is needed because for instance
-%D \type{\type} is an entirely diferent command. That command
-%D handles verbatim, while the style command would just switch
-%D to teletype font. This is just an example of a tricky
-%D naming coincidence.
-
-%D \macros
-%D {doconvertfont,noconvertfont,
-%D dontconvertfont,redoconvertfont}
-%D
-%D After having defined such keywords, we can call for them by
-%D using
-%D
-%D \starttyping
-%D \doconvertfont{keyword}{text}
-%D \stoptyping
-%D
-%D We deliberately pass an argument. This enables us to
-%D assign converters that handle one agrument, like
-%D \type{\cap}.
-%D
-%D By default the first specification is used to set the style,
-%D exept when we say \type{\dontconvertfont}, after which the
-%D second specification is used. We can also directly call for
-%D \type{\noconvertfont}. In nested calls, we can restore the
-%D conversion by saying \type{\redoconvertfont}.
-
-\def\@@dodoconvertfont#1{\csname\@letter@ #1\endcsname}
-\def\@@donoconvertfont#1{\csname\@noletter@#1\endcsname}
-
-\unexpanded\def\dodoconvertfont#1% #2% we need the protection
- {\doifdefinedelse{\@letter@#1} % in testing
- {\doifelsenothing{#1}\gobbleoneargument\@@dodoconvertfont}
- {\doifdefinedelse{#1}\getvalue \firstofoneargument}%
- {#1}} % {#2}}
-
-\let\doconvertfont\dodoconvertfont
-
-\def\noconvertfont#1% #2%
- {\doifdefinedelse{\@noletter@#1}
- {\doifelsenothing{#1}\gobbleoneargument\@@donoconvertfont}\gobbleoneargument
- {#1}} % {#2}}
-
-%D Extras:
-
-\unexpanded\def\dontconvertfont
- {\let\doconvertfont\noconvertfont}
-
-\unexpanded\def\redoconvertfont
- {\let\doconvertfont\dodoconvertfont}
-
-%D These commands are not grouped! Grouping is most probably
-%D done by the calling macro's and would lead to unnecessary
-%D overhead.
-
-%D \macros
-%D {em,emphasistypeface,emphasisboldface}
-%D
-%D The next macro started as a copy of Donald Arseneau's
-%D \type{\em} (\TUGNEWS\ Vol.~3, no.~1, 1994). His
-%D implementation was a bit more sophisticated version of the
-%D standard \LATEX\ one. We furter enhanced the macro, so now
-%D it also adapts itself to boldface mode. Because we favor
-%D {\sl slanted} type over {\it italic}, we made the emphasis
-%D adaptable, for instance:
-%D
-%D \starttyping
-%D \def\emphasistypeface {\it}
-%D \def\emphasisboldface {\bi}
-%D \stoptyping
-%D
-%D But we prefer:
-
-\def\emphasistypeface {\sl}
-\def\emphasisboldface {\bs}
-
-%D or even better:
-
-\def\doemphasistypeface#1#2%
- {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!slanted#1%
- {\doifelsevalue{\??ft\fontclass\normalizedbodyfontsize\c!em}\v!italic#2%
- {\doifelsevalue{\??ft \normalizedbodyfontsize\c!em}\v!slanted#1%
- {\doifvalue {\??ft \normalizedbodyfontsize\c!em}\v!italic#2}}}}
-
-\def\emphasistypeface{\doemphasistypeface\sl\it}
-\def\emphasisboldface{\doemphasistypeface\bs\bi}
-
-%D To be set with the default body font environment: \type
-%D {em} being \type {slanted} or \type {italic}.
-
-\newconditional\emneeded
-
-\unexpanded\def\em
- {\relax
- \ifdim\slantperpoint>\zeropoint
- \settrue\emneeded
- \else
- \setfalse\emneeded
- \fi
- \setemphasisboldface % new
- \ifx\fontalternative\c!it % \ifnum\fam=\itfam
- \def\emphasistypeface{\it}\tf
- \else\ifx\fontalternative\c!sl % \ifnum\fam=\slfam
- \def\emphasistypeface{\sl}\tf
- \else\ifx\fontalternative\c!bf % \ifnum\fam=\bffam
- \emphasisboldface
- \else\ifx\fontalternative\c!bs % \ifnum\fam=\bsfam
- \def\emphasisboldface{\bs}\bf
- \else\ifx\fontalternative\c!bi % \ifnum\fam=\bifam
- \def\emphasisboldface{\bi}\bf
- \else
- \emphasistypeface
- \fi\fi\fi\fi\fi
- \ifconditional\emneeded\relax
- \else
- \expandafter\aftergroup
- \fi
- \emphasiscorrection}
-
-%D The next feature was not present in previous versions. It
-%D takes care of \type {\em \bf ...} sitiations.
-
-\def\setemphasisboldface
- {\let\normalbf\bf
- \let\setemphasisboldface\relax
- \unexpanded\def\bf
- {%\relax
- \let\bf\relax % new
- \ifx\fontalternative\c!it % \ifnum\fam=\itfam
- \bi
- \else\ifx\fontalternative\c!sl % \ifnum\fam=\slfam
- \bs
- \else
- \normalbf
- \fi\fi
- \let\bf\normalbf}}
-
-%D Donald's (adapted) macros take the next character into
-%D account when placing italic correction. As a bonus we also
-%D look for something that looks like a dash, in which case we
-%D don't correct.
-
-\let\italiccorrection=\/
-
-\def\emphasiscorrection
- {\ifhmode
- \expandafter\emphasislook
- \fi}
-
-\def\emphasislook
- {\begingroup
- \beginrobusttest
- \futurelet\next\emphasistest}
-
-\def\emphasistest
- {\normalifcat\noexpand\next,%
- \endrobusttest\expandafter\doemphasiscorrection
- \normalelse
- \endrobusttest\expandafter\dododoemphasiscorrection
- \normalfi}
-
-\def\doemphasiscorrection
- {\futurelet\next\dodoemphasiscorrection}
-
-\def\dodoemphasiscorrection
- {\setbox\scratchbox\hbox{\next}%
- \ifdim\ht\scratchbox=\zeropoint % probably a space
- \expandafter\dododoemphasiscorrection
- \else\ifdim\ht\scratchbox<.3ex
- \expandafter\expandafter\expandafter\endgroup
- \else
- \expandafter\expandafter\expandafter\dododoemphasiscorrection
- \fi\fi}
-
-\def\dododoemphasiscorrection
- {\scratchskip\lastskip
- \ifdim\scratchskip=\zeropoint\relax % == \ifzeropt\scratchskip
- \italiccorrection\relax
- \else
- \unskip\italiccorrection\hskip\scratchskip
- \fi
- \endgroup}
-
-%D We end with some examples which show the behavior when
-%D some punctuation is met. We also show how the mechanism
-%D adapts itself to bold, italic and slanted typing.
-%D
-%D \startbuffer
-%D test {test}test \par
-%D test {\sl test}test \par
-%D test {\em test}test \par
-%D test {\em test}--test \par
-%D
-%D test {test}, test \par
-%D test {\em test}, test \par
-%D
-%D test {\em test {\em test {\em test} test} test} test \par
-%D test {\bf test {\em test {\em test} test} test} test \par
-%D test {\sl test {\em test {\em test} test} test} test \par
-%D test {\it test {\em test {\em test} test} test} test \par
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D We get:
-%D
-%D \startvoorbeeld
-%D \startpacked
-%D \getbuffer
-%D \stoppacked
-%D \stopvoorbeeld
-
-%D \macros
-%D {emphbf,emphit,emphsl,emphtf}
-%D
-%D The next emphasis alternatives are for \THANH. They adapt
-%D their style as good as possible.
-
-\def\emphbf{\groupedcommand{\bf\def\emphit{\bi}\def\emphsl{\bs}}{}}
-\def\emphit{\groupedcommand{\it\def\emphbf{\bi}\def\emphsl{\sl}}{}}
-\def\emphsl{\groupedcommand{\sl\def\emphbf{\bs}\def\emphit{\it}}{}}
-\def\emphtf{\groupedcommand{\tf\def\emphbf{\bf}\def\emphit{\it}\def\emphsl{\sl}}{}}
-
-%D \startbuffer
-%D TEXT {\emphbf text \emphit text \emphtf text \emphsl text} TEXT
-%D TEXT \emphbf{text \emphit{text} \emphtf{text} \emphsl{text}} TEXT
-%D \stopbuffer
-%D
-%D \typebuffer
-%D \startlines
-%D \getbuffer
-%D \stoplines
-
-%D \macros
-%D {setfont}
-%D
-%D Every now and then we want to define a font directly, for
-%D instance when we typeset title pages. The next macro saves
-%D some typing:
-
-\def\setfont% geen \dosetfont mogelijk
- {\def\next{\nextfont\setupinterlinespace}%
- \afterassignment\next\font\nextfont=}
-
-%D One can call this macro as:
-%D
-%D \starttyping
-%D \setfont cmr10 at 60pt
-%D \stoptyping
-%D
-%D After which the font is active and the baselines and
-%D struts are set.
-
-%D \macros
-%D {showbodyfont}
-%D
-%D One can call for a rather simple overview of a bodyfont and the
-%D relations between its alternative fonts.
-%D
-%D \showsetup{showbodyfont}
-%D
-%D The current bodyfont (here we omitted the argument) looks like:
-%D
-%D \showbodyfont
-%D
-%D The implementation is rather straightforward in using
-%D \type{\halign}.
-
-\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run}
-
-%D \macros
-%D {showfontstrip, testminimalbaseline, showminimalbaseline}
-%D
-%D The next command can come in handy when combining
-%D different fonts into a collection (typeface) and
-%D determining optimal baseline distances.
-%D
-%D \showfontstrip \blank \showminimalbaseline
-
-\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run}
-\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run}
-\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run}
-
-%D \macros
-%D {showkerning}
-%D
-%D A goody is:
-%D
-%D \showkerning{Can you guess what kerning is?}
-
-\fetchruntimecommand \showkerning {\f!fontprefix\s!run}
-
-%D \macros
-%D {showbodyfontenvironment}
-%D
-%D The current bodyfontenvironment is:
-%D
-%D \showbodyfontenvironment
-%D
-%D This overview is generated using:
-%D
-%D \showsetup{showbodyfontenvironment}
-
-\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run}
-
-%D \macros
-%D {showfont,showfontstyle,showligatures}
-%D
-%D The following command generates a fontmap:
-%D
-%D \startbuffer
-%D \showfont[SansBold at 12pt]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Below the table the name, encoding, mapping and handling are
-%D shown. Special characters like the \type {\skewchar} and
-%D \type {\hyphenchar} als marked.
-%D
-%D \getbuffer
-
-% 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}
-
-%D \macros
-%D {getglyph, symbolicfont}
-%D
-%D Individual glyphs can be accessed by using
-%D
-%D \starttyping
-%D \getglyph{fontname}{character}
-%D \stoptyping
-%D
-%D This macro is used in for instance the symbol modules and
-%D as one can see, it does obey the small and even smaller
-%D sizes. The \type {\symbolicfont} macro can be used to
-%D switch to a font named \type {fontname} (see \type
-%D {cont-log} and \type {symb-eur} for examples of symbolic
-%D definitions.
-
-\def\fontstringA
- {\ifx\fontstyle\c!rm \s!Serif \else
- \ifx\fontstyle\c!ss \s!Sans \else
- \ifx\fontstyle\c!tt \s!Mono \else
- \s!Serif \fi\fi\fi}
-
-\def\fontstringB
- {\ifx\fontstyle\c!rm \s!Regular \else
- \ifx\fontstyle\c!ss \s!Support \else
- \ifx\fontstyle\c!tt \s!Type \else
- \s!Serif \fi\fi\fi}
-
-\def\fontstringC
- {\ifx\fontalternative\c!bf \s!Bold \else
- \ifx\fontalternative\c!sl \s!Slanted \else
- \ifx\fontalternative\c!it \s!Italic \else
- \ifx\fontalternative\c!bs \s!BoldSlanted \else
- \ifx\fontalternative\c!bi \s!BoldItalic \fi\fi\fi\fi\fi}
-
-\def\fontstringD % default fontstyle
- {\expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!rm \s!Serif \else
- \expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!ss \s!Sans \else
- \expandafter\ifx\csname\??tf\fontclass\s!default\endcsname\c!tt \s!Mono \else
- \s!Serif \fi\fi\fi}
-
-% potential generalization:
-
-% \letvalue{\??ff:t:\c!rm}\s!Serif
-% \letvalue{\??ff:t:\c!ss}\s!Sans
-% \letvalue{\??ff:t:\c!tt}\s!Mono
-%
-% \letvalue{\??ff:s:\c!bf}\s!Bold
-% \letvalue{\??ff:s:\c!sl}\s!Slanted
-% \letvalue{\??ff:s:\c!it}\s!Italic
-% \letvalue{\??ff:s:\c!bs}\s!BoldSlanted
-% \letvalue{\??ff:s:\c!bi}\s!BoldItalic
-%
-% \letvalue{\??ff:a:\c!rm}\s!Regular
-% \letvalue{\??ff:a:\c!ss}\s!Support
-% \letvalue{\??ff:a:\c!tt}\s!Type
-%
-% \def\fontstringA{\executeifdefined{\??ff:t:\fontstyle}\s!Serif}
-% \def\fontstringB{\executeifdefined{\??ff:a:\fontstyle}\s!Serif}
-% \def\fontstringC{\executeifdefined{\??ff:s:\fontstyle}\empty}
-% \def\fontstringD{\executeifdefined{\??ff:t:\csname\??tf\fontclass\s!default\endcsname}\s!Serif}
-
-\def\glyphfontfile#1%
- {#1%
- \ifcsname\??ff#1\fontstringA\fontstringC\endcsname
- \fontstringA\fontstringC
- \else\ifcsname\??ff#1\fontstringB\fontstringC\endcsname
- \fontstringB\fontstringC
- \else\ifcsname\??ff#1\fontstringA\endcsname
- \fontstringA
- \else\ifcsname\??ff#1\fontstringB\endcsname
- \fontstringB
- \else\ifcsname\??ff#1\fontstringC\endcsname
- \fontstringC
- \fi\fi\fi\fi\fi}
-
-%D The next macro can be used to make decisions based on the shape:
-
-\def\doifitalicelse#1#2%
- {\ifx\fontalternative\c!sl#1\else
- \ifx\fontalternative\c!it#1\else
- \ifx\fontalternative\c!bs#1\else
- \ifx\fontalternative\c!bi#1\else#2\fi\fi\fi\fi}
-
-%D For an example of usage of the following command,
-%D see \type {cont-log.tex}.
-%D
-%D \starttyping
-%D \def\symbolicfont#1%
-%D {\definedfont[\glyphfontfile{#1} sa *]}
-%D \stoptyping
-%D
-%D Since we know what scaling it to be applied, we can
-%D implement a much faster alternative:
-
-\let\thedefinedfont\relax
-
-% \def\symbolicscaledfont#1#2%
-% {\scaledfont\fontbody
-% \scaledfont#1\scaledfont
-% \font\thedefinedfont\truefontname{\glyphfontfile{#2}} at
-% \currentfontbodyscale\scaledfont
-% \thedefinedfont}
-%
-% \unexpanded\def\symbolicfont
-% {\symbolicscaledfont\plusone}
-%
-% even more control (needed for mthsqrt etc)
-
-\def\symbolicsizedfont#1#2#3%
- {\scaledfont#1%
- \scaledfont#2\scaledfont
- \font\thedefinedfont\truefontname{\glyphfontfile{#3}} at
- \currentfontbodyscale\scaledfont
- \thedefinedfont}
-
-\def\symbolicscaledfont
- {\symbolicsizedfont\fontbody}
-
-\unexpanded\def\symbolicfont
- {\symbolicsizedfont\fontbody\plusone}
-
-\unexpanded\def\getglyph#1#2% slow, faster, much faster
- %{{\definefont[\s!dummy][\glyphfontfile{#1} sa \currentfontscale]\dummy#2}}
- %{{\definefont[\s!dummy][\glyphfontfile{#1} sa *]\dummy#2}}
- %{{\symbolicfont{#1}#2}}
- {{\symbolicfont{#1}\doifnumberelse{#2}\char\donothing#2}}
-
-\unexpanded\def\getscaledglyph#1#2#3%
- {{\symbolicscaledfont{#1}{#2}\doifnumberelse{#3}\char\donothing#3}}
-
-\unexpanded\def\getrawglyph#1#2% for simple symbols
- {{\scaledfont\fontbody
- \font\thedefinedfont=#1 at \currentfontbodyscale\scaledfont
- \thedefinedfont\doifnumberelse{#2}\char\donothing#2}}
-
-%D The last implementation of \type {\getglyph} permits
-%D definitions like:
-%D
-%D \starttyping
-%D \definefontsynonym [EuroSans] [eurose]
-%D \definefontsynonym [EuroSansBold] [euroseb]
-%D \definefontsynonym [EuroSansItalic] [eurosei]
-%D \definefontsynonym [EuroSansSlanted] [eurosei]
-%D \definefontsynonym [EuroSansBoldItalic] [eurosebi]
-%D \definefontsynonym [EuroSansBoldSlanted] [eurosebi]
-%D
-%D \definesymbol [euro] [\getglyph{Euro}{\char160}]
-%D
-%D \def\euro{\symbol[euro]}
-%D \stoptyping
-%D
-%D These definitions guarantee that the next calls work okay:
-%D
-%D \starttyping
-%D \ss \tf\euro \bf\euro \sla\euro \itd\euro \bs\euro \bic\euro
-%D \stoptyping
-%D
-%D The shape as well as the size is adapted to the current
-%D environment.
-
-%D Fonts can only be used when loaded. In \CONTEXT\ we
-%D postpone the loading of fonts, even when we load \PLAIN.
-%D This means that we have to redefine one of the \PLAIN\
-%D macros. Let's tell that to the user first:
-
-\writestatus{loading}{Postponed Plain TeX Font Definitions}
-
-%D \macros
-%D {bordermatrix}
-%D
-%D In \PLAIN\ \TEX\ the width of a parenthesis is stored in
-%D the \DIMENSION\ \type{\p@renwd}. This value is derived from
-%D the width of \type{\tenrm B}, so let's take care of it now:
-
-\let\normalbordermatrix=\bordermatrix
-
-\def\bordermatrix%
- {\bgroup
- \setbox0\hbox{\getvalue{\textface\c!mm\c!ex}B}%
- \global\p@renwd\wd0\relax
- \egroup
- \normalbordermatrix}
-
-%D Because we want to be as \PLAIN\ compatible as possible, we
-%D make most of \PLAIN's font mechanisme available to the
-%D \CONTEXT\ user.
-
-\def\setplainfonts#1#2%
- {\setvalue {ten#1}{\getvalue{\!!tenpoint #2}}%
- \setvalue{seven#1}{\getvalue{\!!sevenpoint#2}}%
- \setvalue {five#1}{\getvalue{\!!fivepoint #2}}}
-
-\setplainfonts {\c!rm} {\c!rm\c!tf}
-\setplainfonts {\c!bf} {\c!rm\c!bf}
-\setplainfonts {\c!sl} {\c!rm\c!sl}
-\setplainfonts {\c!it} {\c!rm\c!it}
-\setplainfonts {\c!tt} {\c!rm\c!tt}
-\setplainfonts {\c!sy} {\c!mm\c!sy}
-\setplainfonts {\c!ex} {\c!mm\c!ex}
-\setplainfonts {\c!i} {\c!mm\c!mi}
-
-\let\setplainfonts=\undefined
-
-%D \macros
-%D {ss, SS, sz}
-%D
-%D We are going to redefine \type{\ss} but for those wo still
-%D want to have access to the german \SS, we save it's value in
-%D \type{\SS}. Ok, I should have used \type{\sf} instead of
-%D \type{\ss} in the first place.
-
-\ifx\undefined\SS \let\SS=\ss \fi
-\ifx\undefined\sz \let\sz=\ss \fi
-
-%D \macros
-%D {xi}
-%D
-%D We are going to redefine \type{\xi}, but fortunately this
-%D is a math mode character, so we can just say:
-
-\let\normalxi=\xi
-
-%D \macros
-%D {smashaccent}
-%D
-%D When we let \TEX\ put an accent on top of a character, such
-%D composed characters can get more height that height of a
-%D standard \type{\strut}. The next macro takes care of such
-%D unwanted compositions.
-%D
-%D We need to reach over the number that specifies the accent,
-%D and in doing so we use \type{\scratchcounter} as a placeholder
-%D because it accepts 8 bit numbers in octal, decimal or
-%D hexadecimal format. Next we set the height of the accented
-%D character to the natural height of the character.
-
-\unexpanded\def\smashaccent#1%
- {\dontleavehmode
- \bgroup
- \setbox\scratchbox\hbox{#1}%
- \ifdim\ht\scratchbox>\strutheight\relax\ht\scratchbox\strutheight\fi
- \ifdim\dp\scratchbox>\strutdepth \relax\dp\scratchbox\strutdepth \fi
- \box\scratchbox
- \egroup}
-
-%D For instance we can say:
-%D
-%D \starttyping
-%D \smashaccent{\"Uberhaupt}
-%D \stoptyping
-%D
-%D But normally one will use it as a prefix in definitions.
-%D The difference is in the height:
-%D
-%D \leavevmode\ruledhbox
-%D {\ruledhbox{\smashaccent{\"U}berhaupt}\quad
-%D oder\quad
-%D \ruledhbox{\"Uberhaupt}}
-
-%D \macros
-%D {moveaccent}
-%D
-%D Exact positioning of accents can be realized by saying:
-%D
-%D \starttyping
-%D \moveaccent{-.1ex}{\"u}berhaupt
-%D \stoptyping
-%D
-%D Again, this one will mostly used as a prefix in definitions.
-%D Here the difference is in the position:
-%D
-%D \leavevmode\ruledhbox
-%D {\ruledhbox{\moveaccent{-.1ex}{\"}Uberhaupt}\quad
-%D oder\quad
-%D \ruledhbox{\"Uberhaupt}}
-
-\unexpanded\def\moveaccent#1#2%
- {\smashaccent
- {\dimen0\exheight
- \dimen2\dimen0
- \advance\dimen2 -#1%
- \exheight\dimen2
- #2\relax
- \exheight\dimen0}}
-
-%D Personally I think that using \TEX\ is complicated by the
-%D way fonts are handled. Apart from the many encodings, we
-%D also deal with different naming schemes. Confronted with
-%D this problem, I decided to change the definitions into:
-%D
-%D \starttyping
-%D \definebodyfont [12pt] [rm] [tf=Times-Roman at 12pt]
-%D \stoptyping
-%D
-%D combined with for instance:
-%D
-%D \starttyping
-%D \definefontsynonym [Times-Roman] [tir]
-%D \stoptyping
-
-%D Now we're up to some definitions.
-
-\definebodyfontenvironment
- [\s!default]
- [ \s!text=1.0,
- \s!script=0.7,
- \s!scriptscript=0.5,
- \c!a=1.200,
- \c!b=1.440,
- \c!c=1.728,
- \c!d=2.074,
- *=\currentfontscale, % wildcard
- \c!x=0.8,
- \c!xx=0.6,
- \c!big=1.2,
- \c!small=0.8,
- \c!interlinespace=,
- \c!em=\v!slanted]
-
-\definebodyfontenvironment
- [20.7pt]
- [ \s!text=20.7pt,
- \s!script=\!!fourteenpointfour,
- \s!scriptscript=\!!twelvepoint,
- \c!x=17.3pt,
- \c!xx=\!!fourteenpointfour,
- \c!big=20.7pt, % !!!!
- \c!small=17.3pt]
-
-\definebodyfontenvironment
- [17.3pt]
- [ \s!text=17.3pt,
- \s!script=\!!twelvepoint,
- \s!scriptscript=\!!tenpoint,
- \c!x=\!!fourteenpointfour,
- \c!xx=\!!twelvepoint,
- \c!big=20.7pt,
- \c!small=\!!fourteenpointfour]
-
-\definebodyfontenvironment
- [\!!fourteenpointfour]
- [ \s!text=\!!fourteenpointfour,
- \s!script=\!!elevenpoint,
- \s!scriptscript=\!!ninepoint,
- \c!x=\!!twelvepoint,
- \c!xx=\!!tenpoint,
- \c!big=17.3pt,
- \c!small=\!!twelvepoint]
-
-\definebodyfontenvironment
- [\!!twelvepoint]
- [ \s!text=\!!twelvepoint,
- \s!script=\!!ninepoint,
- \s!scriptscript=\!!sevenpoint,
- \c!x=\!!tenpoint,
- \c!xx=\!!eightpoint,
- \c!big=\!!fourteenpointfour,
- \c!small=\!!tenpoint]
-
-\definebodyfontenvironment
- [\!!elevenpoint]
- [ \s!text=\!!elevenpoint,
- \s!script=\!!eightpoint,
- \s!scriptscript=\!!sixpoint,
- \c!x=\!!ninepoint,
- \c!xx=\!!sevenpoint,
- \c!big=\!!twelvepoint,
- \c!small=\!!ninepoint]
-
-\definebodyfontenvironment
- [\!!tenpoint]
- [ \s!text=\!!tenpoint,
- \s!script=\!!sevenpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!eightpoint,
- \c!xx=\!!sixpoint,
- \c!big=\!!twelvepoint,
- \c!small=\!!eightpoint]
-
-\definebodyfontenvironment
- [\!!ninepoint]
- [ \s!text=\!!ninepoint,
- \s!script=\!!sevenpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!sevenpoint,
- \c!xx=\!!fivepoint,
- \c!big=\!!elevenpoint,
- \c!small=\!!sevenpoint]
-
-\definebodyfontenvironment
- [\!!eightpoint]
- [ \s!text=\!!eightpoint,
- \s!script=\!!sixpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!sixpoint,
- \c!xx=\!!fivepoint,
- \c!big=\!!tenpoint,
- \c!small=\!!sixpoint]
-
-\definebodyfontenvironment
- [\!!sevenpoint]
- [ \s!text=\!!sevenpoint,
- \s!script=\!!sixpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!sixpoint,
- \c!xx=\!!fivepoint,
- \c!big=\!!ninepoint,
- \c!small=\!!fivepoint]
-
-\definebodyfontenvironment
- [\!!sixpoint]
- [ \s!text=\!!sixpoint,
- \s!script=\!!fivepoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!fivepoint,
- \c!xx=\!!fivepoint,
- \c!big=\!!eightpoint,
- \c!small=\!!fivepoint]
-
-\definebodyfontenvironment
- [\!!fivepoint]
- [ \s!text=\!!fivepoint,
- \s!script=\!!fivepoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!fivepoint,
- \c!xx=\!!fivepoint,
- \c!big=\!!sevenpoint,
- \c!small=\!!fivepoint]
-
-\definebodyfontenvironment
- [\!!fourpoint]
- [ \s!text=\!!fourpoint,
- \s!script=\!!fourpoint,
- \s!scriptscript=\!!fourpoint,
- \c!x=\!!fourpoint,
- \c!xx=\!!fourpoint,
- \c!big=\!!sixpoint,
- \c!small=\!!fourpoint]
-
-\definebodyfontswitch [fourteenpointfour] [\!!fourteenpointfour]
-\definebodyfontswitch [twelvepoint] [\!!twelvepoint]
-\definebodyfontswitch [elevenpoint] [\!!elevenpoint]
-\definebodyfontswitch [tenpoint] [\!!tenpoint]
-\definebodyfontswitch [ninepoint] [\!!ninepoint]
-\definebodyfontswitch [eightpoint] [\!!eightpoint]
-\definebodyfontswitch [sevenpoint] [\!!sevenpoint]
-\definebodyfontswitch [sixpoint] [\!!sixpoint]
-\definebodyfontswitch [fivepoint] [\!!fivepoint]
-\definebodyfontswitch [fourpoint] [\!!fourpoint]
-
-\definebodyfontswitch [xii] [\!!twelvepoint]
-\definebodyfontswitch [xi] [\!!elevenpoint]
-\definebodyfontswitch [x] [\!!tenpoint]
-\definebodyfontswitch [ix] [\!!ninepoint]
-\definebodyfontswitch [viii] [\!!eightpoint]
-\definebodyfontswitch [vii] [\!!sevenpoint]
-\definebodyfontswitch [vi] [\!!sixpoint]
-
-%D So far.
-
-\definefontstyle [\c!rm,\v!roman,\v!serif,\v!regular] [\c!rm]
-\definefontstyle [\c!ss,\v!sansserif,\v!sans,\v!support] [\c!ss]
-\definefontstyle [\c!tt,\v!teletype,\v!type,\v!mono] [\c!tt]
-\definefontstyle [\c!hw,\v!handwritten] [\c!hw]
-\definefontstyle [\c!cg,\v!calligraphic] [\c!cg]
-
-\definefontsize[\c!a] \definefontsize[\c!b]
-\definefontsize[\c!c] \definefontsize[\c!d]
-
-\definealternativestyle [\v!mediaeval] [\os] []
-\definealternativestyle [\v!normal] [\tf] []
-\definealternativestyle [\v!bold] [\bf] []
-\definealternativestyle [\v!type] [\tt] []
-\definealternativestyle [\v!mono] [\tt] []
-\definealternativestyle [\v!slanted] [\sl] []
-\definealternativestyle [\v!italic] [\it] []
-\definealternativestyle [\v!boldslanted,\v!slantedbold] [\bs] []
-\definealternativestyle [\v!bolditalic,\v!italicbold] [\bi] []
-\definealternativestyle [\v!small,\v!smallnormal] [\tfx] []
-\definealternativestyle [\v!smallbold] [\bfx] []
-\definealternativestyle [\v!smalltype] [\ttx] []
-\definealternativestyle [\v!smallslanted] [\slx] []
-\definealternativestyle [\v!smallboldslanted,\v!smallslantedbold] [\bsx] []
-\definealternativestyle [\v!smallbolditalic,\v!smallitalicbold] [\bix] []
-
-\definealternativestyle [\v!sans,\v!sansserif] [\ss] []
-\definealternativestyle [\v!sansbold] [\ss\bf] []
-
-%D Slow but handy:
-
-\definealternativestyle [\v!smallbodyfont] [\setsmallbodyfont] []
-\definealternativestyle [\v!bigbodyfont] [\setbigbodyfont] []
-
-%D We treat {\sc Small Caps} and \cap {Pseudo Caps} a bit
-%D different. We also provide an \WORD {uppercase} style.
-
-\definealternativestyle [\v!cap,\v!capital] [\smallcapped] [\smallcapped]
-\definealternativestyle [\v!smallcaps] [\sc] [\sc]
-\definealternativestyle [\v!WORD] [\WORD] [\WORD]
-
-%D \macros
-%D {...math}
-%D
-%D New or old?
-
-% tzt proper \define...
-%
-% watch out: \synchronizesymb resets the family so we need a second
-% \mf (or maybe \mr): messy and to be sorted out
-
-\def\tfmath{\tf\mf\synchronizesymb\mf}
-\def\bfmath{\bf\mf\synchronizesymb\mf}
-\def\slmath{\sl\mf\synchronizesymb\mf}
-\def\itmath{\it\mf\synchronizesymb\mf}
-\def\bsmath{\bs\mf\synchronizesymb\mf}
-\def\bimath{\bi\mf\synchronizesymb\mf}
-\def\scmath{\sc\mf\synchronizesymb\mf}
-\def\nnmath{\nn\mf\synchronizesymb\mf}
-
-\def\textmath {\synchronizesymb}
-
-%D \macros
-%D {fontstylesuffix}
-%D
-%D The next macro is used to map non latin fontnames on
-%D fonts. See \type {font-uni} for an example of its use.
-
-%\def\fontstylesuffix%
-% {\ifnum\fam=\tffam \s!Regular \else
-% \ifnum\fam=\bffam \s!Bold \else
-% \ifnum\fam=\slfam \s!Slanted \else
-% \ifnum\fam=\itfam \s!Italic \else
-% \ifnum\fam=\bsfam \s!BoldSlanted \else
-% \ifnum\fam=\bifam \s!BoldItalic \else
-% \s!Regular \fi\fi\fi\fi\fi\fi}%
-
-\def\fontstylesuffix% why the \s!Regular ? see \getglyph
- {\ifx\fontalternative\c!tf \s!Regular \else
- \ifx\fontalternative\c!bf \s!Bold \else
- \ifx\fontalternative\c!sl \s!Slanted \else
- \ifx\fontalternative\c!it \s!Italic \else
- \ifx\fontalternative\c!bs \s!BoldSlanted \else
- \ifx\fontalternative\c!bi \s!BoldItalic \else
- \ifx\fontalternative\c!sc \s!Caps \else
- \s!Regular \fi\fi\fi\fi\fi\fi\fi}%
-
-%D We still have to take care of \type{\xi}, so:
-
-\def\xi{\ifmmode\normalxi\else\elevenpoint\fi}
-
-%D \macros
-%D {definefontvariant,fontvariant,variant}
-%D
-%D A slightly adapted version of Adam Lindsays variant patches:
-%D
-%D \starttyping
-%D \usetypescriptfile[type-psc] \loadmapfile[texnansi-public-fpl]
-%D \usetypescript[palatino][texnansi] \setupbodyfont[palatino]
-%D
-%D \definefontvariant [Serif][osf] [OsF]
-%D
-%D \startlines
-%D {\sc abcdefgHIJKlmnop}
-%D 123{\Var[osf]456}789
-%D {\Var[osf] 123{\Var[reset]456}789}
-%D {\it 123{\Var[osf]456}789
-%D {\Var[osf]123{\Var[reset]456}789}}
-%D {\tfb\bf 123{\Var[osf]456}789
-%D {\Var[osf] 123{\Var[reset]456}789}}
-%D {\sc 123{\Var[osf]456}789
-%D {\Var[osf] 123{\Var[reset]456}789}}
-%D \stoplines
-%D \stoptyping
-
-\def\definefontvariant
- {\dotripleargument\dodefinefontvariant}
-
-\def\dodefinefontvariant[#1][#2][#3]%
- {\setvalue{\??fv#1#2}{#3}}
-
-\def\fontvariant#1#2{\executeifdefined{\??fv#1#2}\empty}
-
-% original:
-%
-% \def\variant[#1]%
-% {\expanded{\definedfont
-% [\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
-% at \currentfontscale\bodyfontsize]}}
-%
-% \beginXETEX \font
-%
-% \def\variant[#1]%
-% {\font\variantfont\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
-% at \currentfontscale\bodyfontsize
-% \variantfont}
-%
-% \endXETEX
-%
-% better
-
-\def\dosetscaledfont
- {\checkrelativefontsize\fontstyle
- \scaledfont\currentfontscale\bodyfontsize
- \scaledfont\relativefontsize\scaledfont}
-
-\unexpanded\def\variant[#1]% slow
- {\dosetscaledfont
- \expanded{\definedfont
- [\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
- at \scaledfont]}%
- \ignoreimplicitspaces}
-
-\beginXETEX \font
-
- \unexpanded\def\variant[#1]%
- {\dosetscaledfont
- \font\variantfont\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
- at \scaledfont
- \variantfont}
-
-\endXETEX
-
-\ifx\Var\undefined \let\Var\variant \fi
-
-%D By default we load the Computer Modern Roman fonts (but
-%D not yet at this moment) and activate the 12pt roman
-%D bodyfont. Sans serif and teletype are also available and
-%D can be called for by \type{\ss} and \type{\tt}.
-
-\setupbodyfont [unk, rm]
-
-%D Also needed is:
-
-\definefont[tinyfont][Mono at 1ex]
-
-%D \macros
-%D {doiffontpresentelse}
-%D
-%D Some unused left||overs:
-%D
-%D \starttyping
-%D \def\doiffontpresentelse#1#2#3%
-%D {\bgroup
-%D \batchmode\font\dummy=\truefontname{#1}\errorstopmode
-%D \edef\lastfontname{\fontname\dummy}%
-%D \ifx\lastfontname\nullfontname\egroup#3\else\egroup#2\fi}
-%D
-%D \def\abortiffontnotfound#1%
-%D {\doiffontpresentelse{#1}{}{\showmessage\m!fonts{10}{\truefontname{#1}}\endinput}}
-%D \stoptyping
-%D
-%D We now provide (slow, but sometimes handy):
-%D
-%D \starttyping
-%D \doiffontpresentelse{texnansi-lmr10}{YES}{NO}
-%D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO}
-%D \stoptyping
-
-\def\doiffontpresentelse#1%
- {\bgroup
- \scratchcounter\interactionmode
- \batchmode
- \font\dummy=\truefontname{#1}\relax
- \interactionmode\scratchcounter
- \edef\lastfontname{\fontname\dummy}%
- \ifx\lastfontname\nullfontname
- \egroup\expandafter\secondoftwoarguments
- \else
- \egroup\expandafter\firstoftwoarguments
- \fi}
-
-\protect \endinput
diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua
index 196e155dc..fffd4eeda 100644
--- a/tex/context/base/font-otf.lua
+++ b/tex/context/base/font-otf.lua
@@ -6,15 +6,14 @@ if not modules then modules = { } end modules ['font-otf'] = {
license = "see context related readme files"
}
--- once we have all features working, i will redo this module .. caching lookups and such
-
-local format = string.format
+local format, concat, getn = string.format, table.concat, table.getn
+local type, pairs, ipairs, next, tonumber, tostring = type, pairs, ipairs, next, tonumber, tostring
local space = lpeg.P(" ")
local nospaces = (1-space)^1
local optionalspace = space^0
-local split_at_space = lpeg.Ct((lpeg.C(nospaces) * optionalspace)^0)
+local split_at_space = lpeg.Ct((lpeg.C(nospaces) * optionalspace)^0) -- table !
-- we can use more lpegs when lpeg is extended with function args and so
@@ -96,13 +95,13 @@ number by one when there's a fix in the library or
--~ is also faster). A further complication is that we support static as well as dynamic
--~ features.
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
-local otf = fonts.otf
-local tfm = fonts.tfm
+local otf = fonts.otf
+local tfm = fonts.tfm
-otf.version = 2.10
+otf.version = 2.24
otf.pack = true
otf.tables = otf.tables or { }
otf.meanings = otf.meanings or { }
@@ -845,6 +844,9 @@ function otf.load(filename,format,sub,featurefile)
hash = hash:gsub("[^%w%d]+","-")
end
local data = containers.read(otf.cache(), hash)
+ if data and data.verbose ~= fonts.verbose then
+ data = nil
+ end
local size = lfs.attributes(filename,"size") or 0
if data and data.size ~= size then
data = nil
@@ -879,6 +881,8 @@ function otf.load(filename,format,sub,featurefile)
data = fontforge.to_table(ff)
fontforge.close(ff)
if data then
+ logs.report("load otf","enhance: patch")
+ otf.enhance.patch(data,filename)
logs.report("load otf","enhance: before")
otf.enhance.before(data,filename)
logs.report("load otf","enhance: enrich")
@@ -889,16 +893,15 @@ function otf.load(filename,format,sub,featurefile)
otf.enhance.analyze(data,filename)
logs.report("load otf","enhance: after")
otf.enhance.after(data,filename)
- logs.report("load otf","enhance: patch")
- otf.enhance.patch(data,filename)
logs.report("load otf","enhance: strip")
otf.enhance.strip(data,filename)
- if otf.pack then
+ if otf.pack and not fonts.verbose then
logs.report("load otf","enhance: pack")
otf.enhance.pack(data)
end
logs.report("load otf","file size: %s", size)
data.size = size
+ data.verbose = fonts.verbose
logs.report("load otf","saving: in cache")
data = containers.write(otf.cache(), hash, data)
else
@@ -914,13 +917,17 @@ end
-- memory saver ..
+local criterium, threshold = 1, 0
+
function otf.enhance.pack(data)
if data then
- local h, t = { }, { }
- local concat = table.concat
+ local h, t, c = { }, { }, { }
+ local hh, tt, cc = { }, { }, { }
local function tabstr(t)
for i=1,#t do
- if type(t[i]) == "boolean" then
+ -- tricky, was if type(t[i]) == "boolean" then, but if no [1] then error
+ local ti = type(t[i])
+ if ti ~= "string" or ti ~= "number" then
local s = tostring(t[1])
for i=2,#t do
s = s .. ",".. tostring(t[i])
@@ -930,67 +937,125 @@ function otf.enhance.pack(data)
end
return concat(t,",")
end
- local function pack(v)
- local tag = tabstr(v,",")
- if not h[tag] then
- t[#t+1] = v
- h[tag] = #t
- end
- return h[tag]
- end
- for k, v in pairs(data.glyphs) do
- v.boundingbox = pack(v.boundingbox)
- if v.lookups then
- for k,v in pairs(v.lookups) do
- for kk, vv in ipairs(v) do -- for i=
- v[kk] = pack(vv)
+ for pass=1,2 do
+ local pack
+ if pass == 1 then
+ pack = function(v)
+ -- v == table
+ local tag = tabstr(v,",")
+ local ht = h[tag]
+ if not ht then
+ ht = #t+1
+ t[ht] = v
+ h[tag] = ht
+ c[ht] = 1
+ else
+ c[ht] = c[ht] + 1
end
+ return ht
end
- end
- if v.anchors then
- for k,v in pairs(v.anchors) do
- if k == "baselig" then
- for kk, vv in pairs(v) do
- for kkk,vvv in ipairs(vv) do
- vv[kkk] = pack(vvv)
- end
- end
+ else
+ pack = function(v)
+ -- v == number
+ if c[v] <= criterium then
+ return t[v]
else
- for kk, vv in pairs(v) do
- v[kk] = pack(vv)
+ -- compact hash
+ local hv = hh[v]
+ if not hv then
+ hv = #tt+1
+ tt[hv] = t[v]
+ hh[v] = hv
+ cc[hv] = c[v]
end
+ return hv
end
end
end
- end
- if data.lookups then
- for k, v in pairs(data.lookups) do
- if v.rules then
- for kk, vv in pairs(v.rules) do
- local l = vv.lookups
- if l then
- vv.lookups = pack(l)
+ for k, v in pairs(data.glyphs) do
+ v.boundingbox = pack(v.boundingbox)
+ if v.lookups then
+ for k,v in pairs(v.lookups) do
+ for kk=1,#v do
+ v[kk] = pack(v[kk])
end
- local c = vv.coverage
- if c then
- c.before = c.before and pack(c.before )
- c.after = c.after and pack(c.after )
- c.current = c.current and pack(c.current)
+ end
+ end
+ local a = v.anchors
+ if a then
+ for k,v in pairs(a) do
+ if k == "baselig" then
+ for kk, vv in pairs(v) do
+ for kkk=1,#vv do
+ vv[kkk] = pack(vv[kkk])
+ end
+ end
+ else
+ for kk, vv in pairs(v) do
+ v[kk] = pack(vv)
+ end
end
end
end
end
- end
- if data.luatex then
- local li = data.luatex.ignore_flags
- if li then
- for k, v in pairs(li) do
- li[k] = pack(v)
+ if data.lookups then
+ for k, v in pairs(data.lookups) do
+ if v.rules then
+ for kk, vv in pairs(v.rules) do
+ local l = vv.lookups
+ if l then
+ vv.lookups = pack(l)
+ end
+ local c = vv.coverage
+ if c then
+ c.before = c.before and pack(c.before )
+ c.after = c.after and pack(c.after )
+ c.current = c.current and pack(c.current)
+ end
+ end
+ end
end
end
- end
- if #t > 0 then
- data.tables = t
+ if data.luatex then
+ local li = data.luatex.ignore_flags
+ if li then
+ for k, v in pairs(li) do
+ li[k] = pack(v)
+ end
+ end
+ end
+ if #t == 0 then
+ logs.report("load otf","pack quality: nothing to pack")
+ break
+ elseif #t >= threshold then
+ local one, two, rest = 0, 0, 0
+ if pass == 1 then
+ for k,v in pairs(c) do
+ if v == 1 then
+ one = one + 1
+ elseif v == 2 then
+ two = two + 1
+ else
+ rest = rest + 1
+ end
+ end
+ else
+ for k,v in pairs(cc) do
+ if v >20 then
+ rest = rest + 1
+ elseif v >10 then
+ two = two + 1
+ else
+ one = one + 1
+ end
+ end
+ data.tables = tt
+ end
+ logs.report("load otf","pack quality: pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)", pass, one+two+rest, one, two, rest, criterium)
+ else
+ logs.report("load otf","pack quality: pass 1, %s packed, aborting pack (threshold: %s)", #t, threshold)
+ break
+ end
end
end
end
@@ -1000,25 +1065,27 @@ function otf.enhance.unpack(data)
local t = data.tables
if t then
for k, v in pairs(data.glyphs) do
- v.boundingbox = t[v.boundingbox]
+ local tv = t[v.boundingbox] if tv then v.boundingbox = tv end
local l = v.lookups
if l then
for k,v in pairs(l) do
for i=1,#v do
- v[i] = t[v[i]]
+ local tv = t[v[i]] if tv then v[i] = tv end
end
end
end
local a = v.anchors
if a then
for k,v in pairs(a) do
- for kk, vv in pairs(v) do
- if kk == "baselig" then
- for kkk,vvv in ipairs(vv) do
- vv[kkk] = t[vvv]
+ if k == "baselig" then
+ for kk, vv in pairs(v) do
+ for kkk=1,#vv do
+ local tv = t[vv[kkk]] if tv then vv[kkk] = tv end
end
- else
- v[kk] = t[vv]
+ end
+ else
+ for kk, vv in pairs(v) do
+ local tv = t[vv] if tv then v[kk] = tv end
end
end
end
@@ -1031,13 +1098,13 @@ function otf.enhance.unpack(data)
for kk, vv in pairs(r) do
local l = vv.lookups
if l then
- vv.lookups = t[l]
+ local tv = t[l] if tv then vv.lookups = tv end
end
local c = vv.coverage
if c then
- local cc = c.before if cc then c.before = t[cc] end
- cc = c.after if cc then c.after = t[cc] end
- cc = c.current if cc then c.current = t[cc] end
+ local cc = c.before if cc then local tv = t[cc] if tv then c.before = tv end end
+ cc = c.after if cc then local tv = t[cc] if tv then c.after = tv end end
+ cc = c.current if cc then local tv = t[cc] if tv then c.current = tv end end
end
end
end
@@ -1047,7 +1114,7 @@ function otf.enhance.unpack(data)
local li = data.luatex.ignore_flags
if li then
for k, v in pairs(li) do
- li[k] = t[v]
+ local tv = t[v] if tv then li[k] = tv end
end
end
end
@@ -1060,7 +1127,8 @@ end
function otf.enhance.analyze(data,filename)
local t = {
- filename = file.basename(filename),
+--~ filename = file.basename(filename),
+ filename = filename,
version = otf.version,
creator = "context mkiv",
unicodes = otf.analyze_unicodes(data),
@@ -1089,8 +1157,6 @@ do
local unicodes, names = { }, {}
- local tonumber = tonumber
-
local function do_one(a,b)
unicodes[tonumber(a)] = tonumber(b,16)
end
@@ -1206,6 +1272,7 @@ function otf.enhance.before(data,filename)
local private = fonts.private
if data.subfonts and table.is_empty(data.glyphs) then
local cidinfo = data.cidinfo
+ local verbose = fonts.verbose
if cidinfo.registry then
local cidmap = otf.cidmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement)
if cidmap then
@@ -1221,12 +1288,12 @@ function otf.enhance.before(data,filename)
g.boundingbox = g.boundingbox -- or zerobox
g.name = g.name or name or "unknown"
if unicode then
- g.unicode = unicode
+-- g.unicode = unicode
uni_to_int[unicode] = index
int_to_uni[index] = unicode
nofunicodes = nofunicodes + 1
elseif name then
- g.unicode = -1
+-- g.unicode = -1
nofnames = nofnames + 1
end
glyphs[index] = g
@@ -1251,15 +1318,15 @@ function otf.enhance.before(data,filename)
local int_to_uni = data.map.backmap -- { [0|1] = unic, ... }
for index, glyph in pairs(data.glyphs) do
if glyph.name then
- local unic = glyph.unicode or glyph.unicodeenc or -1
- glyph.unicodeenc = nil -- older luatex version
+-- local unic = glyph.unicode or glyph.unicodeenc or -1
+local unic = int_to_uni[index] or -1
if index > 0 and (unic == -1 or unic >= 0x110000) then
while uni_to_int[private] do
private = private + 1
end
uni_to_int[private] = index
int_to_uni[index] = private
- glyph.unicode = private
+-- glyph.unicode = private
if fonts.trace then
logs.report("load otf","enhance: glyph %s at index %s is moved to private unicode slot %s",glyph.name,index,private)
end
@@ -1292,7 +1359,6 @@ function otf.enhance.before(data,filename)
if data.ttf_tables then
for _, v in ipairs(data.ttf_tables) do
if v.data then v.data = "deleted" end
- --~ if v.data then v.data = v.data:gsub("\026","\\026") end -- does not work out well
end
end
table.compact(data.glyphs)
@@ -1314,11 +1380,6 @@ function otf.enhance.before(data,filename)
end
end
end
---~ for index, glyph in pairs(data.glyphs) do
---~ for k,v in pairs(glyph) do
---~ if v == 0 then glyph[k] = nil end
---~ end
---~ end
end
function otf.enhance.after(data,filename) -- to be split
@@ -1332,16 +1393,21 @@ function otf.enhance.after(data,filename) -- to be split
local vc, vo, vl = v.char, v.off, v.lookup
if vc and vo and vl then -- brrr, wrong! we miss the non unicode ones
local uvc = unicodes[vc]
- if uvc then
+ if not uvc then
+ logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
+ else
local mkl = mykerns[vl]
if not mkl then
- mkl = { [unicodes[vc]] = vo }
+ mkl = { }
mykerns[v.lookup] = mkl
+ end
+ if type(uvc) == "table" then
+ for u=1,#uvc do
+ mkl[uvc[u]] = vo
+ end
else
- mkl[unicodes[vc]] = vo
+ mkl[uvc] = vo
end
- else
- logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
end
end
end
@@ -1361,24 +1427,38 @@ function otf.enhance.after(data,filename) -- to be split
if kernclass then
for _, kcl in ipairs(kernclass) do
local firsts, seconds, offsets, lookup = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup
- local maxfirsts, maxseconds = table.getn(firsts), table.getn(seconds)
+ local maxfirsts, maxseconds = getn(firsts), getn(seconds)
logs.report("load otf", "adding kernclass %s with %s times %s pairs)",lookup, maxfirsts, maxseconds)
for fk, fv in pairs(firsts) do
for first in fv:gmatch("[^ ]+") do
- local glyph = glyphs[mapmap[unicodes[first]]]
- local mykerns = glyph.mykerns
- if not mykerns then
- mykerns = { } -- unicode indexed !
- glyph.mykerns = mykerns
- end
- local lookupkerns = mykerns[lookup]
- if not lookupkerns then
- lookupkerns = { }
- mykerns[lookup] = lookupkerns
+ local first_unicode = unicodes[first]
+ if type(first_unicode) == "number" then
+ first_unicode = { first_unicode }
end
- for sk, sv in pairs(seconds) do
- for second in sv:gmatch("[^ ]+") do
- lookupkerns[unicodes[second]] = offsets[(fk-1) * maxseconds + sk]
+ for f=1,#first_unicode do
+ local glyph = glyphs[mapmap[first_unicode[f]]]
+ local mykerns = glyph.mykerns
+ if not mykerns then
+ mykerns = { } -- unicode indexed !
+ glyph.mykerns = mykerns
+ end
+ local lookupkerns = mykerns[lookup]
+ if not lookupkerns then
+ lookupkerns = { }
+ mykerns[lookup] = lookupkerns
+ end
+ for sk, sv in pairs(seconds) do
+ local offset = offsets[(fk-1) * maxseconds + sk]
+ for second in sv:gmatch("[^ ]+") do
+ local second_unicode = unicodes[second]
+ if type(second_unicode) == "number" then
+ lookupkerns[second_unicode] = offset
+ else
+ for s=1,#second_unicode do
+ lookupkerns[second_unicode[s]] = offset
+ end
+ end
+ end
end
end
end
@@ -1395,13 +1475,34 @@ function otf.enhance.after(data,filename) -- to be split
end
function otf.enhance.strip(data)
+ local verbose = fonts.verbose
+ local int_to_uni = data.map.backmap
for k, v in pairs(data.glyphs) do
local d = v.dependents
if d then v.dependents = nil end
+ if verbose then
+ local code = int_to_uni[k]
+ if code then
+ local vu = v.unicode
+ if not vu then
+ v.unicode = code
+ elseif type(vu) == "table" then
+ vu[#bu+1] = code
+ else
+ v.unicode = { vu, code }
+ end
+ end
+ else
+ v.unicode = nil
+ v.index = nil
+ end
end
+ data.luatex.comment = "Glyph tables have their original index. When present, mykern tables are indexed by unicode."
+ data.luatex.indices = data.map.map -- needed for shared glyphs
data.map = nil
data.names = nil
- data.luatex.comment = "Glyph tables have their original index. When present, mykern tables are indexed by unicode."
+ data.glyphcnt = nil
+ data.glyphmax = nil
end
function otf.enhance.flatten(data,filename) -- to be split
@@ -1490,7 +1591,7 @@ end
otf.enhance.patches = { }
function otf.enhance.patch(data,filename)
- local basename = file.basename(filename)
+ local basename = file.basename(filename:lower())
for pattern, action in pairs(otf.enhance.patches) do
if basename:find(pattern) then
action(data,filename)
@@ -1504,31 +1605,13 @@ function otf.enhance.enrich(data,filename)
-- later
end
--- patching
-
-do -- will move to a typescript
-
- local function patch(data,filename)
- if data.design_size == 0 then
- local ds = (file.basename(filename)):match("(%d+)")
- if ds then
- logs.report("load otf","patching design size (%s)",ds)
- data.design_size = tonumber(ds) * 10
- end
- end
- end
-
- otf.enhance.patches["^lmroman"] = patch
- otf.enhance.patches["^lmsans"] = patch
- otf.enhance.patches["^lmtypewriter"] = patch
-
-end
-
function otf.analyze_class(data,class)
local classes = { }
- for index, glyph in pairs(data.glyphs) do
+ local glyphs = data.glyphs
+ for unicode, index in pairs(data.map.map) do
+ local glyph = glyphs[index]
if glyph.class == class then
- classes[glyph.unicode] = true
+ classes[unicode] = true
end
end
return classes
@@ -1541,9 +1624,10 @@ function otf.analyze_subtables(data)
for k,v in ipairs(g) do
if v.features then
local ignored = { false, false, false }
- if v.flags.ignorecombiningmarks then ignored[1] = 'mark' end
- if v.flags.ignorebasechars then ignored[2] = 'base' end
- if v.flags.ignoreligatures then ignored[3] = 'ligature' end
+ local flags = v.flags
+ if flags.ignorecombiningmarks then ignored[1] = 'mark' end
+ if flags.ignorebasechars then ignored[2] = 'base' end
+ if flags.ignoreligatures then ignored[3] = 'ligature' end
if v.subtables then
local type = v.type
for _, feature in ipairs(v.features) do
@@ -1611,12 +1695,28 @@ end
function otf.analyze_unicodes(data)
local unicodes = { }
- for _, blob in pairs(data.glyphs) do
- if blob.name then
- unicodes[blob.name] = blob.unicode or 0
+ local indices = data.map.map
+ local glyphs = data.glyphs
+ local multiples = { }
+ for unicode, index in pairs(indices) do
+ local name = glyphs[index].name
+ if name then
+ local un = unicodes[name]
+ if not un then
+ unicodes[name] = unicode -- or 0
+ elseif type(un) == "number" then
+ multiples[#multiples+1] = name
+ unicodes[name] = { un, unicode }
+ else
+ un[#un+1] = unicode
+ end
end
end
- unicodes['space'] = unicodes['space'] or 32 -- handly later on
+ if #multiples > 0 then
+ logs.report("load otf","%s glyph are reused: %s",#multiples, concat(multiples," "))
+ end
+ unicodes['space'] = unicodes['space'] or 32 -- handly later on
+ unicodes['hyphen'] = unicodes['hyphen'] or 45 -- handly later on
return unicodes
end
@@ -1783,11 +1883,15 @@ end
function otf.features.prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all
if value then
local otfdata = tfmdata.shared.otfdata
- local charlist = otfdata.glyphs
- local unicodes = otfdata.luatex.unicodes
+ local glyphs = otfdata.glyphs
+ local unicodes = otfdata.luatex.unicodes -- names to unicodes
local somevalid = otf.some_valid_feature(otfdata,kind,tfmdata.script,tfmdata.language)
- for _, chr in pairs(tfmdata.characters) do
- local d = charlist[chr.description.index]
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ for u, chr in pairs(characters) do
+ -- hm, maybe just use descriptions, and why still index? font is already in
+ -- unicode with private slots, so: d = glyphs[u] should work ok
+ local d = glyphs[descriptions[u].index]
if d then
local dk = d.mykerns
if dk then
@@ -1811,8 +1915,18 @@ function otf.features.prepare_base_kerns(tfmdata,kind,value) -- todo what kind o
for _, v in pairs(dk) do
if somevalid[v.lookup] then
local k = unicodes[v.char]
- if k > 0 then
- t[k], done = v.off, true
+ local o = v.off
+ if type(k) == "number" then
+ if k > 0 then
+ t[k], done = o, true
+ end
+ else
+ for i=1,#k do
+ local ki = k[i]
+ if ki > 0 then
+ t[ki], done = o, true
+ end
+ end
end
end
end
@@ -1849,15 +1963,15 @@ end
function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to unicode
if data then
- local tfm = { characters = { }, parameters = { } }
- local unicodes = data.luatex.unicodes
- local characters = tfm.characters
- local parameters = tfm.parameters
+ local characters, parameters, descriptions = { }, { }, { }
+ local tfm = { characters = characters, parameters = parameters, descriptions = descriptions }
+ local luatex = data.luatex
+ local indices = luatex.indices -- unicodes to indices
local glyphs = data.glyphs
- for k, d in pairs(glyphs) do
- if d.name then
- characters[d.unicode] = { description = d }
- end
+ for u, i in pairs(indices) do
+ local d = glyphs[i]
+ characters[u] = { } -- not needed
+ descriptions[u] = d
end
local designsize = data.designsize or data.design_size or 100
if designsize == 0 then
@@ -1884,23 +1998,23 @@ function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to
if data.pfminfo then
data.charwidth = data.pfminfo.avgwidth
end
- local endash, emdash = unicodes['space'], unicodes['emdash']
+ local endash, emdash = 0x20, 0x2014 -- unicodes['space'], unicodes['emdash']
if data.isfixedpitch then
- if characters[endash] then
- spaceunits, tfm.spacer = characters[endash].description.width, "space"
+ if descriptions[endash] then
+ spaceunits, tfm.spacer = descriptions[endash].width, "space"
end
- if not spaceunits and characters[emdash] then
- spaceunits, tfm.spacer = characters[emdash].description.width, "emdash"
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, tfm.spacer = descriptions[emdash].width, "emdash"
end
if not spaceunits and data.charwidth then
spaceunits, tfm.spacer = data.charwidth, "charwidth"
end
else
- if characters[endash] then
- spaceunits, tfm.spacer = characters[endash].description.width, "space"
+ if descriptions[endash] then
+ spaceunits, tfm.spacer = descriptions[endash].width, "space"
end
- if not spaceunits and characters[emdash] then
- spaceunits, tfm.spacer = characters[emdash].description.width/2, "emdash/2"
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, tfm.spacer = descriptions[emdash].width/2, "emdash/2"
end
if not spaceunits and data.charwidth then
spaceunits, tfm.spacer = data.charwidth, "charwidth"
@@ -1933,9 +2047,12 @@ function otf.copy_to_tfm(data) -- we can save a copy when we reorder the tma to
if data.pfminfo and data.pfminfo.os2_xheight and data.pfminfo.os2_xheight > 0 then
parameters.x_height = data.pfminfo.os2_xheight
else
- local x = characters[unicodes['x']]
+ local x = 0x78 -- unicodes['x']
if x then
- parameters.x_height = x.description.height
+ local x = descriptions[x]
+ if x then
+ parameters.x_height = x.height
+ end
end
end
-- [6]
@@ -2057,28 +2174,30 @@ otf.default_language = 'latn'
otf.default_script = 'dflt'
function otf.valid_feature(otfdata,kind,script,language) -- return hash is faster
- if otfdata.luatex.ctx_always[kind] then
+ local luatex = otfdata.luatex
+ if luatex.ctx_always[kind] then
script, language = 'dflt', 'dflt'
else
script = script or otf.default_script
language = language or otf.default_language
end
script, language = script:lower(), language:lower() -- will go away, we will lowercase values
- local ft = otfdata.luatex.subtables[kind]
+ local ft = luatex.subtables[kind]
local st = ft[script] or ft.dflt
local lt = st and (st[language] or st.dflt)
- return false, otfdata.luatex.always_valid, lt.valid
+ return false, luatex.always_valid, lt.valid
end
function otf.some_valid_feature(otfdata,kind,script,language)
- if otfdata.luatex.ctx_always[kind] then
+ local luatex = otfdata.luatex
+ if luatex.ctx_always[kind] then
script, language = 'dflt', 'dflt'
else
script = script or otf.default_script
language = language or otf.default_language
script, language = script:lower(), language:lower() -- will go away, we will lowercase values
end
- local t = otfdata.luatex.subtables[kind]
+ local t = luatex.subtables[kind]
if t then
local ts = t[script] or t.dflt
if ts then
@@ -2092,7 +2211,8 @@ end
function otf.features.aux.resolve_ligatures(tfmdata,ligatures,kind)
local otfdata = tfmdata.shared.otfdata
local unicodes = otfdata.luatex.unicodes
- local chars = tfmdata.characters
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
local changed = tfmdata.changed or { }
local done = { }
kind = kind or "unknown"
@@ -2104,30 +2224,51 @@ function otf.features.aux.resolve_ligatures(tfmdata,ligatures,kind)
if not done[lig] then
local ligs = split_at_space:match(lig)
if #ligs == 2 then
- local c, f, s = chars[v[2]], ligs[1], ligs[2]
- local uf, us = unicodes[f], unicodes[s]
+ local uc = v[2]
+ local c, f, s = characters[uc], ligs[1], ligs[2]
+--~ local uf, us = unicodes[f], unicodes[s]
+
+local uft, ust = unicodes[f], unicodes[s]
+if not uft or not ust then
+ logs.report("define otf","%s: unicode problem with ligature (%s->%s=%s->%s+%s->%s)",kind,descriptions[uc].name or "?",uc,f,uft or "?",s,ust or "?")
+ -- some kind of error
+else
+ if type(uft) == "number" then uft = { uft } end
+ if type(ust) == "number" then ust = { ust } end
+ for ufi=1,#uft do
+ local uf = uft[ufi]
+ for usi=1,#ust do
+ local us = ust[usi]
+
if changed[uf] or changed[us] then
if trace then
logs.report("define otf","%s: %s (%s) + %s (%s) ignored",kind,f,uf,s,us)
end
else
- local first, second = chars[uf], us
+ local first, second = characters[uf], us
if first and second then
local t = first.ligatures
if not t then
t = { }
first.ligatures = t
end
- t[second] = {
- char = unicodes[c.description.name],
- type = 0
- }
+ local uuc = unicodes[descriptions[uc].name]
+ if type(uuc) == "number" then
+ t[second] = { type = 0, char = uuc }
+ else
+ t[second] = { type = 0, char = uuc[1] }
+ end
if trace then
- logs.report("define otf","%s: %s (%s) + %s (%s) = %s (%s)",kind,f,uf,s,us,c.description.name,unicodes[c.description.name])
+ logs.report("define otf","%s: %s (%s) + %s (%s) = %s (%s)",kind,f,uf,s,us,descriptions[uc].name,unicodes[descriptions[uc].name])
end
end
end
- ok, done[lig] = true, c.description.name
+
+ end
+ end
+end
+
+ ok, done[lig] = true, descriptions[uc].name
end
end
end
@@ -2152,14 +2293,15 @@ function otf.features.prepare_base_substitutions(tfmdata,kind,value) -- we can s
local otfdata = tfmdata.shared.otfdata
local unicodes = otfdata.luatex.unicodes
local trace = otf.trace_features
- local chars = tfmdata.characters
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
local somevalid = otf.some_valid_feature(otfdata,kind,tfmdata.script,tfmdata.language)
if not table.is_empty(somevalid) then
tfmdata.changed = tfmdata.changed or { }
local changed = tfmdata.changed
local glyphs = otfdata.glyphs
- for k,c in pairs(chars) do
- local o = glyphs[c.description.index]
+ for k,c in pairs(characters) do
+ local o = glyphs[descriptions[k].index]
if o and o.lookups then
for lookup,ps in pairs(o.lookups) do
if somevalid[lookup] then
@@ -2170,12 +2312,29 @@ function otf.features.prepare_base_substitutions(tfmdata,kind,value) -- we can s
local pv = p[2] -- p.variant
if pv then
local upv = unicodes[pv]
- if upv and chars[upv] then
- if trace then
- logs.report("define otf","%s: %s (%s) => %s (%s)",kind,chars[k].description.name,k,chars[upv].description.name,upv)
+ if upv then
+ if type(upv) == "number" then
+ if characters[upv] then
+ if trace then
+ logs.report("define otf","%s: %s (%s) => %s (%s)",kind,descriptions[k].name,k,descriptions[upv].name,upv)
+ end
+ characters[k] = characters[upv]
+ descriptions[k] = descriptions[upv]
+ changed[k] = true
+ end
+ else
+ for i=1,#upv do
+ local upv = upv[i]
+ if characters[upv] then
+ if trace then
+ logs.report("define otf","%s: %s (%s) => %s (%s)",kind,descriptions[k].name,k,descriptions[upv].name,upv)
+ end
+ characters[k] = characters[upv]
+ descriptions[k] = descriptions[upv]
+ changed[k] = true
+ end
+ end
end
- chars[k] = chars[upv]
- changed[k] = true
end
end
elseif t == 'alternate' then
@@ -2184,12 +2343,29 @@ function otf.features.prepare_base_substitutions(tfmdata,kind,value) -- we can s
pc = pa.components:match("([^ ]+)") -- todo: selector
if pc then
local upc = unicodes[pc]
- if upc and chars[upc] then
- if trace then
- logs.report("define otf","%s: %s (%s) => %s (%s)",kind,chars[k].description.name,k,chars[upc].description.name,upc)
+ if upc then
+ if type(upc) == "number" then
+ if chars[upc] then
+ if trace then
+ logs.report("define otf","%s: %s (%s) => %s (%s)",kind,descriptions[k].name,k,descriptions[upc].name,upc)
+ end
+ characters[k] = characters[upc]
+ descriptions[k] = descriptions[upc]
+ changed[k] = true
+ end
+ else
+ for i=1,#upc do
+ local upc = upc[i]
+ if chars[upc] then
+ if trace then
+ logs.report("define otf","%s: %s (%s) => %s (%s)",kind,descriptions[k].name,k,descriptions[upc].name,upc)
+ end
+ characters[k] = characters[upc]
+ descriptions[k] = descriptions[upc]
+ changed[k] = true
+ end
+ end
end
- chars[k] = chars[upc]
- changed[k] = true
end
end
end
@@ -2197,7 +2373,7 @@ function otf.features.prepare_base_substitutions(tfmdata,kind,value) -- we can s
local pc = p[2]
if pc then
if trace then
- logs.report("define otf","%s: %s => %s (%s)",kind,pc,chars[k].description.name,k)
+ logs.report("define otf","%s: %s => %s (%s)",kind,pc,descriptions[k].name,k)
end
ligatures[#ligatures+1] = { pc, k }
end
@@ -2258,8 +2434,9 @@ do
shared.featurecache[kind] = shared.featurecache[kind] or false -- signal
shared.lookuptable [fullkind] = lookuptable
shared.processes [fullkind] = processes
- local types = otfdata.luatex.name_to_type
- local flags = otfdata.luatex.ignore_flags
+ local luatex = otfdata.luatex
+ local types = luatex.name_to_type
+ local flags = luatex.ignore_flags
local preparers = otf.features.prepare
local process = otf.features.process
for i=1,#lookuptable do
@@ -2284,56 +2461,91 @@ do
-- helper: todo, we don't need to store non local ones for chains so we can pass the
-- validator as parameter
- local pairs = pairs
-
function otf.features.collect_ligatures(tfmdata,kind) -- ligs are spread all over the place
local otfdata = tfmdata.shared.otfdata
- local unicodes = tfmdata.shared.otfdata.luatex.unicodes -- actually the char index is ok too
+ local glyphs = otfdata.glyphs
+ local luatex = otfdata.luatex
+ local unicodes = luatex.unicodes -- names to unicode
+ local indices = luatex.indices -- unicode to index
local trace = otf.trace_features
local ligatures = { }
- local function collect(lookup,o,ps)
+ local function collect(lookup,unicode,glyph,ps)
for i=1,#ps do
local p = ps[i]
if p[1] == 'ligature' then
if trace then
- logs.report("define otf","feature %s lookup %s ligature %s => %s",kind,lookup,p[2],o.name)
+ logs.report("define otf","feature %s lookup %s ligature %s => %s",kind,lookup,p[2],glyph.name)
end
local t = ligatures[lookup]
if not t then
t = { }
ligatures[lookup] = t
end
+ -- this table is kind of special:
+ -- unicode -> tree of names/indices -> unicode
+ -- this way we can handle multiple unicode to one glyph cases
local first = true
for s in p[2]:gmatch("[^ ]+") do
- local u = unicodes[s]
if first then
- if not t[u] then
- t[u] = { { } }
+ local u = unicodes[s]
+ if not u then
+ logs.report("define otf","feature %s lookup %s ligature %s => %s ignored due to invalid unicode",kind,lookup,p[2],glyph.name)
+ elseif type(u) == "number" then
+ if not t[u] then
+ t[u] = { { } }
+ end
+ t = t[u]
+ else
+ local tt = t
+ local tu
+ for i=1,#u do
+ local u = u[i]
+ if i==1 then
+ if not t[u] then
+ t[u] = { { } }
+ end
+ tu = t[u]
+ t = tu
+ else
+ if not t[u] then
+ tt[u] = tu
+ end
+ end
+ end
end
- t = t[u]
first = false
else
+ -- beware, we mix unicodes and indices, we can comment these
+ -- lines when testing, see (*lig*)
+ s = unicodes[s]
+ if type(s) == "number" then
+ s = indices[s]
+ else
+ s = indices[s[1]]
+ end
+ -- maybe we will introduce a names table some day
local t1 = t[1]
- if not t1[u] then
- t1[u] = { { } }
+ if not t1[s] then
+ t1[s] = { { } }
end
- t = t1[u]
+ t = t1[s]
end
end
- t[2] = o.unicode
+ t[2] = unicode
end
end
end
local forced, always, okay = otf.valid_feature(otfdata,kind,tfmdata.script,tfmdata.language)
- for _,o in pairs(otfdata.glyphs) do
- local lookups = o.lookups
+ for unicode, index in pairs(indices) do
+ local glyph = glyphs[index]
+ local lookups = glyph.lookups
if lookups then
if forced then
- for lookup, ps in pairs(lookups) do collect(lookup,o,ps) end
+ for lookup, ps in pairs(lookups) do collect(lookup,unicode,glyph,ps) end
elseif okay then
- for lookup, ps in pairs(lookups) do if always[lookup] or okay[lookup] then collect(lookup,o,ps) end end
+ for lookup, ps in pairs(lookups) do if always[lookup] or okay[lookup] then collect(lookup,unicode,glyph,ps) end end
else
- for lookup, ps in pairs(lookups) do if always[lookup] then collect(lookup,o,ps) end end
+ for lookup, ps in pairs(lookups) do if always[lookup] then collect(lookup,unicode,glyph,ps) end end
end
end
end
@@ -2359,18 +2571,25 @@ do
substitutions = { }
featuredata[lookupname] = substitutions
local otfdata = tfmdata.shared.otfdata
- local unicodes = otfdata.luatex.unicodes
+ local glyphs = otfdata.glyphs
+ local luatex = otfdata.luatex
+ local unicodes = luatex.unicodes -- names to unicode
+ local indices = luatex.indices -- unicode to index
local trace = otf.trace_features
- for _, o in pairs(otfdata.glyphs) do
- local lookups = o.lookups
+ for unicode, index in pairs(indices) do
+ local glyph = glyphs[index]
+ local lookups = glyph.lookups
if lookups then
for lookup,ps in pairs(lookups) do
if lookup == lookupname then
for i=1,#ps do
local p = ps[i]
if p[1] == 'substitution' then
- local old, new = o.unicode, unicodes[p[2]]
- substitutions[old] = new
+ local old, new = unicode, unicodes[p[2]]
+ if type(new) == "table" then
+ new = new[1]
+ end
+ substitutions[old] = new
if trace then
logs.report("define otf","%s:%s substitution %s => %s",kind,lookupname,old,new)
end
@@ -2391,23 +2610,32 @@ do
substitutions = { }
featuredata[lookupname] = substitutions
local otfdata = tfmdata.shared.otfdata
- local unicodes = otfdata.luatex.unicodes
+ local glyphs = otfdata.glyphs
+ local luatex = otfdata.luatex
+ local unicodes = luatex.unicodes -- names to unicode
+ local indices = luatex.indices -- unicode to index
local trace = otf.trace_features
- for _,o in pairs(otfdata.glyphs) do
- local lookups = o.lookups
+ for unicode, index in pairs(indices) do
+ local glyph = glyphs[index]
+ local lookups = glyph.lookups
if lookups then
for lookup,ps in pairs(lookups) do
if lookup == lookupname then
for i=1,#ps do
local p = ps[i]
if p[1] == 'multiple' then
- local old, new = o.unicode, { }
+ local old, new = unicode, { }
substitutions[old] = new
for pc in p[2]:gmatch("[^ ]+") do
- new[#new+1] = unicodes[pc]
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ new[#new+1] = upc
+ else
+ new[#new+1] = upc[1]
+ end
end
if trace then
- logs.report("define otf","%s:%s multiple %s => %s",kind,lookupname,old,table.concat(new," "))
+ logs.report("define otf","%s:%s multiple %s => %s",kind,lookupname,old,concat(new," "))
end
end
end
@@ -2427,24 +2655,33 @@ do
featuredata[lookupname] = { }
substitutions = featuredata[lookupname]
local otfdata = tfmdata.shared.otfdata
- local unicodes = otfdata.luatex.unicodes
+ local glyphs = otfdata.glyphs
+ local luatex = otfdata.luatex
+ local unicodes = luatex.unicodes -- names to unicode
+ local indices = luatex.indices -- unicode to index
local trace = otf.trace_features
- for _,o in pairs(otfdata.glyphs) do
- local lookups = o.lookups
+ for unicode, index in pairs(indices) do
+ local glyph = glyphs[index]
+ local lookups = glyph.lookups
if lookups then
for lookup,ps in pairs(lookups) do
if lookup == lookupname then
for i=1,#ps do
local p = ps[i]
if p[1] == 'alternate' then
- local old = o.unicode
+ local old = unicode
local t = { }
for pc in p[2]:gmatch("[^ ]+") do
- t[#t+1] = unicodes[pc]
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ t[#t+1] = upc
+ else
+ t[#t+1] = upc[1]
+ end
end
substitutions[old] = t
if trace then
- logs.report("define otf","%s:%s alternate %s => %s",kind,lookupname,old,table.concat(substitutions,"|"))
+ logs.report("define otf","%s:%s alternate %s => %s",kind,lookupname,old,concat(substitutions,"|"))
end
end
end
@@ -2472,16 +2709,20 @@ do
local featuredata = tfmdata.shared.featuredata[kind]
local contexts = featuredata[lookupname]
if not contexts then
- featuredata[lookupname] = { }
- contexts = featuredata[lookupname]
- local otfdata = tfmdata.shared.otfdata
- local unicodes = otfdata.luatex.unicodes
- local internals = otfdata.luatex.internals
- local flags = otfdata.luatex.ignore_flags
- local types = otfdata.luatex.name_to_type
- otfdata.luatex.covers = otfdata.luatex.covers or { }
+ contexts = { }
+ featuredata[lookupname] = contexts
local characters = tfmdata.characters
- local cache = otfdata.luatex.covers
+ local otfdata = tfmdata.shared.otfdata
+ local luatex = otfdata.luatex
+ local unicodes = luatex.unicodes
+ local internals = luatex.internals
+ local flags = luatex.ignore_flags
+ local types = luatex.name_to_type
+ local cache = luatex.covers
+ if not cache then
+ cache = { }
+ luatex.covers = cache
+ end
local function uncover(covers,result)
-- lpeg hardly faster (.005 sec on mk)
for n=1,#covers do
@@ -2490,7 +2731,14 @@ do
if not cc then
local t = { }
for s in c:gmatch("[^ ]+") do
- t[unicodes[s]] = true
+ local us = unicodes[s]
+ if type(us) == "number" then
+ t[us] = true
+ else
+ for i=1,#us do
+ t[us[i]] = true
+ end
+ end
end
cache[c] = t
result[#result+1] = t
@@ -2570,12 +2818,14 @@ do
anchors = { }
featuredata[lookupname] = anchors
local otfdata = tfmdata.shared.otfdata
- local unicodes = otfdata.luatex.unicodes
- local validanchors = { }
local glyphs = otfdata.glyphs
+ local luatex = otfdata.luatex
+ local unicodes = luatex.unicodes
+ local indices = luatex.indices
+ local validanchors = { }
local trace = otf.trace_features
- if otfdata.anchor_classes then
- local classes = otfdata.anchor_classes
+ local classes = otfdata.anchor_classes
+ if classes then
for k=1,#classes do
local class = classes[k]
if class.lookup == lookupname then
@@ -2586,8 +2836,9 @@ do
end
end
end
- for _,o in pairs(glyphs) do
- local oanchor = o.anchors
+ for unicode, index in pairs(indices) do
+ local glyph = glyphs[index]
+ local oanchor = glyph.anchors
if oanchor then
local t, ok = { }, false
for type, anchors in pairs(oanchor) do -- types
@@ -2605,7 +2856,7 @@ do
end
end
if ok then
- anchors[o.unicode] = t
+ anchors[unicode] = t
end
end
end
@@ -2636,67 +2887,95 @@ do
featuredata[lookupname] = { }
kerns = featuredata[lookupname]
local otfdata = tfmdata.shared.otfdata
- local unicodes = otfdata.luatex.unicodes
local glyphs = otfdata.glyphs
+ local luatex = otfdata.luatex
+ local unicodes = luatex.unicodes
+ local indices = luatex.indices
-- ff has isolated kerns in a separate table
- for k,o in pairs(glyphs) do
- local list = o.mykerns
+ for unicode, index in pairs(indices) do
+ local glyph = glyphs[index]
+ local list = glyph.mykerns
if list then
local omk = list[lookupname]
if omk then
- local one = o.unicode
- for char, off in pairs(omk) do
- local two = char
- local krn = kerns[one]
- if krn then
- krn[two] = off
- else
- kerns[one] = { two = off }
+ local krn = kerns[unicode]
+ for other, off in pairs(omk) do
+ if not krn then
+ krn = { }
+ kerns[unicode] = krn
end
+ krn[other] = off
if trace then
- logs.report("define otf","feature %s kern pair %s - %s",kind,one,two)
+ logs.report("define otf","feature %s kern pair %s - %s",kind,unicode,other)
end
end
end
- elseif o.kerns then
- local one = o.unicode
- local okerns = o.kerns
- for ok=1,#okerns do
- local k = okerns[ok]
- if k.lookup == lookupname then
- local char = k.char
- if char then
- local two = unicodes[char]
- local krn = kerns[one]
- if krn then
- krn[two] = k.off
- else
- kerns[one] = { two = k.off }
- end
- if trace then
- logs.report("define otf","feature %s kern pair %s - %s",kind,one,two)
+ else
+ list = glyph.kerns
+ if list then
+ local krn
+ for ok=1,#list do
+ local k = list[ok]
+ if k.lookup == lookupname then
+ local char = k.char
+ if char then
+ if not krn then
+ krn = kerns[unicode]
+ if not krn then
+ krn = { }
+ kerns[unicode] = krn
+ end
+ end
+ local second = unicodes[char]
+ local off = k.off
+ if type(second) == "number" then
+ krn[second] = off
+ if trace then
+ logs.report("define otf","feature %s kern pair %s - %s",kind,unicode,second)
+ end
+ else
+ for i=1,#second do
+ local second = second[i]
+ krn[second] = off
+ if trace then
+ logs.report("define otf","feature %s kern pair %s - %s",kind,unicode,second)
+ end
+ end
+ end
end
end
end
end
end
- list = o.lookups
+ list = glyphs.lookups
if list then
- local one = o.unicode
for lookup,ps in pairs(list) do
if lookup == lookupname then
+ local krn
for i=1,#ps do
local p = ps[i]
if p[1] == 'pair' then
- local two = unicodes[p[2]]
- local krn = kerns[one]
- if krn then
- krn[two] = p
- else
- kerns[one] = { two = p }
+ if not krn then
+ krn = kerns[unicode]
+ if not krn then
+ krn = { }
+ kerns[unicode] = krn
+ end
end
- if trace then
- logs.report("define otf","feature %s kern pair %s - %s",kind,one,two)
+ local second = unicodes[p[2]]
+ if type(second) == "number" then
+ krn[second] = p
+ if trace then
+ logs.report("define otf","feature %s kern pair %s - %s",kind,unicode,second)
+ end
+ else
+ for i=1,#second do
+ local second = second[i]
+ krn[second] = p
+ if trace then
+ logs.report("define otf","feature %s kern pair %s - %s",kind,unicode,second)
+ end
+ end
end
end
end
@@ -2823,13 +3102,15 @@ do
-- we share some vars here, after all, we have no nested lookups and
-- less code
- local tfmdata = false
- local otfdata = false
- local characters = false
- local marks = false
- local glyphs = false
- local currentfont = false
- local rlmode = 0
+ local tfmdata = false
+ local otfdata = false
+ local characters = false
+ local descriptions = false
+ local marks = false
+ local indices = false
+ local glyphs = false
+ local currentfont = false
+ local rlmode = 0
-- we cheat a bit and assume that a font,attr combination are kind of ranged
@@ -2847,8 +3128,11 @@ do
local shared = tfmdata.shared
otfdata = shared.otfdata
characters = tfmdata.characters
- marks = otfdata.luatex.marks
+ descriptions = tfmdata.descriptions
glyphs = otfdata.glyphs
+ local luatex = otfdata.luatex
+ marks = luatex.marks
+ indices = luatex.indices
currentfont = font
rlmode = 0
local script, language, strategy
@@ -3086,59 +3370,37 @@ do
local prev = start.prev
start = start.next
end
- else
+ else -- start is the ligature
+ -- to be checked: this marknum mess (sensitive for looping)
local deletemarks = markflag ~= "mark"
+--~ deletemarks = false
start.components = copy_list(start,stop)
- slide(start.components)
- -- todo: components
- start.subtype = 2
- start.char = char
- local marknum = 1
- local next = start.next
- while true do
- if marks[next.char] then
- if not deletemarks then
- set_attribute(next,marknumber,marknum)
- end
- else
- marknum = marknum + 1
- end
- if next == stop then
- break
- else
- next = next.next
- end
- end
- next = stop.next
- while next do
- if next.id == glyph and next.font == currentfont and marks[next.char] then
+ local last = slide(start.components)
+ start.components.prev, last.next = nil, nil
+ start.char, start.subtype = char, 2
+ local next, done, marknum = start.next, false, 1
+ local after = stop.next
+ while not done do
+ done = next == stop
+ if not deletemarks and marks[next.char] then
set_attribute(next,marknumber,marknum)
next = next.next
+ --~ marknum = marknum + 1
else
- break
+ marknum = marknum + 1
+ start, next = nodes.remove(start,next,true)
end
end
- local next = start.next
- while next do
- if next == stop or deletemarks or marks[next.char] then
- local crap = next
- local np, nn = next.prev, next.next
- np.next = nn
- if nn then
- nn.prev = np
- end
- if next == stop then
- stop = crap.prev
- free(crap)
- break
- else
- next = nn
- free(crap)
- end
+ while after and after.id == glyph and after.font == currentfont and marks[after.char] do
+ if deletemarks then
+ start, after = nodes.remove(start,after,true)
else
- next = nn
+ set_attribute(after,marknumber,marknum)
+ after = after.next
+ --~ marknum = marknum + 1
end
end
+
end
end
return start
@@ -3200,10 +3462,15 @@ do
local id = s.id
if id == glyph and s.subtype<256 then
if s.font == currentfont then
- if marks[s.char] then
+ local char = s.char
+ if marks[char] then
s = s.next
else
- local lg = ligatures[1][s.char]
+ -- we use indices, which saves a lookup, but we can use
+ -- names when we comment the line after (*lig*)
+ -- local lg = ligatures[1][glyphs[indices[char]].name]
+ local lg = ligatures[1][indices[char]]
+ -- mayb esome day we introduce a more efficient method
if not lg then
break
else
@@ -3313,13 +3580,12 @@ do
return start, false
end
+ -- hm which one is the correct one? chainprocs.gpos_mark2mark ot the next; the next one
+ -- had more tracing so might be the best
+
function otf.features.process.gpos_mark2mark(start,kind,lookupname,b_anchors,m_anchors)
local basemarkchar = start.char
---~ print(lookupname)
if marks[basemarkchar] then
---~ print('')
---~ print('basemarkchar',basemarkchar)
---~ print('basemarkanchors', table.serialize(b_anchors))
local baseanchors = b_anchors['basemark']
if baseanchors then
local component = start.next
@@ -3328,16 +3594,11 @@ do
if not marks[markchar] then
break
else
---~ print('markchar',markchar)
- local basemarkattr = has_attribute(start, marknumber) or 1
+ local basemarkattr = has_attribute(start,marknumber) or 1
local markattr = has_attribute(component,marknumber) or 1
---~ print(basemarkattr,markattr)
if basemarkattr == markattr then -- still needed?
---~ print('markanchors *', table.serialize(m_anchors))
-
local markanchors = m_anchors[markchar]
if markanchors then
---~ print('markanchors')
local markanchor = markanchors['mark']
if markanchor then
for anchor,ma in pairs(markanchor) do
@@ -3355,8 +3616,9 @@ do
end
end
end
- component = component.next
+ -- weird, was here
end
+ component = component.next
end
end
end
@@ -3384,7 +3646,7 @@ do
local exit = cexit[anchor]
if exit then
local factor = tfmdata.factor
- local dx = -(tfmdata.characters[prevchar].description.width-exit[1]) - entry[1]
+ local dx = -(descriptions[prevchar].width-exit[1]) - entry[1]
local dy = -(entry[2]-exit[2])
start.yoffset = prev.yoffset + scale(dy, factor)
-- start.xoffset = scale(tx[i], factor)
@@ -3433,7 +3695,7 @@ do
local exit = cexit[anchor]
if exit then
local dy = -exit[2] + entry[2]
- local dx = -(tfmdata.characters[nextchar].description.width-entry[1]) - exit[1] -- often width == entry 1
+ local dx = -(descriptions[nextchar].width-entry[1]) - exit[1] -- often width == entry 1
tx[#tx+1], ty[#ty+1] = dx, dy
total_x, total_y = total_x + dx, total_y + dy
stack[#stack+1] = start
@@ -3465,51 +3727,55 @@ do
end
function otf.features.process.gpos_pair(start,kind,lookupname,basekerns,kerns)
- local next, prev, done = start.next, start, false
- -- to be optimized, we can consider using basemode for fonts without lookups
-- todo: kerns in disc nodes: pre, post, replace -> loop over disc too
-- todo: kerns in components of ligatures
- local trace = otf.trace_kerns
- local factor = tfmdata.factor
- while next and next.id == glyph and next.subtype<256 and next.font == currentfont do
- local cn = characters[next.char]
- if not cn or cn.description.class == 'mark' then
- prev = next
- next = next.next
- else
- local krn = basekerns[next.char]
- if not krn then
- -- skip
- elseif type(krn) == "table" then
- local a, b = krn[3], krn[7]
- if a and a ~= 0 then
- local k = nodes.kern(scale(a,factor))
+ local next = start.next
+ if not next then
+ return start, false
+ else
+ local prev, done = start, false
+ local trace = otf.trace_kerns
+ local factor = tfmdata.factor
+ while next and next.id == glyph and next.subtype<256 and next.font == currentfont do
+ local cn = descriptions[next.char]
+ if not cn or cn.class == 'mark' then
+ prev = next
+ next = next.next
+ else
+ local krn = basekerns[next.char]
+ if not krn then
+ -- skip
+ elseif type(krn) == "table" then
+ local a, b = krn[3], krn[7]
+ if a and a ~= 0 then
+ local k = nodes.kern(scale(a,factor))
+ k.next = next
+ k.prev = prev
+ prev.next = k
+ next.prev = k
+ if trace then
+ -- todo
+ end
+ end
+ if b and b ~= 0 then
+ report("otf process","we need to do something with the second kern xoff %s",b)
+ end
+ else
+ -- todo, just start, next = node.insert_before(head,next,nodes.kern(scale(kern,factor)))
+ if otf.trace_kerns then
+ report("otf process","%s: inserting kern %s between 0x%04X and 0x%04X",kind,krn,prev.char,next.char)
+ end
+ local k = nodes.kern(scale(krn,factor))
k.next = next
k.prev = prev
prev.next = k
next.prev = k
- if trace then
- -- todo
- end
- end
- if b and b ~= 0 then
- report("otf process","we need to do something with the second kern xoff %s",b)
- end
- else
- -- todo, just start, next = node.insert_before(head,next,nodes.kern(scale(kern,factor)))
- if otf.trace_kerns then
- report("otf process","%s: inserting kern %s between 0x%04X and 0x%04X",kind,krn,prev.char,next.char)
end
- local k = nodes.kern(scale(krn,factor))
- k.next = next
- k.prev = prev
- prev.next = k
- next.prev = k
+ break
end
- break
end
+ return start, done
end
- return start, done
end
-- -- -- temp here, needs to be tested first -- -- --
@@ -3627,14 +3893,23 @@ do
local replacement = cacheslot[char]
if replacement == true then
if lookups then
- local looks = glyphs[tfmdata.characters[char].description.index].lookups -- SLOW, USE OTFDATA
+ -- didn't we have the arrays available?
+ local looks = glyphs[descriptions[char].index].lookups -- SLOW, USE OTFDATA
if looks then
- local glyphlookups = otfdata.luatex.internals[lookups[lookup]].lookups
- local unicodes = otfdata.luatex.unicodes
+ local luatex = otfdata.luatex
+ local glyphlookups = luatex.internals[lookups[lookup]].lookups
+ local unicodes = luatex.unicodes
for gl=1,#glyphlookups do
local lv = looks[glyphlookups[gl]]
if lv then
- replacement = unicodes[lv[1][2]] or char
+ local ulv = unicodes[lv[1][2]]
+ if not ulv then
+ replacement = char
+ elseif type(ulv) == "number" then
+ replacement = ulv
+ else
+ replacement = ulv[1]
+ end
cacheslot[char] = replacement
break
end
@@ -3673,16 +3948,22 @@ do
local replacement = cacheslot[char]
if replacement == true then
if lookups then
- local looks = glyphs[tfmdata.characters[char].description.index].lookups
+ local looks = glyphs[descriptions[char].index].lookups
if looks then
- local lookups = otfdata.luatex.internals[lookups[1]].lookups
- local unicodes = otfdata.luatex.unicodes
+ local luatex = otfdata.luatex
+ local lookups = luatex.internals[lookups[1]].lookups
+ local unicodes = luatex.unicodes
for l=1,#lookups do
local lv = looks[lookups[l]]
if lv then
replacement = { }
for c in lv[1][2]:gmatch("[^ ]+") do
- replacement[#replacement+1] = unicodes[c]
+ local uc = unicodes[c]
+ if type(uc) == "number" then
+ replacement[#replacement+1] = uc
+ else
+ replacement[#replacement+1] = uc[1]
+ end
end
cacheslot[char] = replacement
break
@@ -3724,16 +4005,22 @@ do
local replacement = cacheslot[char]
if replacement == true then
if lookups then
- local looks = glyphs[tfmdata.characters[char].description.index].lookups
+ local looks = glyphs[descriptions[char].index].lookups
if looks then
- local lookups = otfdata.luatex.internals[lookups[1]].lookups
- local unicodes = otfdata.luatex.unicodes
+ local luatex = otfdata.luatex
+ local lookups = luatex.internals[lookups[1]].lookups
+ local unicodes = luatex.unicodes
for l=1,#lookups do
local lv = looks[lookups[l]]
if lv then
replacement = { }
for c in lv[1][2]:gmatch("[^ ]+") do
- replacement[#replacement+1] = unicodes[c]
+ local uc = unicodes[c]
+ if type(uc) == "number" then
+ replacement[#replacement+1] = uc
+ else
+ replacement[#replacement+1] = uc[1]
+ end
end
cacheslot[char] = replacement
break
@@ -3757,12 +4044,16 @@ do
function chainprocs.gsub_ligature(start,stop,kind,lookupname,sequence,f,l,lookups,flags)
if lookups then
+ if start == stop then
+ -- print("todo: optimize")
+ end
local featurecache = fontdata[currentfont].shared.featurecache
- if not featurecache[kind] then
- featurecache[kind] = otf.features.collect_ligatures(tfmdata,kind) -- double cached ?
+ local ligaturecache = featurecache[kind]
+ if not ligaturecache then
+ ligaturecache = otf.features.collect_ligatures(tfmdata,kind) -- double cached ?
+ featurecache[kind] = ligaturecache
end
local lookups = otfdata.luatex.internals[lookups[1]].lookups
- local ligaturecache = featurecache[kind]
local trace = otf.trace_ligatures
for i=1,#lookups do
local ligatures = ligaturecache[lookups[i]]
@@ -3774,7 +4065,7 @@ do
if id == disc then
s = s.next
discfound = true
- elseif characters[s.char].description.class == 'mark' then -- marks
+ elseif descriptions[s.char].class == 'mark' then -- marks
s = s.next
else
local lg = ligatures[1][s.char]
@@ -3838,12 +4129,12 @@ do
if marks[basechar] then
component = component.prev
else
- local bglyph = glyphs[characters[basechar].description.index] -- startchar
+ local bglyph = glyphs[descriptions[basechar].index] -- startchar
local baseanchors = bglyph.anchors['basechar']
if baseanchors then
local ba = baseanchors[anchortag]
if ba then
- local mglyph = glyphs[characters[markchar].description.index]
+ local mglyph = glyphs[descriptions[markchar].index]
local markanchors = mglyph.anchors['mark']
if markanchors then
local ma = markanchors[anchortag]
@@ -3897,7 +4188,7 @@ do
if marks[basechar] then
component = component.prev
else
- local bglyph = glyphs[characters[basechar].description.index] -- startchar
+ local bglyph = glyphs[descriptions[basechar].index] -- startchar
local baseanchors = bglyph.anchors['baselig']
if baseanchors then
local ba = baseanchors[anchortag]
@@ -3905,7 +4196,7 @@ do
local n = has_attribute(start,marknumber)
ba = ba[n] -- ok ?
if ba then
- local mglyph = glyphs[characters[markchar].description.index]
+ local mglyph = glyphs[descriptions[markchar].index]
local markanchors = mglyph.anchors['mark']
if markanchors then
local ma = markanchors[anchortag]
@@ -3931,7 +4222,7 @@ do
return start, false
end
- -- to be checked
+ -- to be checked (see previous generic mark2mark)
function chainprocs.gpos_mark2mark(start,stop,kind,lookupname,sequence,f,l,lookups)
local component = start.next
@@ -3959,15 +4250,14 @@ do
local markattr = has_attribute(start, marknumber) or 1 -- i need to check this ! 1 is new !
local baseattr = has_attribute(component,marknumber) or 1 -- i need to check this ! 1 is new !
if baseattr == markattr then
- local glyph = glyphs[characters[markchar].description.index]
+ local glyph = glyphs[descriptions[markchar].index]
if glyph.anchors and glyph.anchors[anchortag] then
local trace = otf.trace_anchors
local done = false
local baseanchors = glyph.anchors['basemark'][anchortag]
- while true do
+ while component do
local basechar = component.char
- local charnext = characters[basechar]
- local markanchors = glyphs[charnext.description.index].anchors['mark'][anchortag]
+ local markanchors = glyphs[descriptions[basechar].index].anchors['mark'][anchortag]
if markanchors then
for anchor,data in pairs(markanchors) do
local ba = baseanchors[anchor]
@@ -4025,6 +4315,8 @@ do
-- what pointer to return, spec says stop
+ -- to be discussed ... is bidi changer a space?
+
function otf.features.process.contextchain(start,kind,lookupname,contextdata)
local contexts, flags, done = contextdata.lookups, contextdata.flags, false
local skipmark, skipligature, skipbase = unpack(flags) -- unpack slower than assignment
@@ -4042,17 +4334,22 @@ do
local id = last.id
if id == glyph and last.subtype<256 and last.font == currentfont then
local char = last.char
- local chardata = characters[char]
- if chardata then
- local class = chardata.description.class
- if class == skipmark or class == skipligature or class == skipbase then
- -- skip 'm
- last = last.next
- elseif sequence[n][char] then
- if n < l then
+ local cc = characters[char]
+ if cc then
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
last = last.next
+ elseif sequence[n][char] then
+ if n < l then
+ last = last.next
+ end
+ n = n + 1
+ else
+ match = false break
end
- n = n + 1
else
match = false break
end
@@ -4078,11 +4375,21 @@ do
local id = prev.id
if id == glyph and prev.subtype<256 and prev.font == currentfont then -- normal char
local char = prev.char
- local class = characters[char].description.class
- if class == skipmark or class == skipligature or class == skipbase then
- -- skip 'm
- elseif sequence[n][char] then
- n = n -1
+ local cc = characters[char]
+ if cc then
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
+ elseif sequence[n][char] then
+ n = n -1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
else
match = false break
end
@@ -4120,11 +4427,21 @@ do
local id = next.id
if id == glyph and next.subtype<256 and next.font == currentfont then -- normal char
local char = next.char
- local class = characters[char].description.class
- if class == skipmark or class == skipligature or class == skipbase then
- -- skip 'm
- elseif sequence[n][char] then
- n = n + 1
+ local cc = characters[char]
+ if cc then
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
+ elseif sequence[n][char] then
+ n = n + 1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
else
match = false break
end
@@ -4208,7 +4525,7 @@ do
local id = next.id
if id == glyph and next.subtype<256 and next.font == currentfont then -- normal char
local char = next.char
- local class = characters[char].description.class
+ local class = descriptions[char].class
if class == skipmark or class == skipligature or class == skipbase then
-- skip
elseif sequence[n][char] then
@@ -4406,16 +4723,16 @@ do
local tlig_list = {
endash = "hyphen hyphen",
emdash = "hyphen hyphen hyphen",
---~ quotedblleft = "quoteleft quoteleft",
---~ quotedblright = "quoteright quoteright",
---~ quotedblleft = "grave grave",
---~ quotedblright = "quotesingle quotesingle",
---~ quotedblbase = "comma comma",
+ --~ quotedblleft = "quoteleft quoteleft",
+ --~ quotedblright = "quoteright quoteright",
+ --~ quotedblleft = "grave grave",
+ --~ quotedblright = "quotesingle quotesingle",
+ --~ quotedblbase = "comma comma",
}
local trep_list = {
---~ [0x0022] = 0x201D,
+ --~ [0x0022] = 0x201D,
[0x0027] = 0x2019,
---~ [0x0060] = 0x2018,
+ --~ [0x0060] = 0x2018,
}
local tlig_feature = {
@@ -4436,19 +4753,22 @@ do
}
function otf.enhance.enrich(data,filename)
- for index, glyph in pairs(data.glyphs) do
+ local glyphs = data.glyphs
+ local indices = data.map.map
+ for unicode, index in pairs(indices) do
+ local glyph = glyphs[index]
local l = tlig_list[glyph.name]
if l then
local o = glyph.lookups or { }
o["ctx_tlig_1"] = { { "ligature", l, glyph.name } }
glyph.lookups = o
end
- local r = trep_list[glyph.unicode]
+ local r = trep_list[unicode]
if r then
- local replacement = data.map.map[r]
+ local replacement = indices[r]
if replacement then
local o = glyph.lookups or { }
- o["ctx_trep_1"] = { { "substitution", data.glyphs[replacement].name } } ---
+ o["ctx_trep_1"] = { { "substitution", glyphs[replacement].name } } ---
glyph.lookups = o
end
end
@@ -4528,7 +4848,12 @@ function otf.name_to_slot(name) -- todo: afm en tfm
if tfmdata and tfmdata.shared then
local otfdata = tfmdata.shared.otfdata
if otfdata and otfdata.luatex then
- return otfdata.luatex.unicodes[name]
+ local unicode = otfdata.luatex.unicodes[name]
+ if type(unicode) == "number" then
+ return unicode
+ else
+ return unicode[1]
+ end
end
end
return nil
@@ -4543,28 +4868,7 @@ function otf.char(n) -- todo: afm en tfm
end
end
---~ function otf.name_to_table(name)
---~ lcoal temp, result = { }
---~ local tfmdata = tfm.id[font.current()]
---~ if tfmdata and tfmdata.shared then
---~ local otfdata = tfmdata.shared.otfdata
---~ if otfdata and otfdata.luatex then
---~ for k,v in pairs(otfdata.glyphs) do
---~ if v.name:find(name) then
---~ temp[v.name] = v.unicode
---~ end
---~ end
---~ end
---~ end
---~ for k,v in pairs(table.sortedkeys(temp)) do
---~ result[#result+1] = { v, temp[v] }
---~ end
---~ return result
---~ end
-
--- Here we plug in some analyzing code
-
--- will move to font-tfm
+-- Here we plug in some analyzing code (will move to font-tfm).
do
@@ -4650,7 +4954,7 @@ do
local isol_fina = {
[0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true, [0x0627] = true, [0x062F] = true,
[0x0630] = true, [0x0631] = true, [0x0632] = true,
- [0x0648] = true,
+ [0x0648] = true, [0x0698] = true,
[0xFEF5] = true, [0xFEF7] = true, [0xFEF9] = true, [0xFEFB] = true,
}
@@ -4659,8 +4963,8 @@ do
[0x0633] = true, [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true, [0x0638] = true, [0x0639] = true, [0x063A] = true,
[0x0640] = true, -- tadwil
[0x0641] = true, [0x0642] = true, [0x0643] = true, [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true, [0x0649] = true, [0x064A] = true,
- [0x067E] = true,
- [0x0686] = true, [zwj] = true,
+ [0x067E] = true, [0x0686] = true, [0x06AF] = true, [0x06A9] = true, [0x06CC] = true,
+ [zwj] = true,
}
local arab_warned = { }
@@ -4685,7 +4989,9 @@ do
otf.remove_joiners = true -- for idris who want it as option
function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special version with no trace
- local characters = fontdata[font].characters
+ local tfmdata = fontdata[font]
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
local first, last, current, done = nil, nil, head, false
local trace, removejoiners = fonts.color.trace, otf.remove_joiners
--~ local laststate = 0
@@ -4736,11 +5042,11 @@ do
-- some day we will make a characters.marks hash
-- this is also more efficient since it's shared
local char = current.char
- local chardata = characters[char]
+ local descriptions = descriptions[char]
if removejoiners and char == zwj or char == zwnj then
joiners[#joiners+1] = current
end
- if chardata and chardata.description.class == "mark" then
+ if descriptions and descriptions.class == "mark" then
set_attribute(current,state,5) -- mark
if trace then fcs(current,"font:mark") end
elseif isol[char] then -- can be zwj or zwnj too
@@ -4920,15 +5226,19 @@ do
}
local function is_han_character(char)
+ -- we might add such info to char-def
return
- (char>=0x04E00 and char<=0x09FFF) or
+ (char>=0x03040 and char<=0x0309F) or
+ (char>=0x030A0 and char<=0x030FF) or
+ (char>=0x031F0 and char<=0x031FF) or
(char>=0x03400 and char<=0x04DFF) or
- (char>=0x20000 and char<=0x2A6DF) or
+ (char>=0x04E00 and char<=0x09FFF) or
(char>=0x0F900 and char<=0x0FAFF) or
+ (char>=0x0FF00 and char<=0x0FFEF) or
+ (char>=0x20000 and char<=0x2A6DF) or
(char>=0x2F800 and char<=0x2FA1F)
end
-
- -- mayeb an entry in the character table: hanclass
+ -- maybe an entry in the character table: hanclass
--~ opening_parenthesis_hw / closing_parenthesis_hw
--~ opening_parenthesis_fw / closing_parenthesis_fw
@@ -4966,7 +5276,9 @@ do
function fonts.analyzers.methods.hani(head,font,attr)
-- maybe make a special version with no trace
- local characters = fontdata[font].characters
+ local tfmdata = fontdata[font]
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
local current, done, stretch, prevclass = head, false, 0, 0
if fonts.analyzers.methods.stretch_hang then
stretch = fontdata[font].parameters.quad
@@ -4977,7 +5289,8 @@ do
local internormalstretch = stretch * hang_data.inter_char_stretch_factor
local trace = fonts.color.trace
-- todo: check for first and last
--- maybe it's better to look back
+ -- maybe it's better to look back
+-- we need to backtrack a glyph (also other font)
while current do
if current.id == glyph and current.subtype<256 then
if current.font == font then
@@ -5035,6 +5348,7 @@ do
head, current = insert_after(head,current,nodes.glue(0,internormalstretch,0))
end
else
+-- here we might have a mixed font
prevclass = 0
end
elseif prevclass > 0 and current.id == glue and current.spec and current.spec.width > 0 then
diff --git a/tex/context/base/font-pat.lua b/tex/context/base/font-pat.lua
new file mode 100644
index 000000000..8f1817ec2
--- /dev/null
+++ b/tex/context/base/font-pat.lua
@@ -0,0 +1,53 @@
+if not modules then modules = { } end modules ['font-pat'] = {
+ 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"
+}
+
+-- older versions of latin modern didn't have the designsize set
+-- so for them we get it from the name
+
+local patches = fonts.otf.enhance.patches
+
+local function patch(data,filename)
+ if data.design_size == 0 then
+ local ds = (file.basename(filename:lower())):match("(%d+)")
+ if ds then
+ logs.report("load otf","patching design size (%s)",ds)
+ data.design_size = tonumber(ds) * 10
+ end
+ end
+end
+
+patches["^lmroman"] = patch
+patches["^lmsans"] = patch
+patches["^lmtypewriter"] = patch
+
+-- for some reason (either it's a bug in the font, or it's
+-- a problem in the library) the palatino arabic fonts don't
+-- have the mkmk features properly set up
+
+local function patch(data,filename)
+ if data.gpos then
+ for _, v in ipairs(data.gpos) do
+ if not v.features and v.type == "gpos_mark2mark" then
+ logs.report("load otf","patching mkmk feature (name: %s)", v.name or "?")
+ v.features = {
+ {
+ scripts = {
+ {
+ langs = { "ARA ", "FAR ", "URD ", "dflt" },
+ script = "arab",
+ },
+ },
+ tag = "mkmk"
+ }
+ }
+ end
+ end
+ end
+end
+
+patches["palatino.*arabic"] = patch
diff --git a/tex/context/base/font-run.tex b/tex/context/base/font-run.tex
index 2703600f5..83da04b62 100644
--- a/tex/context/base/font-run.tex
+++ b/tex/context/base/font-run.tex
@@ -106,12 +106,6 @@
\gdef\showfont
{\dodoubleempty\doshowfont}
-\beginTEX \iffontchar
-
- \gdef\iffontchar#1#2{\iftrue}
-
-\endTEX
-
\gdef\doshowfont[#1][#2]%
{\bgroup
\boxrulewidth=.1pt
diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua
index f7e40b3bb..70f859cde 100644
--- a/tex/context/base/font-syn.lua
+++ b/tex/context/base/font-syn.lua
@@ -20,7 +20,7 @@ texmf = texmf or { }
fonts.names = { }
fonts.names.filters = { }
fonts.names.data = { }
-fonts.names.version = 1.04
+fonts.names.version = 1.07
fonts.names.saved = false
fonts.names.loaded = false
fonts.names.be_clever = true
@@ -39,23 +39,28 @@ fonts.names.filters.ttf = fontforge.info
fonts.names.filters.ttc = fontforge.info
function fonts.names.filters.afm(name)
- local f = io.open(name)
- if f then
- local hash = { }
- for line in f:lines() do
- local key, value = line:match("^(.+)%s+(.+)%s*$")
- if key and #key > 0 then
- hash[key:lower()] = value
- end
- if line:find("StartCharMetrics") then
- break
+ local pfbname = input.find_file(file.removesuffix(name)..".pfb","pfb") or ""
+ if pfbname == "" then
+ pfbname = input.find_file(file.removesuffix(file.basename(name))..".pfb","pfb") or ""
+ end
+ if pfbname ~= "" then
+ local f = io.open(name)
+ if f then
+ local hash = { }
+ for line in f:lines() do
+ local key, value = line:match("^(.+)%s+(.+)%s*$")
+ if key and #key > 0 then
+ hash[key:lower()] = value
+ end
+ if line:find("StartCharMetrics") then
+ break
+ end
end
+ f:close()
+ return hash
end
- f:close()
- return hash
- else
- return nil
end
+ return nil
end
function fonts.names.filters.pfb(name)
@@ -82,6 +87,9 @@ fonts.names.filters.fixes = {
fonts.names.xml_configuration_file = "fonts.conf" -- a bit weird format, bonus feature
fonts.names.environment_path_variable = "OSFONTDIR" -- the official way, in minimals etc
+fonts.names.filters.paths = { }
+fonts.names.filters.names = { }
+
function fonts.names.getpaths()
local hash, result = { }, { }
local function collect(t)
@@ -111,38 +119,76 @@ function fonts.names.getpaths()
return result
end
+function fonts.names.cleanname(name)
+ return ((name:lower()):gsub("[^%a%d]",""))
+end
+
function fonts.names.identify(verbose)
fonts.names.data = {
+ version = fonts.names.version,
mapping = { },
- version = fonts.names.version
+ -- sorted = { },
+ fallback_mapping = { },
+ -- fallback_sorted = { },
}
- local done, mapping, nofread, nofok = { }, fonts.names.data.mapping, 0, 0
- local function add(n,fontname,filename,suffix, sub)
- n = n:lower()
- if not mapping[n] then mapping[n], nofok = { suffix, fontname, filename, sub }, nofok + 1 end
- n = n:gsub("[^%a%d]","")
- if not mapping[n] then mapping[n], nofok = { suffix, fontname, filename, sub }, nofok + 1 end
- end
+ local done, mapping, fallback_mapping, nofread, nofok = { }, fonts.names.data.mapping, fonts.names.data.fallback_mapping, 0, 0
+ local cleanname = fonts.names.cleanname
local function check(result, filename, suffix, is_sub)
local fontname = result.fullname
if fontname then
- add(result.fullname, fontname, filename, suffix, is_sub)
+ local n = cleanname(result.fullname)
+ if not mapping[n] then
+ mapping[n], nofok = { suffix, fontname, filename, is_sub }, nofok + 1
+ end
end
if result.fontname then
fontname = fontname or result.fontname
- add(result.fontname, fontname, filename, suffix, is_sub)
+ local n = cleanname(result.fontname)
+ if not mapping[n] then
+ mapping[n], nofok = { suffix, fontname, filename, is_sub }, nofok + 1
+ end
end
- if result.familyname and result.weight then
+ if result.familyname and result.weight and result.italicangle == 0 then
local madename = result.familyname .. " " .. result.weight
fontname = fontname or madename
- add(madename, fontname, filename, suffix, is_sub)
+ local n = cleanname(madename)
+ if not mapping[n] and not fallback_mapping[n] then
+ fallback_mapping[n], nofok = { suffix, fontname, filename, is_sub }, nofok + 1
+ end
end
end
local trace = verbose or fonts.names.trace
local filters = fonts.names.filters
- local function identify(completename,name,suffix)
+ local skip_paths = fonts.names.filters.paths
+ local skip_names = fonts.names.filters.names
+ local function identify(completename,name,suffix,storedname)
if not done[name] and io.exists(completename) then
nofread = nofread + 1
+ if #skip_paths > 0 then
+ local path = file.dirname(completename)
+ for i=1,#skip_paths do
+ if path:find(skip_paths[i]) then
+ if trace then
+ logs.report("fontnames","rejecting path of %s font %s",suffix,completename)
+ logs.push()
+ end
+ return
+ end
+ end
+ end
+ if #skip_names > 0 then
+ local base = file.basename(completename)
+ for i=1,#skip_paths do
+ if base:find(skip_names[i]) then
+ done[name] = true
+ if trace then
+ logs.report("fontnames","rejecting name of %s font %s",suffix,completename)
+ logs.push()
+ end
+ return
+ end
+ end
+ end
if trace then
logs.report("fontnames","identifying %s font %s",suffix,completename)
logs.push()
@@ -153,9 +199,9 @@ function fonts.names.identify(verbose)
end
if result then
if not result[1] then
- check(result,name,suffix,false)
+ check(result,storedname,suffix,false) -- was name
else for _, r in ipairs(result) do
- check(r,name,suffix,true)
+ check(r,storedname,suffix,true) -- was name
end end
end
done[name] = true
@@ -177,7 +223,8 @@ function fonts.names.identify(verbose)
traverse("tree", function(suffix) -- TEXTREE only
input.with_files(".*%." .. suffix .. "$", function(method,root,path,name)
if method == "file" then
- identify(root .."/" .. path .. "/" .. name,name,suffix)
+ local completename = root .."/" .. path .. "/" .. name
+ identify(completename,name,suffix,name,name)
end
end)
end)
@@ -187,13 +234,11 @@ function fonts.names.identify(verbose)
for _, path in ipairs(pathlist) do
path = input.clean_path(path .. "/")
path = path:gsub("/+","/")
- local pattern = path .. "*." .. suffix
+ local pattern = path .. "**." .. suffix -- ** forces recurse
logs.report("fontnames", "globbing path %s",pattern)
local t = dir.glob(pattern)
- for _, name in pairs(t) do -- ipairs
- -- if lfs.isfile(name) then -- always true anyway
- identify(name,file.basename(name),suffix)
- -- end
+ for _, completename in pairs(t) do -- ipairs
+ identify(completename,file.basename(completename),suffix,completename)
end
end
end
@@ -230,6 +275,13 @@ function fonts.names.load(reload,verbose)
fonts.names.saved = true
end
end
+ local data = fonts.names.data
+ if data then
+ data.sorted = table.sortedkeys(data.mapping or { }) or { }
+ data.fallback_sorted = table.sortedkeys(data.fallback_mapping or { }) or { }
+ else
+ logs.report("font table", "accessing the data table failed")
+ end
fonts.names.loaded = true
end
end
@@ -238,11 +290,19 @@ function fonts.names.list(pattern,reload)
fonts.names.load(reload)
if fonts.names.loaded then
local t = { }
- for k,v in pairs(fonts.names.data.mapping) do
- if k:find(pattern) then
- t[k] = v
+ local function list_them(mapping,sorted)
+ if mapping[pattern] then
+ t[pattern] = mapping[pattern]
+ else
+ for k,v in ipairs(sorted) do
+ if v:find(pattern) then
+ t[v] = mapping[v]
+ end
+ end
end
end
+ list_them(fonts.names.data.mapping,fonts.names.data.sorted)
+ list_them(fonts.names.data.fallback_mapping,fonts.names.data.fallback_sorted)
return t
else
return nil
@@ -259,36 +319,47 @@ do
local function found(name)
if fonts.names.data then
- local result, mapping = nil, fonts.names.data.mapping
- local mn = mapping[name]
- if mn then
- return mn[2], mn[3], mn[4]
- end
- if fonts.names.be_clever then -- this will become obsolete
- local encoding, tag = name:match("^(.-)[%-%:](.+)$")
- local mt = mapping[tag]
- if tag and fonts.enc.is_known(encoding) and mt then
- return mt[1], encoding .. "-" .. mt[3], mt[4]
+ name = fonts.names.cleanname(name)
+ local function found_indeed(mapping,sorted)
+ local mn = mapping[name]
+ if mn then
+ return mn[2], mn[3], mn[4]
end
- end
- -- name, type, file
- for k,v in pairs(mapping) do
- if k:find(name) then
- return v[2], v[3], v[4]
+ if fonts.names.be_clever then -- this will become obsolete
+ local encoding, tag = name:match("^(.-)[%-%:](.+)$")
+ local mt = mapping[tag]
+ if tag and fonts.enc.is_known(encoding) and mt then
+ return mt[1], encoding .. "-" .. mt[3], mt[4]
+ end
end
- end
- local condensed = name:gsub("[^%a%d]","")
- local mc = mapping[condensed]
- if mc then
- return mc[2], mc[3], mc[4]
- end
- for k,v in pairs(mapping) do
- if k:find(condensed) then
- return v[2], v[3], v[4]
+ -- name, type, file
+ for k,v in pairs(mapping) do
+ if k:find(name) then
+ return v[2], v[3], v[4]
+ end
end
+ local condensed = name:gsub("[^%a%d]","")
+ local mc = mapping[condensed]
+ if mc then
+ return mc[2], mc[3], mc[4]
+ end
+ for k,v in ipairs(sorted) do
+ if v:find(condensed) then
+ v = mapping[v]
+ return v[2], v[3], v[4]
+ end
+ end
+ return nil, nil, nil
end
+ local data = fonts.names.data
+ local fontname, filename, is_sub = found_indeed(data.mapping, data.sorted)
+ if not fontname or not filename then
+ fontname, filename, is_sub = found_indeed(data.fallback_mapping, data.fallback_sorted)
+ end
+ return fontname, filename, is_sub
+ else
+ return nil, nil, nil
end
- return nil, nil, nil
end
local reloaded = false
@@ -390,3 +461,18 @@ fonts.names.new_to_old = {
}
fonts.names.old_to_new = table.swapped(fonts.names.new_to_old)
+
+function fonts.names.exists(name)
+ local fna, found = fonts.names.autoreload, false
+ fonts.names.autoreload = false
+ for k,v in ipairs(fonts.names.filters.list) do
+ found = (input.find_file(name,v) or "") ~= ""
+ if found then
+ break
+ end
+ end
+ found = found or (input.find_file(name,"tfm") or "") ~= ""
+ found = found or (fonts.names.resolve(name) or "") ~= ""
+ fonts.names.autoreload = fna
+ return found
+end
diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua
index 02f5c45a6..1955b58bc 100644
--- a/tex/context/base/font-tfm.lua
+++ b/tex/context/base/font-tfm.lua
@@ -48,7 +48,6 @@ function tfm.enhance(tfmdata,specification)
if fonts.trace then
logs.report("define font","mapping %s onto %s",k,v)
end
- -- characters[k] = characters[v]
characters[k] = original[v]
end
end
@@ -76,6 +75,7 @@ function tfm.read_from_tfm(specification)
end
tfmdata = font.read_tfm(fname,specification.size) -- not cached, fast enough
if tfmdata then
+ tfmdata.descriptions = tfmdata.descriptions or { }
if tfm.resolve_vf then
fonts.logger.save(tfmdata,file.extname(fname),specification) -- strange, why here
fname = input.findbinfile(specification.name, 'ovf')
@@ -90,7 +90,6 @@ function tfm.read_from_tfm(specification)
tfmdata.fonts = vfdata.fonts
end
end
---~ print(table.serialize(tfmdata))
end
tfm.enhance(tfmdata,specification)
end
@@ -139,14 +138,6 @@ function tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as wel
end
end
---~ function tfm.scaled(scaledpoints, designsize)
---~ if scaledpoints < 0 then
---~ return (- scaledpoints/1000) * (designsize or 10) * tfm.factor
---~ else
---~ return scaledpoints
---~ end
---~ end
-
--[[ldx--
Before a font is passed to we scale it. Here we also need
to scale virtual characters.
@@ -191,6 +182,7 @@ function tfm.do_scale(tfmtable, scaledpoints)
if scaledpoints < 0 then
scaledpoints = (- scaledpoints/1000) * tfmtable.designsize -- already in sp
end
+--~ print(">>>",tfmtable.units)
local delta = scaledpoints/(tfmtable.units or 1000) -- brr, some open type fonts have 2048
local t = { }
t.factor = delta
@@ -213,27 +205,37 @@ function tfm.do_scale(tfmtable, scaledpoints)
tp.extra_space = (tfmp.extra_space or tfmp[7] or 0)*delta
local protrusionfactor = (tp.quad ~= 0 and 1000/tp.quad) or 0
local tc = t.characters
+ -- we can loop over (descriptions or characters), in which case
+ -- we don't need to init characters in afm/otf (saves some mem)
+ -- but then .. beware of protruding etc
+ local descriptions = tfmtable.descriptions or { }
+ t.descriptions = descriptions
+ local nameneeded = not tfmtable.shared.otfdata --hack
+-- loop over descriptions
+ -- afm and otf have descriptions, tfm not
for k,v in pairs(tfmtable.characters) do
- local description = v.description or v -- shared data
- local chr = {
- description = description,
- unicode = description.unicode,
- name = description.name,
- index = description.index or k,
- width = delta*(description.width or 0),
- height = delta*(description.height or 0),
- depth = delta*(description.depth or 0),
- class = description.class
- }
+ local description = descriptions[k] or v
+ local chr
+ -- there is no need (yet) to assign a value to chr.tonunicode
+ if nameneeded then
+ chr = {
+ name = description.name, -- is this used at all?
+ index = description.index or k,
+ width = delta*(description.width or 0),
+ height = delta*(description.height or 0),
+ depth = delta*(description.depth or 0),
+ }
+ else
+ chr = {
+ index = description.index or k,
+ width = delta*(description.width or 0),
+ height = delta*(description.height or 0),
+ depth = delta*(description.depth or 0),
+ }
+ end
if trace then
- logs.report("define font","n=%s, u=%s, i=%s, n=%s c=%s",k,description.unicode,description.index,description.name or '-',description.class or '-')
- end
- -- local vb = v.boundingbox
- -- if vb then
- -- chr.boundingbox = { vb[1]*delta, vb[2]*delta, vb[3]*delta, vb[4]*delta }
- -- else
- -- -- chr.boundingbox = zerobox -- most afm en otf files have bboxes so ..
- -- end
+ 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
local ve = v.expansion_factor
if ve then
chr.expansion_factor = ve*1000 -- expansionfactor
@@ -274,7 +276,8 @@ function tfm.do_scale(tfmtable, scaledpoints)
local ok = false
for i=1,#vc do
local key = vc[i][1]
- if key == "right" or key == "left" or key == "down" or key == "up" then
+ -- if key == "right" or key == "left" or key == "down" or key == "up" then
+ if key == "right" or key == "down" then
ok = true
break
end
@@ -284,7 +287,8 @@ function tfm.do_scale(tfmtable, scaledpoints)
for i=1,#vc do
local ivc = vc[i]
local key = ivc[1]
- if key == "right" or key == "left" or key == "down" or key == "up" then
+ -- if key == "right" or key == "left" or key == "down" or key == "up" then
+ if key == "right" or key == "down" then
tt[#tt+1] = { key, ivc[2]*delta }
else -- not comment
tt[#tt+1] = ivc -- shared since in cache and untouched
@@ -316,17 +320,22 @@ tfm.auto_cleanup = true
local lastfont = nil
-function tfm.cleanup(tfmdata) -- we need a cleanup callback, now we miss the last one
+-- we can get rid of the tfm instance when we hav efast access to the
+-- scaled character dimensions at the tex end, e.g. a fontobject.width
+
+function tfm.cleanup_table(tfmdata) -- we need a cleanup callback, now we miss the last one
if tfm.auto_cleanup then -- ok, we can hook this into everyshipout or so ... todo
- if lastfont and lastfont.type == 'virtual' then
- for k, v in pairs(lastfont.characters) do
+ if tfmdata.type == 'virtual' then
+ for k, v in pairs(tfmdata.characters) do
if v.commands then v.commands = nil end
end
end
- lastfont = type(tfmdata) == "table" and tfmdata
end
end
+function tfm.cleanup(tfmdata) -- we need a cleanup callback, now we miss the last one
+end
+
function tfm.scale(tfmtable, scaledpoints)
local t, factor = tfm.do_scale(tfmtable, scaledpoints)
t.factor = factor
@@ -357,12 +366,25 @@ function fonts.logger.save(tfmtable,source,specification) -- save file name in s
end
end
+--~ function fonts.logger.report(separator)
+--~ local s = table.sortedkeys(fonts.loaded)
+--~ if #s > 0 then
+--~ local t = { }
+--~ for _,v in ipairs(s) do
+--~ t[#t+1] = v .. ":" .. fonts.loaded[v].source
+--~ end
+--~ return table.concat(t,separator or " ")
+--~ else
+--~ return "none"
+--~ end
+--~ end
+
function fonts.logger.report(separator)
- local s = table.sortedkeys(fonts.loaded)
+ local s = table.sortedkeys(fonts.used)
if #s > 0 then
local t = { }
for _,v in ipairs(s) do
- t[#t+1] = v .. ":" .. fonts.loaded[v].source
+ t[#t+1] = v .. ":" .. fonts.used[v]
end
return table.concat(t,separator or " ")
else
@@ -461,30 +483,31 @@ do
function fonts.initializers.common.encoding(tfmdata,value)
if value then
- local encodingfile = value .. '.enc'
- local encoding = fonts.enc.load(encodingfile)
- if encoding then
- -- tfmdata.encoding = value
- local vector = encoding.vector
- local afmdata = tfmdata.shared.afmdata
- local characters = tfmdata.characters
- local unicodes = afmdata.luatex.unicodes
- local function remap(pattern,name)
- local p = pattern:match(name)
- if p then
- local oldchr, newchr = unicodes[p], unicodes[name]
- if oldchr and newchr then
- -- logs.report("encoding","%s (%s) -> %s (%s)",p,oldchr or -1,name,newchr or -1)
- characters[oldchr] = characters[newchr]
+ local afmdata = tfmdata.shared.afmdata
+ if afmdata then
+ local encodingfile = value .. '.enc'
+ local encoding = fonts.enc.load(encodingfile)
+ if encoding then
+ local vector = encoding.vector
+ local characters = tfmdata.characters
+ local unicodes = afmdata.luatex.unicodes
+ local function remap(pattern,name)
+ local p = pattern:match(name)
+ if p then
+ local oldchr, newchr = unicodes[p], unicodes[name]
+ if oldchr and newchr and type(oldchr) == "number" and type(newchr) == "number" then
+ -- logs.report("encoding","%s (%s) -> %s (%s)",p,oldchr or -1,name,newchr or -1)
+ characters[oldchr] = characters[newchr]
+ end
end
+ return p
+ end
+ for _, name in pairs(vector) do
+ local ok = remap(smallcaps,name) or remap(oldstyle,name)
+ end
+ if fonts.map.data[tfmdata.name] then
+ fonts.map.data[tfmdata.name].encoding = encodingfile
end
- return p
- end
- for _, name in pairs(vector) do
- local ok = remap(smallcaps,name) or remap(oldstyle,name)
- end
- if fonts.map.data[tfmdata.name] then
- fonts.map.data[tfmdata.name].encoding = encodingfile
end
end
end
@@ -495,17 +518,20 @@ do
function fonts.initializers.common.remap(tfmdata,value,pattern) -- will go away
if value then
local afmdata = tfmdata.shared.afmdata
- local characters = tfmdata.characters
- local unicodes = afmdata.luatex.unicodes
- local done = false
- for i, blob in pairs(characters) do
- local name = blob.description.name
- if name then
- local p = pattern:match(name)
- if p then
- local oldchr, newchr = unicodes[p], unicodes[name]
- if oldchr and newchr then
- characters[oldchr] = characters[newchr]
+ if afmdata then
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local unicodes = afmdata.luatex.unicodes
+ local done = false
+ for u, _ in pairs(characters) do
+ local name = descriptions[u].name
+ if name then
+ local p = pattern:match(name)
+ if p then
+ local oldchr, newchr = unicodes[p], unicodes[name]
+ if oldchr and newchr and type(oldchr) == "number" and type(newchr) == "number" then
+ characters[oldchr] = characters[newchr]
+ end
end
end
end
@@ -524,16 +550,19 @@ do
if value then
-- todo: scale down
local afmdata = tfmdata.shared.afmdata
- local characters = tfmdata.characters
- local unicodes = afmdata.luatex.unicodes
- for i, blob in pairs(characters) do
- local name = blob.description.name
- if name then
- local p = name:lower()
- if p then
- local oldchr, newchr = unicodes[p], unicodes[name]
- if oldchr and newchr then
- characters[oldchr] = characters[newchr]
+ if afmdata then
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local unicodes = afmdata.luatex.unicodes
+ for u, _ in pairs(characters) do
+ local name = descriptions[u].name
+ if name then
+ local p = name:lower()
+ if p then
+ local oldchr, newchr = unicodes[p], unicodes[name]
+ if oldchr and newchr and type(oldchr) == "number" and type(newchr) == "number" then
+ characters[oldchr] = characters[newchr]
+ end
end
end
end
@@ -574,13 +603,15 @@ do
-- an example analyzer
function fonts.analyzers.aux.setstate(head,font)
- local characters = fontdata[font].characters
+ local tfmdata = fontdata[font]
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
while current do
if current.id == glyph and current.font == font then
- local c = characters[current.char]
- if c then
- if c.description.class == "mark" then
+ local d = descriptions[current.char]
+ if d then
+ if d.class == "mark" then
done = true
set_attribute(current,state,5) -- mark
elseif n == 0 then
@@ -632,11 +663,12 @@ do
function fonts.pushmarks(head,font)
local tfmdata = fontdata[font]
local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
local current, last, done, n = head, nil, false, 0
while current do
if current.id == glyph and current.font == font then
- local c = characters[current.char]
- if c and c.description.class == "mark" then
+ local d = descriptions[current.char]
+ if d and d.class == "mark" then
-- check if head
if last and not last.components then
last.components = current
@@ -677,9 +709,9 @@ do
end
function fonts.removemarks(head,font)
- local current, done, characters = head, false, tfmdata.characters
+ local current, done, characters, descriptions = head, false, tfmdata.characters, tfmdata.descriptions
while current do
- if current.id == glyph and current.font == font and characters[current.char].description.class == "mark" then
+ if current.id == glyph and current.font == font and descriptions[current.char].class == "mark" then
local next, prev = current.next, current.prev
if next then
next.prev = prev
diff --git a/tex/context/base/font-uni.tex b/tex/context/base/font-uni.tex
index 5d9e7a881..7d4f3e442 100644
--- a/tex/context/base/font-uni.tex
+++ b/tex/context/base/font-uni.tex
@@ -25,29 +25,24 @@
%D is involved, which is why the macros handling those
%D characters look ahead.
-\startmessages dutch library: fonts
- 21: het is veiliger om (pdf)eTeX te gebruiken
-\stopmessages
-
-\startmessages english library: fonts
- 21: using (pdf)eTeX is more save
-\stopmessages
-
-\startmessages german library: fonts
- 21: Verwenden von (pdf)eTeX ist sicherer
-\stopmessages
-
-\startmessages italian library: fonts
- 21: l'uso di (pdf)eTeX è più sicuro
-\stopmessages
-
-\startmessages norwegian library: fonts
- 21: å bruke (pdf)eTeX er tryggere
-\stopmessages
-
-\startmessages french library: fonts
- 21: l'utilisation de (pdf)eTeX est plus économe
-\stopmessages
+% \startmessages dutch library: fonts
+% 21: het is veiliger om (pdf)eTeX te gebruiken
+% \stopmessages
+% \startmessages english library: fonts
+% 21: using (pdf)eTeX is more save
+% \stopmessages
+% \startmessages german library: fonts
+% 21: Verwenden von (pdf)eTeX ist sicherer
+% \stopmessages
+% \startmessages italian library: fonts
+% 21: l'uso di (pdf)eTeX è più sicuro
+% \stopmessages
+% \startmessages norwegian library: fonts
+% 21: å bruke (pdf)eTeX er tryggere
+% \stopmessages
+% \startmessages french library: fonts
+% 21: l'utilisation de (pdf)eTeX est plus économe
+% \stopmessages
\unprotect
@@ -390,26 +385,11 @@
%D Specific initializations can be assigned to \type
%D {commands}.
-\beginTEX
-
- \def\unicodeTEXwarning
- {\writeline\showmessage\m!fonts{21}\empty\writeline
- \global\let\unicodeTEXwarning\relax}
-
-\endTEX
-
-\beginETEX
-
- \let\unicodeTEXwarning\relax
-
-\endETEX
-
\def\defineunicodefont
{\dotripleempty\dodefineunicodefont}
\def\dodefineunicodefont[#1][#2][#3]%
- {\unicodeTEXwarning
- \doifassignmentelse{#3}
+ {\doifassignmentelse{#3}
{\setupunicodefont[#1][#3]}
{\doifelsenothing{#3}
{\setupunicodefont[#1][#3]}
diff --git a/tex/context/base/font-vf.lua b/tex/context/base/font-vf.lua
index 9ae0eca5e..37e4eeb6e 100644
--- a/tex/context/base/font-vf.lua
+++ b/tex/context/base/font-vf.lua
@@ -41,20 +41,23 @@ function vf.aux.combine.assign(g, name, from, to, start, force)
if not to then to = from end
if not start then start = from end
local fc, gc = f.characters, g.characters
- g.fonts[#g.fonts+1] = { id = id } -- no need to be sparse
- local hn = #g.fonts
+ local fd, gd = f.descriptions, g.descriptions
+ local hn = #g.fonts+1
+ g.fonts[hn] = { id = id } -- no need to be sparse
for i=from,to do
if fc[i] and (force or not gc[i]) then
- gc[i] = table.fastcopy(fc[i])
+ gc[i] = table.fastcopy(fc[i]) -- can be optimized
gc[i].commands = { { 'slot', hn, start } }
+ gd[i] = fd[i]
end
start = start + 1
end
if not g.parameters and #g.fonts > 0 then -- share this code !
- g.parameters = table.fastcopy(f.parameters)
- g.italicangle = f.italicangle
- g.ascender = f.ascender
- g.descender = f.descender
+ g.parameters = table.fastcopy(f.parameters)
+ g.italicangle = f.italicangle
+ g.ascender = f.ascender
+ g.descender = f.descender
+ g.factor = f.factor -- brrr
end
end
end
@@ -75,19 +78,22 @@ function vf.aux.combine.names(g,name,force)
local f, id = tfm.read_and_define(name,g.specification.size)
if f and id then
local fc, gc = f.characters, g.characters
+ local fd, gd = f.descriptions, g.descriptions
g.fonts[#g.fonts+1] = { id = id } -- no need to be sparse
local hn = #g.fonts
for k, v in pairs(fc) do
if force or not gc[k] then
gc[k] = table.fastcopy(v)
gc[k].commands = { { 'slot', hn, k } }
+ gd[i] = fd[i]
end
end
if not g.parameters and #g.fonts > 0 then -- share this code !
- g.parameters = table.fastcopy(f.parameters)
- g.italicangle = f.italicangle
- g.ascender = f.ascender
- g.descender = f.descender
+ g.parameters = table.fastcopy(f.parameters)
+ g.italicangle = f.italicangle
+ g.ascender = f.ascender
+ g.descender = f.descender
+ g.factor = f.factor -- brrr
end
end
end
@@ -110,6 +116,7 @@ function vf.combine(specification,tag)
type = 'virtual',
fonts = { },
characters = { },
+ descriptions = { },
specification = table.fastcopy(specification)
}
vf.aux.combine.process(g,vf.combinations[tag])
@@ -180,30 +187,31 @@ fonts.define.methods["demo-1"] = function(specification)
local capscale, digscale = 0.85, 0.75
f.name, f.type = name, 'virtual'
f.fonts = {
- {id=id},
- {name='lmsans10-regular' , size=size*capscale}, -- forced extra name
- {name='lmtypewriter10-regular', size=size*digscale} -- forced extra name
+ { id = id },
+ { name = 'lmsans10-regular' , size = size*capscale }, -- forced extra name
+ { name = 'lmtypewriter10-regular', size = size*digscale } -- forced extra name
}
- for k,v in pairs(f.characters) do
- local u = v.unicode
- if u and characters.i_is_of_category(u,'lu') then
+ local i_is_of_category = characters.i_is_of_category
+ local characters, descriptions = f.characters, f.descriptions
+ for u,v in pairs(characters) do
+ if u and i_is_of_category(u,'lu') then
v.width = capscale*v.width
v.commands = {
{'special','pdf: 1 0 0 rg'},
- {'slot',2, k},
+ {'slot',2, u},
{'special','pdf: 0 g'},
}
- elseif u and characters.i_is_of_category(u,'nd') then
- v.width = digscale*v.width
+ elseif u and i_is_of_category(u,'nd') then
+ v.width = digscale*v.width
v.commands = {
{'special','pdf: 0 0 1 rg'},
- {'slot',3,k},
+ {'slot',3,u},
{'special','pdf: 0 g'},
}
else
v.commands = {
{'special','pdf: 0 1 0 rg'},
- {'slot',1,k},
+ {'slot',1,u},
{'special','pdf: 0 g'},
}
end
diff --git a/tex/context/base/hand-ini.mkii b/tex/context/base/hand-ini.mkii
index 1936cb211..59c98fa06 100644
--- a/tex/context/base/hand-ini.mkii
+++ b/tex/context/base/hand-ini.mkii
@@ -169,17 +169,8 @@
\appendtoks \disableadjusting \to \everyforgetall % Here or not here?
\def\dododefineadjustfactor#1#2%
- {\adjustdimen#2pt\multiply\adjustdimen\plusthousand\divide\adjustdimen\maxcard\relax
- \efcode\handledfont#1\adjustdimen}
-
- \beginETEX
-
- \def\dododefineadjustfactor#1#2%
-% {\efcode\handledfont#1\dimexpr#2pt*\plusthousand/\maxcard\relax}
{\efcode\handledfont#1\dimexpr#2\onepoint*\plusthousand/\maxcard\relax}
- \endETEX
-
\def\dodoinheritadjustfactor#1#2%
{\efcode\handledfont#1\efcode\handledfont#2\relax}
@@ -251,112 +242,40 @@
\def\setprotrudingfactor#1%
{\doifvalue{\@fha@\@fha@#1\c!type}\v!hanging{\dosetprotrudingfactor{#1}}}
- \beginTEX
-
- \def\dosetprotrudingfactor#1% no \onepoint instead of pt
- {\lproddimen\csname\@fha@\@fha@#1\c!left\endcsname\s!pt
- \multiply\lproddimen\plusthousand\divide\lproddimen\maxcard\relax
- \rproddimen\csname\@fha@\@fha@#1\c!right\endcsname\s!pt
- \multiply\rproddimen\plusthousand\divide\rproddimen\maxcard\relax
- \iftracefonthandling\showprotrudingfactor{#1}\fi}
-
- \endTEX
-
- \beginETEX \dimexpr
-
\def\dosetprotrudingfactor#1% no \onepoint instead of pt
{\lproddimen\dimexpr\csname\@fha@\@fha@#1\c!left \endcsname\onepoint*\plusthousand/\maxcard\relax
\rproddimen\dimexpr\csname\@fha@\@fha@#1\c!right\endcsname\onepoint*\plusthousand/\maxcard\relax
\iftracefonthandling\showprotrudingfactor{#1}\fi}
- \endETEX
-
\def\showprotrudingfactor#1%
{\writestatus\m!handlings{[protrude]\space#1\space
\csname\@fha@\@fha@#1\c!left \endcsname\space
\csname\@fha@\@fha@#1\c!right\endcsname\space
\fontname\handledfont}}
- \beginETEX \fontcharwd
-
% division before multiplication, else overflow with "sa>5"
- \newdimen\protrudethreshold \protrudethreshold=36pt
-
- % keep this
-
- % \def\redodefineprotrudefactor#1%
- % {\ifdim\emwidth>\protrudethreshold
- % \divide\scratchdimen\emwidth
- % \multiply\scratchdimen\fontcharwd\handledfont#1\relax
- % \else
- % \multiply\scratchdimen\fontcharwd\handledfont#1\relax
- % \divide\scratchdimen\emwidth
- % \fi}
-
- % \def\dododefineprotrudefactor#1#2#3%
- % {\scratchdimen#2\lproddimen
- % \ifembasedprotruding \else
- % \redodefineprotrudefactor{#1}%
- % \fi
- % \lpcode\handledfont#1\scratchdimen
- % \scratchdimen#3\rproddimen
- % \ifembasedprotruding \else
- % \redodefineprotrudefactor{#1}%
- % \fi
- % \rpcode\handledfont#1\scratchdimen}
-
- \def\dododefineprotrudefactor#1#2#3%
- {\lpcode\handledfont#1\dimexpr#2\lproddimen
- \ifembasedprotruding \else
- \ifdim\emwidth>\protrudethreshold
- /\emwidth*\fontcharwd\handledfont#1%
- \else
- *\fontcharwd\handledfont#1/\emwidth
- \fi
- \fi
- \relax
- \rpcode\handledfont#1\dimexpr#3\rproddimen
- \ifembasedprotruding \else
- \ifdim\emwidth>\protrudethreshold
- /\emwidth*\fontcharwd\handledfont#1%
- \else
- *\fontcharwd\handledfont#1/\emwidth
- \fi
- \fi
- \relax}
-
- \endETEX
-
- \beginTEX
-
- \ifx\undefined\charbox \newbox\charbox \fi
-
- \def\protrudethreshold{36\onepoint}
+ \newdimen\protrudethreshold \protrudethreshold=36pt
- \def\redodefineprotrudefactor
- {\ifdim\emwidth>\protrudethreshold
- \divide\scratchdimen\emwidth
- \multiply\scratchdimen\wd\charbox
- \else
- \multiply\scratchdimen\wd\charbox
- \divide\scratchdimen\emwidth
- \fi}
-
- \def\dododefineprotrudefactor#1#2#3%
- {\setbox\charbox{\handledfont\char#1}% ! yet untested !
- \scratchdimen#2\lproddimen
+ \def\dododefineprotrudefactor#1#2#3%
+ {\lpcode\handledfont#1\dimexpr#2\lproddimen
\ifembasedprotruding \else
- \redodefineprotrudefactor
+ \ifdim\emwidth>\protrudethreshold
+ /\emwidth*\fontcharwd\handledfont#1%
+ \else
+ *\fontcharwd\handledfont#1/\emwidth
+ \fi
\fi
- \lpcode\handledfont#1\scratchdimen
- \scratchdimen#3\rproddimen
+ \relax
+ \rpcode\handledfont#1\dimexpr#3\rproddimen
\ifembasedprotruding \else
- \redodefineprotrudefactor
+ \ifdim\emwidth>\protrudethreshold
+ /\emwidth*\fontcharwd\handledfont#1%
+ \else
+ *\fontcharwd\handledfont#1/\emwidth
+ \fi
\fi
- \rpcode\handledfont#1\scratchdimen}
-
- \endTEX
+ \relax}
\def\dodoinheritprotrudefactor#1#2%
{\lpcode\handledfont#1\lpcode\handledfont#2\relax
@@ -475,27 +394,12 @@
\let\fonthandling\empty
-\beginTEX
-
- \def\startfonthandling[#1]%
- {\def\fonthandling{#1}%
- \expandafter\ifx\csname\@fha@\fonthandling\endcsname\relax
- \expandafter\newtoks\csname\@fha@\fonthandling\endcsname
- \fi
- \setfonttoks}
-
-\endTEX
-
-\beginETEX
-
- \def\startfonthandling[#1]%
- {\def\fonthandling{#1}%
- \ifcsname\@fha@\fonthandling\endcsname\else
- \expandafter\newtoks\csname\@fha@\fonthandling\endcsname
- \fi
- \setfonttoks}
-
-\endETEX
+\def\startfonthandling[#1]%
+ {\def\fonthandling{#1}%
+ \ifcsname\@fha@\fonthandling\endcsname\else
+ \expandafter\newtoks\csname\@fha@\fonthandling\endcsname
+ \fi
+ \setfonttoks}
\def\stopfonthandling
{\let\fonthandling\empty}
@@ -532,33 +436,6 @@
\def\doenablehandling[#1][#2]% handling / symbolic fontname
{\fastenablehandling{#1}{#2}} % for the moment the same as:
-\beginTEX
-
-\def\fastenablehandling#1#2%
- {\edef\askedfonthandling{#1}%
- \edef\filoffonthandling{#2}%
- \@EA\ifx\csname\@fha@\@fha@\@fha@\askedfonthandling\endcsname\relax
- \@EA\ifx\csname\@fha@\@fha@\askedfonthandling\endcsname\relax
- \@EAEAEA\nofastenablehandling
- \else
- \@EAEAEA\dofastenablehandling
- \fi
- \else
- \@EA\redofastenablehandling
- \fi}
-
-\def\xfastenablehandling#1%
- {\edef\askedfonthandling{#1}%
- \@EA\ifx\csname\@fha@\@fha@\askedfonthandling\endcsname
- \@EA\nofastenablehandling
- \else
- \@EA\dofastenablehandling
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\fastenablehandling#1#2% also gets #2 passed
{\edef\askedfonthandling{#1}%
\edef\filoffonthandling{#2}%
@@ -578,8 +455,6 @@
\@EA\nofastenablehandling
\fi}
-\endETEX
-
\def\redofastenablehandling
{\startdirectcharacters
\edef\fonthandling{\csname\@fha@\@fha@\@fha@\askedfonthandling\endcsname}%
@@ -600,24 +475,11 @@
\let\fonthandling\askedfonthandling
\dodoenablehandling\fonthandling}
-\beginTEX
-
-\def\dodoenablehandling#1%
- {\@EA\ifx\csname\@fha@#1\endcsname\relax\else
- \the\csname\@fha@#1\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\dodoenablehandling#1%
{\ifcsname\@fha@#1\endcsname
\the\csname\@fha@#1\endcsname
\fi}
-\endETEX
-
%D We must not use \type {\purefontname} here (was a bug)!
% not robust as long as tex reuses definitions internally
diff --git a/tex/context/base/java-ini.tex b/tex/context/base/java-ini.tex
index 30f6a8394..7dc2cfe04 100644
--- a/tex/context/base/java-ini.tex
+++ b/tex/context/base/java-ini.tex
@@ -659,8 +659,6 @@
%D The magic 500 in the next hack prevents the input stack from
%D overflowing when large scripts are sanitized.
-%\beginTEX
-
\def\dododoPSsanitizeJScode
{\ifcase\JSisTEX\ifcase\JScomment
\advance\scratchcounter \plusone
@@ -680,16 +678,6 @@
\aftergroup\sanitizedJScode
\let\next=}}
-%\endTEX
-%
-% Why is \aftergroup not doing what I expect?
-%
-% \beginETEX \aftergroup
-%
-% \let\dododoPSsanitizeJScode\relax
-%
-% \endETEX
-
%D The macro \type{\doPSsanitizeJScode} converts its argument
%D into the macro \type{\sanitizedJScode}, thereby prefixing
%D each \type{(} and \type{)} by a slash.
diff --git a/tex/context/base/l-aux.lua b/tex/context/base/l-aux.lua
index 27cf861eb..9705fb711 100644
--- a/tex/context/base/l-aux.lua
+++ b/tex/context/base/l-aux.lua
@@ -6,6 +6,9 @@
if not versions then versions = { } end versions['l-aux'] = 1.001
if not aux then aux = { } end
+local concat, format = table.concat, string.format
+local tostring, type = tostring, type
+
do
local hash = { }
@@ -22,9 +25,10 @@ do
local nobrace = 1 - (lbrace+rbrace)
local nested = lpeg.P{ lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
- local key = lpeg.C((1-equal)^1)
+ local key = lpeg.C((1-equal-comma)^1)
local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
- local pattern = ((space^0 * key * equal * value * comma^0) / set)^1
+-- local pattern = (((space+comma)^0 * (key * equal * value + key) * comma^0) / set)^1
+ local pattern = (((space+comma)^0 * (key * equal * value + key * lpeg.C(""))) / set)^1
-- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
@@ -84,7 +88,7 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
end
end
end
- return table.concat(t,separator or ",")
+ return concat(t,separator or ",")
else
return ""
end
@@ -92,12 +96,20 @@ end
function aux.array_to_string(a,separator)
if a then
- return table.concat(a,separator or ",")
+ return concat(a,separator or ",")
else
return ""
end
end
+function aux.settings_to_set(str)
+ local t = { }
+ for s in str:gmatch("%s*([^,]+)") do
+ t[s] = true
+ end
+ return t
+end
+
-- temporary here
function aux.getparameters(self,class,parentclass,settings)
@@ -137,3 +149,24 @@ local stripper = lpeg.Cs((number + 1)^0)
function aux.strip_zeros(str)
return stripper:match(str)
end
+
+function aux.definetable(target) -- defines undefined tables
+ local composed, t = nil, { }
+ for name in target:gmatch("([^%.]+)") do
+ if composed then
+ composed = composed .. "." .. name
+ else
+ composed = name
+ end
+ t[#t+1] = format("%s = %s or { }",composed,composed)
+ end
+ return concat(t,"\n")
+end
+
+function aux.accesstable(target)
+ local t = _G
+ for name in target:gmatch("([^%.]+)") do
+ t = t[name]
+ end
+ return t
+end
diff --git a/tex/context/base/l-dimen.lua b/tex/context/base/l-dimen.lua
index 33b2405a7..103cb2d88 100644
--- a/tex/context/base/l-dimen.lua
+++ b/tex/context/base/l-dimen.lua
@@ -355,6 +355,12 @@ probably use a hash instead of a one-element table.
Goodie:s
--ldx]]--
-function number.percent(n) return (n/100) * tex.hsize:todimen() end
+function number.percent(n) -- will be cleaned up once luatex 0.30 is out
+ local hsize = tex.hsize
+ if type(hsize) == "string" then
+ hsize = hsize:todimen()
+ end
+ return (n/100) * hsize
+end
number["%"] = number.percent
diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua
index c3574cc6a..0a174e18a 100644
--- a/tex/context/base/l-dir.lua
+++ b/tex/context/base/l-dir.lua
@@ -40,30 +40,6 @@ if lfs then do
dir.glob_pattern = glob_pattern
- --~ local function glob(pattern, action)
- --~ local t = { }
- --~ local path, rest, patt, recurse
- --~ local action = action or function(name) t[#t+1] = name end
- --~ local pattern = pattern:gsub("^%*%*","./**")
- --~ local pattern = pattern:gsub("/%*/","/**/")
- --~ path, rest = pattern:match("^(/)(.-)$")
- --~ if path then
- --~ path = path
- --~ else
- --~ path, rest = pattern:match("^([^/]*)/(.-)$")
- --~ end
- --~ if rest then
- --~ patt = rest:gsub("([%.%-%+])", "%%%1")
- --~ end
- --~ patt = patt:gsub("%*", "[^/]*")
- --~ patt = patt:gsub("%?", "[^/]")
- --~ patt = patt:gsub("%[%^/%]%*%[%^/%]%*", ".*")
- --~ if path == "" then path = "." end
- --~ recurse = patt:find("%.%*/") ~= nil
- --~ glob_pattern(path,patt,recurse,action)
- --~ return t
- --~ end
-
local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
local pattern = Ct {
diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua
index be7e39d20..ae4cd426a 100644
--- a/tex/context/base/l-file.lua
+++ b/tex/context/base/l-file.lua
@@ -8,6 +8,8 @@ if not versions then versions = { } end versions['l-file'] = 1.001
if not file then file = { } end
+local concat = table.concat
+
function file.removesuffix(filename)
return (filename:gsub("%.[%a%d]+$",""))
end
@@ -44,14 +46,6 @@ end
file.suffix = file.extname
---~ function file.join(...)
---~ local t = { ... }
---~ for i=1,#t do
---~ t[i] = (t[i]:gsub("\\","/")):gsub("/+$","")
---~ end
---~ return table.concat(t,"/")
---~ end
-
--~ print(file.join("x/","/y"))
--~ print(file.join("http://","/y"))
--~ print(file.join("http://a","/y"))
@@ -59,7 +53,7 @@ file.suffix = file.extname
--~ print(file.join("//nas-1","/y"))
function file.join(...)
- local pth = table.concat({...},"/")
+ local pth = concat({...},"/")
pth = pth:gsub("\\","/")
local a, b = pth:match("^(.*://)(.*)$")
if a and b then
@@ -126,7 +120,7 @@ function file.split_path(str)
end
function file.join_path(tab)
- return table.concat(tab,io.pathseparator) -- can have trailing //
+ return concat(tab,io.pathseparator) -- can have trailing //
end
function file.collapse_path(str)
diff --git a/tex/context/base/l-io.lua b/tex/context/base/l-io.lua
index 874338a08..6d773c582 100644
--- a/tex/context/base/l-io.lua
+++ b/tex/context/base/l-io.lua
@@ -16,6 +16,7 @@ function io.loaddata(filename)
local f = io.open(filename,'rb')
if f then
local data = f:read('*all')
+ -- garbagecollector.check(data)
f:close()
return data
else
diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua
index bee903549..cd61dc926 100644
--- a/tex/context/base/l-lpeg.lua
+++ b/tex/context/base/l-lpeg.lua
@@ -40,10 +40,14 @@ function lpeg.splitter(pattern, action)
return (((1-lpeg.P(pattern))^1)/action+1)^0
end
+-- variant:
+
+--~ local parser = lpeg.Ct(lpeg.splitat(newline))
+
local crlf = lpeg.P("\r\n")
local cr = lpeg.P("\r")
local lf = lpeg.P("\n")
-local space = lpeg.S(" \t\f\v")
+local space = lpeg.S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
local newline = crlf + cr + lf
local spacing = space^0 * newline
@@ -56,3 +60,29 @@ local capture = lpeg.Ct(content^0)
function string:splitlines()
return capture:match(self)
end
+
+lpeg.linebyline = content -- better make a sublibrary
+
+--~ local p = lpeg.splitat("->",false) print(p:match("oeps->what->more")) -- oeps what more
+--~ local p = lpeg.splitat("->",true) print(p:match("oeps->what->more")) -- oeps what->more
+--~ local p = lpeg.splitat("->",false) print(p:match("oeps")) -- oeps
+--~ local p = lpeg.splitat("->",true) print(p:match("oeps")) -- oeps
+
+local splitters_s, splitters_m = { }, { }
+
+function lpeg.splitat(separator,single)
+ local splitter = (single and splitters_s[separator]) or splitters_m[separator]
+ if not splitter then
+ separator = lpeg.P(separator)
+ if single then
+ local other, any = lpeg.C((1 - separator)^0), lpeg.P(1)
+ splitter = other * (separator * lpeg.C(any^0) + "")
+ splitters_s[separator] = splitter
+ else
+ local other = lpeg.C((1 - separator)^0)
+ splitter = other * (separator * other)^0
+ splitters_m[separator] = splitter
+ end
+ end
+ return splitter
+end
diff --git a/tex/context/base/l-math.lua b/tex/context/base/l-math.lua
index 24921cd0c..00b72dba5 100644
--- a/tex/context/base/l-math.lua
+++ b/tex/context/base/l-math.lua
@@ -6,15 +6,17 @@
if not versions then versions = { } end versions['l-math'] = 1.001
+local floor = math.floor
+
if not math.round then
function math.round(x)
- return math.floor(x + 0.5)
+ return floor(x + 0.5)
end
end
if not math.div then
function math.div(n,m)
- return math.floor(n/m)
+ return floor(n/m)
end
end
diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua
index ad95a8edd..90af72c87 100644
--- a/tex/context/base/l-string.lua
+++ b/tex/context/base/l-string.lua
@@ -132,7 +132,7 @@ end
--~ end end
-string.chr_to_esc = {
+local chr_to_esc = {
["%"] = "%%",
["."] = "%.",
["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
@@ -142,16 +142,18 @@ string.chr_to_esc = {
["{"] = "%{", ["}"] = "%}"
}
+string.chr_to_esc = chr_to_esc
+
function string:esc() -- variant 2
- return (self:gsub("(.)",string.chr_to_esc))
+ return (self:gsub("(.)",chr_to_esc))
end
-function string.unquote(str)
- return (str:gsub("^([\"\'])(.*)%1$","%2"))
+function string:unquote()
+ return (self:gsub("^([\"\'])(.*)%1$","%2"))
end
-function string.quote(str)
- return '"' .. str:unquote() .. '"'
+function string:quote()
+ return '"' .. self:unquote() .. '"'
end
function string:count(pattern) -- variant 3
diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua
index a72321fb7..23d4bed63 100644
--- a/tex/context/base/l-table.lua
+++ b/tex/context/base/l-table.lua
@@ -8,11 +8,15 @@ if not versions then versions = { } end versions['l-table'] = 1.001
table.join = table.concat
+local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
+local format = string.format
+local getmetatable, setmetatable = getmetatable, setmetatable
+local pairs, ipairs, type, next, tostring = pairs, ipairs, type, next, tostring
+
function table.strip(tab)
local lst = { }
- for k, v in ipairs(tab) do
- -- s = string.gsub(v, "^%s*(.-)%s*$", "%1")
- s = v:gsub("^%s*(.-)%s*$", "%1")
+ for i=1,#tab do
+ local s = tab[i]:gsub("^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
@@ -22,16 +26,7 @@ function table.strip(tab)
return lst
end
---~ function table.sortedkeys(tab)
---~ local srt = { }
---~ for key,_ in pairs(tab) do
---~ srt[#srt+1] = key
---~ end
---~ table.sort(srt)
---~ return srt
---~ end
-
-function table.sortedkeys(tab)
+local function sortedkeys(tab)
local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in pairs(tab) do
srt[#srt+1] = key
@@ -51,22 +46,34 @@ function table.sortedkeys(tab)
end
end
if kind == 0 or kind == 3 then
- table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
+ sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
else
- table.sort(srt)
+ sort(srt)
end
return srt
end
+local function sortedhashkeys(tab) -- fast one
+ local srt = { }
+ for key,_ in pairs(tab) do
+ srt[#srt+1] = key
+ end
+ sort(srt)
+ return srt
+end
+
+table.sortedkeys = sortedkeys
+table.sortedhashkeys = sortedhashkeys
+
function table.append(t, list)
for _,v in pairs(list) do
- table.insert(t,v)
+ insert(t,v)
end
end
function table.prepend(t, list)
for k,v in pairs(list) do
- table.insert(t,k,v)
+ insert(t,k,v)
end
end
@@ -113,70 +120,57 @@ function table.imerged(...)
return tmp
end
-if not table.fastcopy then do
-
- local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable
-
- local function fastcopy(old) -- fast one
- if old then
- local new = { }
- for k,v in pairs(old) do
- if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
- else
- new[k] = v
- end
- end
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+local function fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in pairs(old) do
+ if type(v) == "table" then
+ new[k] = fastcopy(v) -- was just table.copy
+ else
+ new[k] = v
end
- return new
- else
- return { }
end
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
+ return new
+ else
+ return { }
end
+end
- table.fastcopy = fastcopy
-
-end end
-
-if not table.copy then do
-
- local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable
-
- local function copy(t, tables) -- taken from lua wiki, slightly adapted
- tables = tables or { }
- local tcopy = {}
- if not tables[t] then
- tables[t] = tcopy
- end
- for i,v in pairs(t) do -- brrr, what happens with sparse indexed
- if type(i) == "table" then
- if tables[i] then
- i = tables[i]
- else
- i = copy(i, tables)
- end
- end
- if type(v) ~= "table" then
- tcopy[i] = v
- elseif tables[v] then
- tcopy[i] = tables[v]
+local function copy(t, tables) -- taken from lua wiki, slightly adapted
+ tables = tables or { }
+ local tcopy = {}
+ if not tables[t] then
+ tables[t] = tcopy
+ end
+ for i,v in pairs(t) do -- brrr, what happens with sparse indexed
+ if type(i) == "table" then
+ if tables[i] then
+ i = tables[i]
else
- tcopy[i] = copy(v, tables)
+ i = copy(i, tables)
end
end
- local mt = getmetatable(t)
- if mt then
- setmetatable(tcopy,mt)
+ if type(v) ~= "table" then
+ tcopy[i] = v
+ elseif tables[v] then
+ tcopy[i] = tables[v]
+ else
+ tcopy[i] = copy(v, tables)
end
- return tcopy
end
+ local mt = getmetatable(t)
+ if mt then
+ setmetatable(tcopy,mt)
+ end
+ return tcopy
+end
- table.copy = copy
-
-end end
+table.fastcopy = fastcopy
+table.copy = copy
-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
@@ -205,257 +199,22 @@ function table.starts_at(t)
return ipairs(t,1)(t,0)
end
---~ do
-
---~ -- one of my first exercises in lua ...
-
---~ table.serialize_functions = true
---~ table.serialize_compact = true
---~ table.serialize_inline = true
-
---~ local function key(k,noquotes)
---~ if type(k) == "number" then -- or k:find("^%d+$") then
---~ return "["..k.."]"
---~ elseif noquotes and k:find("^%a[%a%d%_]*$") then
---~ return k
---~ else
---~ return '["'..k..'"]'
---~ end
---~ end
-
---~ local function simple_table(t)
---~ if #t > 0 then
---~ local n = 0
---~ for _,v in pairs(t) do
---~ n = n + 1
---~ end
---~ if n == #t then
---~ local tt = { }
---~ for i=1,#t do
---~ local v = t[i]
---~ local tv = type(v)
---~ if tv == "number" or tv == "boolean" then
---~ tt[#tt+1] = tostring(v)
---~ elseif tv == "string" then
---~ tt[#tt+1] = ("%q"):format(v)
---~ else
---~ tt = nil
---~ break
---~ end
---~ end
---~ return tt
---~ end
---~ end
---~ return nil
---~ end
-
---~ local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed)
---~ handle = handle or print
---~ reduce = reduce or false
---~ if depth then
---~ depth = depth .. " "
---~ if indexed then
---~ handle(("%s{"):format(depth))
---~ else
---~ handle(("%s%s={"):format(depth,key(name,noquotes)))
---~ end
---~ else
---~ depth = ""
---~ local tname = type(name)
---~ if tname == "string" then
---~ if name == "return" then
---~ handle("return {")
---~ else
---~ handle(name .. "={")
---~ end
---~ elseif tname == "number" then
---~ handle("[" .. name .. "]={")
---~ elseif tname == "boolean" then
---~ if name then
---~ handle("return {")
---~ else
---~ handle("{")
---~ end
---~ else
---~ handle("t={")
---~ end
---~ end
---~ if root and next(root) then
---~ local compact = table.serialize_compact
---~ local inline = compact and table.serialize_inline
---~ local first, last = nil, 0 -- #root cannot be trusted here
---~ if compact then
---~ for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
---~ if not first then first = k end
---~ last = last + 1
---~ end
---~ end
---~ for _,k in pairs(table.sortedkeys(root)) do
---~ local v = root[k]
---~ local t = type(v)
---~ if compact and first and type(k) == "number" and k >= first and k <= last then
---~ if t == "number" then
---~ handle(("%s %s,"):format(depth,v))
---~ elseif t == "string" then
---~ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
---~ handle(("%s %s,"):format(depth,v))
---~ else
---~ handle(("%s %q,"):format(depth,v))
---~ end
---~ elseif t == "table" then
---~ if not next(v) then
---~ handle(("%s {},"):format(depth))
---~ elseif inline then
---~ local st = simple_table(v)
---~ if st then
---~ handle(("%s { %s },"):format(depth,table.concat(st,", ")))
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
---~ end
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
---~ end
---~ elseif t == "boolean" then
---~ handle(("%s %s,"):format(depth,tostring(v)))
---~ elseif t == "function" then
---~ if table.serialize_functions then
---~ handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
---~ else
---~ handle(('%s "function",'):format(depth))
---~ end
---~ else
---~ handle(("%s %q,"):format(depth,tostring(v)))
---~ end
---~ elseif k == "__p__" then -- parent
---~ if false then
---~ handle(("%s __p__=nil,"):format(depth))
---~ end
---~ elseif t == "number" then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),v))
---~ elseif t == "string" then
---~ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),v))
---~ else
---~ handle(("%s %s=%q,"):format(depth,key(k,noquotes),v))
---~ end
---~ elseif t == "table" then
---~ if not next(v) then
---~ handle(("%s %s={},"):format(depth,key(k,noquotes)))
---~ elseif inline then
---~ local st = simple_table(v)
---~ if st then
---~ handle(("%s %s={ %s },"):format(depth,key(k,noquotes),table.concat(st,", ")))
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes)
---~ end
---~ else
---~ serialize(v,k,handle,depth,level+1,reduce,noquotes)
---~ end
---~ elseif t == "boolean" then
---~ handle(("%s %s=%s,"):format(depth,key(k,noquotes),tostring(v)))
---~ elseif t == "function" then
---~ if table.serialize_functions then
---~ handle(('%s %s=loadstring(%q),'):format(depth,key(k,noquotes),string.dump(v)))
---~ else
---~ handle(('%s %s="function",'):format(depth,key(k,noquotes)))
---~ end
---~ else
---~ handle(("%s %s=%q,"):format(depth,key(k,noquotes),tostring(v)))
---~ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k,noquotes),string.dump(function() return v end)))
---~ end
---~ end
---~ if level > 0 then
---~ handle(("%s},"):format(depth))
---~ else
---~ handle(("%s}"):format(depth))
---~ end
---~ else
---~ handle(("%s}"):format(depth))
---~ end
---~ end
-
---~ --~ name:
---~ --~
---~ --~ true : return { }
---~ --~ false : { }
---~ --~ nil : t = { }
---~ --~ string : string = { }
---~ --~ 'return' : return { }
---~ --~ number : [number] = { }
-
---~ function table.serialize(root,name,reduce,noquotes)
---~ local t = { }
---~ local function flush(s)
---~ t[#t+1] = s
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ return table.concat(t,"\n")
---~ end
-
---~ function table.tohandle(handle,root,name,reduce,noquotes)
---~ serialize(root, name, handle, nil, 0, reduce, noquotes)
---~ end
-
---~ -- sometimes tables are real use (zapfino extra pro is some 85M) in which
---~ -- case a stepwise serialization is nice; actually, we could consider:
---~ --
---~ -- for line in table.serializer(root,name,reduce,noquotes) do
---~ -- ...(line)
---~ -- end
---~ --
---~ -- so this is on the todo list
-
---~ table.tofile_maxtab = 2*1024
-
---~ function table.tofile(filename,root,name,reduce,noquotes)
---~ local f = io.open(filename,'w')
---~ if f then
---~ local concat = table.concat
---~ local maxtab = table.tofile_maxtab
---~ if maxtab > 1 then
---~ local t = { }
---~ local function flush(s)
---~ t[#t+1] = s
---~ if #t > maxtab then
---~ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
---~ t = { }
---~ end
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ f:write(concat(t,"\n"),"\n")
---~ else
---~ local function flush(s)
---~ f:write(s,"\n")
---~ end
---~ serialize(root, name, flush, nil, 0, reduce, noquotes)
---~ end
---~ f:close()
---~ end
---~ end
-
---~ end
+function table.tohash(t,value)
+ local h = { }
+ if value == nil then value = true end
+ for _, v in pairs(t) do -- no ipairs here
+ h[v] = value
+ end
+ return h
+end
---~ t = {
---~ b = "123",
---~ a = "x",
---~ c = 1.23,
---~ d = "1.23",
---~ e = true,
---~ f = {
---~ d = "1.23",
---~ a = "x",
---~ b = "123",
---~ c = 1.23,
---~ e = true,
---~ f = {
---~ e = true,
---~ f = {
---~ e = true
---~ },
---~ },
---~ },
---~ g = function() end
---~ }
+function table.fromhash(t)
+ local h = { }
+ for k, v in pairs(t) do -- no ipairs here
+ if v then h[#h+1] = k end
+ end
+ return h
+end
--~ print(table.serialize(t), "\n")
--~ print(table.serialize(t,"name"), "\n")
@@ -464,320 +223,342 @@ end
--~ print(table.serialize(t,"name",true), "\n")
--~ print(table.serialize(t,"name",true,true), "\n")
-do
+table.serialize_functions = true
+table.serialize_compact = true
+table.serialize_inline = true
- table.serialize_functions = true
- table.serialize_compact = true
- table.serialize_inline = true
+local noquotes, hexify, handle, reduce, compact, inline, functions
- local sortedkeys = table.sortedkeys
- local format, concat = string.format, table.concat
- local noquotes, hexify, handle, reduce, compact, inline, functions
- local pairs, ipairs, type, next, tostring = pairs, ipairs, type, next, tostring
+local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+ 'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
+ 'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
+}
- local function key(k)
- if type(k) == "number" then -- or k:find("^%d+$") then
- if hexify then
- return ("[0x%04X]"):format(k)
- else
- return "["..k.."]"
- end
- elseif noquotes and k:find("^%a[%a%d%_]*$") then
- return k
+local function key(k)
+ if type(k) == "number" then -- or k:find("^%d+$") then
+ if hexify then
+ return ("[0x%04X]"):format(k)
else
- return '["'..k..'"]'
+ return "["..k.."]"
end
+ elseif noquotes and not reserved[k] and k:find("^%a[%a%d%_]*$") then
+ return k
+ else
+ return '["'..k..'"]'
end
+end
- local function simple_table(t)
- if #t > 0 then
- local n = 0
- for _,v in pairs(t) do
- n = n + 1
- end
- if n == #t then
- local tt = { }
- for i=1,#t do
- local v = t[i]
- local tv = type(v)
- if tv == "number" then
- if hexify then
- tt[#tt+1] = ("0x%04X"):format(v)
- else
- tt[#tt+1] = tostring(v)
- end
- elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
- elseif tv == "string" then
- tt[#tt+1] = ("%q"):format(v)
+local function simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in pairs(t) do
+ n = n + 1
+ end
+ if n == #t then
+ local tt = { }
+ for i=1,#t do
+ local v = t[i]
+ local tv = type(v)
+ if tv == "number" then
+ if hexify then
+ tt[#tt+1] = ("0x%04X"):format(v)
else
- tt = nil
- break
+ tt[#tt+1] = tostring(v)
end
+ elseif tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = ("%q"):format(v)
+ else
+ tt = nil
+ break
end
- return tt
end
+ return tt
end
- return nil
end
+ return nil
+end
- local function do_serialize(root,name,depth,level,indexed)
- if level > 0 then
- depth = depth .. " "
- if indexed then
- handle(("%s{"):format(depth))
- elseif name then
- handle(("%s%s={"):format(depth,key(name)))
- else
- handle(("%s{"):format(depth))
- end
+local function do_serialize(root,name,depth,level,indexed)
+ if level > 0 then
+ depth = depth .. " "
+ if indexed then
+ handle(("%s{"):format(depth))
+ elseif name then
+ handle(("%s%s={"):format(depth,key(name)))
+ else
+ handle(("%s{"):format(depth))
end
- if root and next(root) then
- local first, last = nil, 0 -- #root cannot be trusted here
- if compact then
- for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
- if not first then first = k end
- last = last + 1
- end
+ end
+ if root and next(root) then
+ local first, last = nil, 0 -- #root cannot be trusted here
+ if compact then
+ for k,v in ipairs(root) do -- NOT: for k=1,#root do (we need to quit at nil)
+ if not first then first = k end
+ last = last + 1
end
- --~ for _,k in pairs(sortedkeys(root)) do -- 1% faster:
- local sk = sortedkeys(root)
- for i=1,#sk do
- local k = sk[i]
- local v = root[k]
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
- if t == "number" then
- if hexify then
- handle(("%s 0x%04X,"):format(depth,v))
- else
- handle(("%s %s,"):format(depth,v))
- end
- elseif t == "string" then
- if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
- handle(("%s %s,"):format(depth,v))
- else
- handle(("%s %q,"):format(depth,v))
- end
- elseif t == "table" then
- if not next(v) then
- handle(("%s {},"):format(depth))
- elseif inline then
- local st = simple_table(v)
- if st then
- handle(("%s { %s },"):format(depth,concat(st,", ")))
- else
- do_serialize(v,k,depth,level+1,true)
- end
- else
- do_serialize(v,k,depth,level+1,true)
- end
- elseif t == "boolean" then
- handle(("%s %s,"):format(depth,tostring(v)))
- elseif t == "function" then
- if functions then
- handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
- else
- handle(('%s "function",'):format(depth))
- end
- else
- handle(("%s %q,"):format(depth,tostring(v)))
- end
- elseif k == "__p__" then -- parent
- if false then
- handle(("%s __p__=nil,"):format(depth))
- end
- elseif t == "number" then
+ end
+ local sk = sortedkeys(root)
+ for i=1,#sk do
+ local k = sk[i]
+ local v = root[k]
+--~ if v == root then
+ -- circular
+--~ else
+ local t = type(v)
+ if compact and first and type(k) == "number" and k >= first and k <= last then
+ if t == "number" then
if hexify then
- handle(("%s %s=0x%04X,"):format(depth,key(k),v))
+ handle(("%s 0x%04X,"):format(depth,v))
else
- handle(("%s %s=%s,"):format(depth,key(k),v))
+ handle(("%s %s,"):format(depth,v))
end
elseif t == "string" then
if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
- handle(("%s %s=%s,"):format(depth,key(k),v))
+ handle(("%s %s,"):format(depth,v))
else
- handle(("%s %s=%q,"):format(depth,key(k),v))
+ handle(("%s %q,"):format(depth,v))
end
elseif t == "table" then
if not next(v) then
- handle(("%s %s={},"):format(depth,key(k)))
+ handle(("%s {},"):format(depth))
elseif inline then
local st = simple_table(v)
if st then
- handle(("%s %s={ %s },"):format(depth,key(k),concat(st,", ")))
+ handle(("%s { %s },"):format(depth,concat(st,", ")))
else
- do_serialize(v,k,depth,level+1)
+ do_serialize(v,k,depth,level+1,true)
end
else
- do_serialize(v,k,depth,level+1)
+ do_serialize(v,k,depth,level+1,true)
end
elseif t == "boolean" then
- handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ handle(("%s %s,"):format(depth,tostring(v)))
elseif t == "function" then
if functions then
- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v)))
+ handle(('%s loadstring(%q),'):format(depth,v:dump()))
else
- handle(('%s %s="function",'):format(depth,key(k)))
+ handle(('%s "function",'):format(depth))
end
else
- handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
- -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
+ handle(("%s %q,"):format(depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(("%s __p__=nil,"):format(depth))
+ end
+ elseif t == "number" then
+ if hexify then
+ handle(("%s %s=0x%04X,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%s,"):format(depth,key(k),v))
end
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s %s={},"):format(depth,key(k)))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s %s={ %s },"):format(depth,key(k),concat(st,", ")))
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ elseif t == "function" then
+ if functions then
+ handle(('%s %s=loadstring(%q),'):format(depth,key(k),v:dump()))
+ else
+ handle(('%s %s="function",'):format(depth,key(k)))
+ end
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
+ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
end
+--~ end
end
- if level > 0 then
- handle(("%s},"):format(depth))
- end
end
+ if level > 0 then
+ handle(("%s},"):format(depth))
+ end
+end
- local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
- local tname = type(name)
- if tname == "string" then
- if name == "return" then
- handle("return {")
- else
- handle(name .. "={")
- end
- elseif tname == "number" then
- if hexify then
- handle(format("[0x%04X]={",name))
- else
- handle("[" .. name .. "]={")
- end
- elseif tname == "boolean" then
- if name then
- handle("return {")
- else
- handle("{")
- end
+local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
+ noquotes = _noquotes
+ hexify = _hexify
+ handle = _handle or print
+ reduce = _reduce or false
+ compact = table.serialize_compact
+ inline = compact and table.serialize_inline
+ functions = table.serialize_functions
+ local tname = type(name)
+ if tname == "string" then
+ if name == "return" then
+ handle("return {")
else
- handle("t={")
- end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ handle(name .. "={")
end
- handle("}")
- end
-
- --~ name:
- --~
- --~ true : return { }
- --~ false : { }
- --~ nil : t = { }
- --~ string : string = { }
- --~ 'return' : return { }
- --~ number : [number] = { }
-
- function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
- local function flush(s)
- t[#t+1] = s
+ elseif tname == "number" then
+ if hexify then
+ handle(("[0x%04X]={"):format(name))
+ else
+ handle("[" .. name .. "]={")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
- return concat(t,"\n")
- end
-
- function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
- end
-
- -- sometimes tables are real use (zapfino extra pro is some 85M) in which
- -- case a stepwise serialization is nice; actually, we could consider:
- --
- -- for line in table.serializer(root,name,reduce,noquotes) do
- -- ...(line)
- -- end
- --
- -- so this is on the todo list
-
- table.tofile_maxtab = 2*1024
-
- function table.tofile(filename,root,name,reduce,noquotes,hexify)
- local f = io.open(filename,'w')
- if f then
- local maxtab = table.tofile_maxtab
- if maxtab > 1 then
- local t = { }
- local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
- f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
- end
- end
- serialize(root,name,flush,reduce,noquotes,hexify)
- f:write(concat(t,"\n"),"\n")
- else
- local function flush(s)
- f:write(s,"\n")
- end
- serialize(root,name,flush,reduce,noquotes,hexify)
- end
- f:close()
+ elseif tname == "boolean" then
+ if name then
+ handle("return {")
+ else
+ handle("{")
end
+ else
+ handle("t={")
end
+ if root and next(root) then
+ do_serialize(root,name,"",0,indexed)
+ end
+ handle("}")
+end
+--~ name:
+--~
+--~ true : return { }
+--~ false : { }
+--~ nil : t = { }
+--~ string : string = { }
+--~ 'return' : return { }
+--~ number : [number] = { }
+
+function table.serialize(root,name,reduce,noquotes,hexify)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ end
+ serialize(root,name,flush,reduce,noquotes,hexify)
+ return concat(t,"\n")
end
-do
+function table.tohandle(handle,root,name,reduce,noquotes,hexify)
+ serialize(root,name,handle,reduce,noquotes,hexify)
+end
- local function flatten(t,f,complete)
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
- else
- f[#f+1] = v
+-- sometimes tables are real use (zapfino extra pro is some 85M) in which
+-- case a stepwise serialization is nice; actually, we could consider:
+--
+-- for line in table.serializer(root,name,reduce,noquotes) do
+-- ...(line)
+-- end
+--
+-- so this is on the todo list
+
+table.tofile_maxtab = 2*1024
+
+function table.tofile(filename,root,name,reduce,noquotes,hexify)
+ local f = io.open(filename,'w')
+ if f then
+ local maxtab = table.tofile_maxtab
+ if maxtab > 1 then
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ if #t > maxtab then
+ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
+ t = { }
end
+ end
+ serialize(root,name,flush,reduce,noquotes,hexify)
+ f:write(concat(t,"\n"),"\n")
+ else
+ local function flush(s)
+ f:write(s,"\n")
+ end
+ serialize(root,name,flush,reduce,noquotes,hexify)
+ end
+ f:close()
+ end
+end
+
+local function flatten(t,f,complete)
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if complete or type(v[1]) == "table" then
+ flatten(v,f,complete)
else
f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
end
+end
- function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
- end
+function table.flatten(t)
+ local f = { }
+ flatten(t,f,true)
+ return f
+end
- function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
- end
+function table.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+end
+
+table.flatten_one_level = table.unnest
- table.flatten_one_level = table.unnest
+-- the next three may disappear
+function table.remove_value(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
end
function table.insert_before_value(t,value,str)
- for i=1,#t do
- if t[i] == value then
- table.insert(t,i,str)
- return
+ if str then
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,str)
+ return
+ end
+ end
end
+ insert(t,1,str)
+ elseif value then
+ insert(t,1,value)
end
- table.insert(t,1,str)
end
function table.insert_after_value(t,value,str)
- for i=1,#t do
- if t[i] == value then
- table.insert(t,i+1,str)
- return
+ if str then
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,str)
+ return
+ end
+ end
end
+ t[#t+1] = str
+ elseif value then
+ t[#t+1] = value
end
- t[#t+1] = str
end
function table.are_equal(a,b,n,m)
@@ -808,28 +589,11 @@ function table.compact(t)
end
end
-function table.tohash(t,value)
- local h = { }
- if value == nil then value = true end
- for _, v in pairs(t) do -- no ipairs here
- h[v] = value
- end
- return h
-end
-
-function table.fromhash(t)
- local h = { }
- for k, v in pairs(t) do -- no ipairs here
- if v then h[#h+1] = k end
- end
- return h
-end
-
function table.contains(t, v)
if t then
for i=1, #t do
if t[i] == v then
- return true
+ return i
end
end
end
@@ -866,11 +630,10 @@ function table.clone(t,p) -- t is optional or nil or table
return t
end
-
function table.hexed(t,seperator)
local tt = { }
- for i=1,#t do tt[i] = string.format("0x%04X",t[i]) end
- return table.concat(tt,seperator or " ")
+ for i=1,#t do tt[i] = ("0x%04X"):format(t[i]) end
+ return concat(tt,seperator or " ")
end
function table.reverse_hash(h)
diff --git a/tex/context/base/l-unicode.lua b/tex/context/base/l-unicode.lua
index 236d3711e..ebd67db1c 100644
--- a/tex/context/base/l-unicode.lua
+++ b/tex/context/base/l-unicode.lua
@@ -7,12 +7,8 @@
if not versions then versions = { } end versions['l-unicode'] = 1.001
if not unicode then unicode = { } end
-if not garbagecollector then
- garbagecollector = {
- push = function() collectgarbage("stop") end,
- pop = function() collectgarbage("restart") end,
- }
-end
+local concat, utfchar, utfgsub = table.concat, unicode.utf8.char, unicode.utf8.gsub
+local char, byte = string.char, string.byte
-- 0 EF BB BF UTF-8
-- 1 FF FE UTF-16-little-endian
@@ -53,24 +49,21 @@ function unicode.utftype(f) -- \000 fails !
end
function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
---~ garbagecollector.push()
- local result = { }
- local tc, uc = table.concat, unicode.utf8.char
- local tmp, n, m, p = { }, 0, 0, 0
+ local result, tmp, n, m, p = { }, { }, 0, 0, 0
-- lf | cr | crlf / (cr:13, lf:10)
local function doit()
if n == 10 then
if p ~= 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp)
tmp = { }
p = 0
end
elseif n == 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp)
tmp = { }
p = n
else
- tmp[#tmp+1] = uc(n)
+ tmp[#tmp+1] = utfchar(n)
p = 0
end
end
@@ -93,31 +86,28 @@ function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
end
end
if #tmp > 0 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp)
end
---~ garbagecollector.pop()
return result
end
function unicode.utf32_to_utf8(str, endian)
---~ garbagecollector.push()
local result = { }
- local tc, uc = table.concat, unicode.utf8.char
local tmp, n, m, p = { }, 0, -1, 0
-- lf | cr | crlf / (cr:13, lf:10)
local function doit()
if n == 10 then
if p ~= 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp)
tmp = { }
p = 0
end
elseif n == 13 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp)
tmp = { }
p = n
else
- tmp[#tmp+1] = uc(n)
+ tmp[#tmp+1] = utfchar(n)
p = 0
end
end
@@ -143,16 +133,15 @@ function unicode.utf32_to_utf8(str, endian)
end
end
if #tmp > 0 then
- result[#result+1] = tc(tmp,"")
+ result[#result+1] = concat(tmp)
end
---~ garbagecollector.pop()
return result
end
function unicode.utf8_to_utf16(str,littleendian)
if littleendian then
- return char(255,254) .. utf.gsub(str,".",function(c)
- local b = byte(c)
+ return char(255,254) .. utfgsub(str,".",function(c)
+ local b = byte(c) -- b = c:byte()
if b < 0x10000 then
return char(b%256,b/256)
else
@@ -162,7 +151,7 @@ function unicode.utf8_to_utf16(str,littleendian)
end
end)
else
- return char(254,255) .. utf.gsub(str,".",function(c)
+ return char(254,255) .. utfgsub(str,".",function(c)
local b = byte(c)
if b < 0x10000 then
return char(b/256,b%256)
diff --git a/tex/context/base/l-utils.lua b/tex/context/base/l-utils.lua
index 773bc74e1..fa8e31ba8 100644
--- a/tex/context/base/l-utils.lua
+++ b/tex/context/base/l-utils.lua
@@ -35,8 +35,11 @@ utils.merger.strip_comment = true
function utils.merger._self_load_(name)
local f, data = io.open(name), ""
if f then
+ utils.report("reading merge from %s",name)
data = f:read("*all")
f:close()
+ else
+ utils.report("unknown file to merge %s",name)
end
if data and utils.merger.strip_comment then
-- saves some 20K
@@ -49,6 +52,7 @@ function utils.merger._self_save_(name, data)
if data ~= "" then
local f = io.open(name,'w')
if f then
+ utils.report("saving merge from %s",name)
f:write(data)
f:close()
end
@@ -74,13 +78,13 @@ function utils.merger._self_libs_(libs,list)
local name = string.gsub(pth .. "/" .. lib,"\\","/")
f = io.open(name)
if f then
- -- utils.report("merging library",name)
+ utils.report("merging library %s",name)
result[#result+1] = f:read("*all")
f:close()
list = { pth } -- speed up the search
break
else
- -- utils.report("no library",name)
+ utils.report("no library %s",name)
end
end
end
diff --git a/tex/context/base/l-xml-edu.lua b/tex/context/base/l-xml-edu.lua
deleted file mode 100644
index 5aba46043..000000000
--- a/tex/context/base/l-xml-edu.lua
+++ /dev/null
@@ -1,381 +0,0 @@
-if not modules then modules = { } end modules ['l-xml-edu'] = {
- version = 1.001,
- comment = "this module is the basis for the lxml-* ones",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[ldx--
-This module contains older code thatwe keep around for educational
-purposes. Here you find the find based xml and lpath parsers.
---ldx]]--
-
-if false then
-
- do
-
- -- Loading 12 cont-*.xml and keys-*.xml files totaling to 2.62 MBytes takes 1.1 sec
- -- on a windows vista laptop with dual core 7600 (2.3 Ghz), which is not that bad.
- -- Of this half time is spent on doctype etc parsing.
-
- local doctype_patterns = {
- "",
- "",
- "",
- "",
- "",
- ""
- }
-
- -- We assume no "<" which is the lunatic part of the xml spec
- -- especially since ">" is permitted; otherwise we need a char
- -- by char parser ... more something for later ... normally
- -- entities will be used anyway.
-
- -- data = data:gsub(nothing done) is still a copy so we find first
-
- local function prepare(data,text)
- -- pack (for backward compatibility)
- if type(data) == "table" then
- data = table.concat(data,"")
- end
- -- CDATA
- if data:find("", function(txt)
- text[#text+1] = txt or ""
- return string.format("<@cd@>%s@cd@>",#text)
- end)
- end
- -- DOCTYPE
- if data:find("%s@dt@>",#text)
- end)
- end
- end
- return a .. b
- end,1)
- end
- -- comment / does not catch doctype
- if data:find("", function(txt)
- text[#text+1] = txt or ""
- return string.format("<@cm@>%s@cm@>",#text)
- end)
- end
- -- processing instructions / altijd 1
- if data:find("<%?") then
- data = data:gsub("<%?(.-)%?>", function(txt)
- text[#text+1] = txt or ""
- return string.format("<@pi@>%s@pi@>",#text)
- end)
- end
- return data, text
- end
-
- -- maybe we will move the @tg@ stuff to a dedicated key, say 'st'; this will speed up
- -- serializing and testing
-
- function xml.convert(data,no_root,collapse)
- local crap = { }
- data, crap = prepare(data, crap)
- local nsremap = xml.xmlns
- local remove = table.remove
- local stack, top = {}, {}
- local i, j, errorstr = 1, 1, nil
- stack[#stack+1] = top
- top.dt = { }
- local dt = top.dt
- local mt = { __tostring = xml.text }
- local xmlns = { }
- while true do
- local ni, first, attributes, last, fulltag, resolved
- ni, j, first, fulltag, attributes, last = data:find("<(/-)([^%s>/]+)%s*([^>]-)%s*(/-)>", j)
- if not ni then break end
- local namespace, tag = fulltag:match("^(.-):(.+)$")
- if attributes ~= "" then
- local t = {}
- for ns, tag, _, value in attributes:gmatch("(.-):?(.+)=([\"\'])(.-)%3") do -- . was %w
- if tag == "xmlns" then -- not ok yet
- xmlns[#xmlns+1] = xml.resolvens(value)
- t[tag] = value
- elseif ns == "xmlns" then
- xml.checkns(tag,value)
- t["xmlns:" .. tag] = value
- else
- t[tag] = value
- end
- end
- attributes = t
- else
- attributes = { }
- end
- if namespace then -- realtime remapping
- resolved = nsremap[namespace] or namespace
- else
- namespace, tag = "", fulltag
- resolved = xmlns[#xmlns]
- end
- local text = data:sub(i, ni-1)
- if text == "" or (collapse and text:find("^%s*$")) then
- -- no need for empty text nodes, beware, also packs x y z
- -- so is not that useful unless used with empty elements
- else
- dt[#dt+1] = text
- end
- if first == "/" then
- -- end tag
- local toclose = remove(stack) -- remove top
- top = stack[#stack]
- if #stack < 1 then
- errorstr = string.format("nothing to close with %s", tag)
- break
- elseif toclose.tg ~= tag then -- no namespace check
- errorstr = string.format("unable to close %s with %s", toclose.tg, tag)
- break
- end
- if tag:find("^@..@$") then
- dt[1] = crap[tonumber(dt[1])] or ""
- end
- dt = top.dt
- dt[#dt+1] = toclose
- if attributes.xmlns then
- remove(xmlns) -- ?
- end
- elseif last == "/" then
- -- empty element tag
- dt[#dt+1] = { ns = namespace, rn = resolved, tg = tag, dt = { }, at = attributes, __p__ = top }
- setmetatable(top, mt)
- else
- -- begin tag
- top = { ns = namespace, rn = resolved, tg = tag, dt = { }, at = attributes, __p__ = stack[#stack] }
- setmetatable(top, mt)
- dt = top.dt
- stack[#stack+1] = top
- end
- i = j + 1
- end
- if not errorstr then
- local text = data:sub(i)
- if dt and not text:find("^%s*$") then
- dt[#dt+1] = text
- end
- if #stack > 1 then
- errorstr = string.format("unclosed %s", stack[#stack].tg)
- end
- end
- if errorstr then
- stack = { { tg = "error", dt = { errorstr } } }
- setmetatable(stack, mt)
- end
- if no_root then
- return stack[1]
- else
- local t = { ns = "", tg = '@rt@', dt = stack[1].dt }
- setmetatable(t, mt)
- for k,v in ipairs(t.dt) do
- if type(v) == "table" and v.tg ~= "@pi@" and v.tg ~= "@dt@" and v.tg ~= "@cm@" then
- t.ri = k -- rootindex
- break
- end
- end
- return t
- end
- end
-
- end
-
- --~ Y a/b
- --~ Y /a/b
- --~ Y a/*/b
- --~ Y a//b
- --~ Y child::
- --~ Y .//
- --~ Y ..
- --~ N id("tag")
- --~ Y parent::
- --~ Y child::
- --~ N preceding-sibling:: (same name)
- --~ N following-sibling:: (same name)
- --~ N preceding-sibling-of-self:: (same name)
- --~ N following-sibling-or-self:: (same name)
- --~ N ancestor::
- --~ N descendent::
- --~ N preceding::
- --~ N following::
- --~ N self::node()
- --~ N node() == alles
- --~ N a[position()=5]
- --~ Y a[5]
- --~ Y a[-5]
- --~ N a[first()]
- --~ N a[last()]
- --~ Y a/(b|c|d)/e/f
- --~ Y a/!(b|c|d)/e/f
- --~ N (c/d|e)
- --~ Y a/b[@bla]
- --~ Y a/b[@bla='oeps']
- --~ Y a/b[@bla=='oeps']
- --~ Y a/b[@bla<>'oeps']
- --~ Y a/b[@bla!='oeps']
- --~ Y a/b/@bla
- --~ Y a['string']
- --~ Y ^/a/c (root)
- --~ Y ^^/a/c (docroot)
- --~ Y root::a/c (docroot)
- --~ no wild card functions (yet)
- --~ s = "/a//b/*/(c|d|e)/(f|g)/h[4]/h/child::i/j/(a/b)/p[-1]/q[4]/ancestor::q/r/../s/./t[@bla='true']/k"
- -- // == /**/
- -- / = ^ (root)
-
- do
-
- function analyze(str)
- if not str then
- return ""
- else
- local tmp, result, map, key = { }, { }, { }, str
- str = str:gsub("(%b[])", function(s) tmp[#tmp+1] = s return '[['..#tmp..']]' end)
- str = str:gsub("(%b())", function(s) tmp[#tmp+1] = s return '[['..#tmp..']]' end)
- str = str:gsub("(%^+)([^/])", "%1/%2")
- str = str:gsub("//+", "/**/")
- str = str:gsub(".*root::", "^/")
- str = str:gsub("child::", "")
- str = str:gsub("parent::", "../")
- str = str:gsub("self::", "./")
- str = str:gsub("^/", "^/")
- for s in str:gmatch("([^/]+)") do
- s = s:gsub("%[%[(%d+)%]%]",function(n) return tmp[tonumber(n)] end)
- result[#result+1] = s
- end
- return result
- end
- end
-
- function compose(result)
- if not result or #result == 0 then
- -- wildcard
- return true
- elseif #result == 1 then
- local r = result[1][1]
- if r == "14" or r == "15" then
- -- wildcard
- return true
- elseif r == "12" then
- -- root
- return false
- end
- end
- local map = { }
- for r=1,#result do
- local ri = result[r]
- if ri == "." then
- -- skip
- elseif ri == ".." then
- map[#map+1] = { 11 }
- elseif ri == "^" then
- map[#map+1] = { 12 }
- elseif ri == "^^" then
- map[#map+1] = { 13 }
- elseif ri == "*" then
- map[#map+1] = { 14 }
- elseif ri == "**" then
- map[#map+1] = { 15 }
- else
- local negate, m = ri:match("^(!*)%((.*)%)$") -- (a|b|c)
- if m or ri:find('|') then
- m = m or ri
- if m:find("[%[%]%(%)/]") then -- []()/
- -- error
- else
- local t = { (negate and #negate>0 and 25) or 21 }
- for s in m:gmatch("([^|]+)") do
- local ns, tg = s:match("^(.-):?([^:]+)$")
- if ns == "*" then ns = true end
- t[#t+1] = ns
- t[#t+1] = tg
- end
- map[#map+1] = t
- end
- else
- local s, f = ri:match("^(.-)%[%s*(.+)%s*%]$") --aaa[bbb]
- if s and f then
- local ns, tg = s:match("^(.-):?([^:]+)$")
- local at, op, vl = f:match("^@(.-)([!=<>]?)([^!=<>]+)$") -- [@a=='b']
- if ns == "*" then ns = true end
- if vl then
- if op and op ~= "" then
- if op == '=' or op == '==' then
- map[#map+1] = { 22, ns, tg, at, (vl:gsub("^([\'\"])(.*)%1$","%2")) }
- elseif op == '<>' or op == '!=' then
- map[#map+1] = { 23, ns, tg, at, (vl:gsub("^([\'\"])(.*)%1$","%2")) }
- else
- -- error
- end
- elseif vl ~= "" then -- [@whatever]
- map[#map+1] = { 26, ns, tg, vl }
- else
- -- error
- end
- -- elseif f:find("^([%-%+%d]+)$") then -- [123]
- elseif f:find("^([-+%d]+)$") then -- [123]
- map[#map+1] = { 30, ns, tg, tonumber(f) }
- else -- [whatever]
- map[#map+1] = { 27, ns, tg, (f:gsub("^([\'\"])(.*)%1$","%2")) }
- end
- else
- local pi = ri:match("^pi::(.-)$")
- if pi then
- map[#map+1] = { 40, pi }
- else
- local negate, ns, tg = ri:match("^(!-)(.-):?([^:]+)$")
- map[#map+1] = { (negate and #negate>0 and 24) or 20, ns, tg }
- end
- end
- end
- end
- end
- -- if we have a symbol, we can prepend that to the string, which is faster
- local mm = map[1] or { }
- local r = mm[1] or 0
- if #map == 1 then
- if r == 14 or r == 15 then
- -- wildcard
- return true
- elseif r == 12 then
- -- root
- return false
- end
- end
- if r ~= 11 and r ~= 12 and r ~= 13 and r ~= 14 and r ~= 15 then
- table.insert(map, 1, { 16 })
- end
- return map
- end
-
- cache = { }
-
- function xml.lpath(pattern)
- if type(pattern) == "string" then
- local result = cache[pattern]
- if not result then
- result = compose(analyze(pattern))
- cache[pattern] = result
- end
- if xml.trace_lpath then
- xml.lshow(result)
- end
- return result
- else
- return pattern
- end
- end
-
- end
-
-end
diff --git a/tex/context/base/l-xml.lua b/tex/context/base/l-xml.lua
index 5a73153c1..cdb9dacc5 100644
--- a/tex/context/base/l-xml.lua
+++ b/tex/context/base/l-xml.lua
@@ -9,6 +9,7 @@ if not modules then modules = { } end modules ['l-xml'] = {
-- RJ: key=value ... lpeg.Ca(lpeg.Cc({}) * (pattern-producing-key-and-value / rawset)^0)
-- some code may move to l-xmlext
+-- some day we will really compile the lpaths (just construct functions)
--[[ldx--
The parser used here is inspired by the variant discussed in the lua book, but
@@ -41,11 +42,11 @@ xml.trace_lpath = false
xml.trace_print = false
xml.trace_remap = false
-local format, concat = string.format, table.concat
+local format, concat, remove, insert, type, next = string.format, table.concat, table.remove, table.insert, type, next
--~ local pairs, next, type = pairs, next, type
--- todo: some things per xml file, liek namespace remapping
+-- todo: some things per xml file, like namespace remapping
--[[ldx--
First a hack to enable namespace resolving. A namespace is characterized by
@@ -154,7 +155,7 @@ do
-- not just one big nested table capture (lpeg overflow)
- local remove, nsremap, resolvens = table.remove, xml.xmlns, xml.resolvens
+ local nsremap, resolvens = xml.xmlns, xml.resolvens
local stack, top, dt, at, xmlns, errorstr, entities = {}, {}, {}, {}, {}, nil, {}
@@ -206,6 +207,7 @@ do
end
dt = top.dt
dt[#dt+1] = toclose
+dt[0] = top
if toclose.at.xmlns then
remove(xmlns)
end
@@ -645,8 +647,8 @@ do
end
end
if not found then
- table.insert(dt, 1, { special=true, ns="", tg="@pi@", dt = { "xml version='1.0' standalone='yes'"} } )
- table.insert(dt, 2, "\n" )
+ insert(dt, 1, { special=true, ns="", tg="@pi@", dt = { "xml version='1.0' standalone='yes'"} } )
+ insert(dt, 2, "\n" )
end
end
end
@@ -789,9 +791,11 @@ local lpathcached = 0 -- statisctics
do
- xml.functions = xml.functions or { }
+ xml.functions = xml.functions or { }
+ xml.expressions = xml.expressions or { }
- local functions = xml.functions
+ local functions = xml.functions
+ local expressions = xml.expressions
local actions = {
[10] = "stay",
@@ -815,34 +819,32 @@ do
[40] = "processing instruction",
}
- --~ local function make_expression(str) --could also be an lpeg
- --~ str = str:gsub("@([a-zA-Z%-_]+)", "(a['%1'] or '')")
- --~ str = str:gsub("position%(%)", "i")
- --~ str = str:gsub("text%(%)", "t")
- --~ str = str:gsub("!=", "~=")
- --~ str = str:gsub("([^=!~<>])=([^=!~<>])", "%1==%2")
- --~ str = str:gsub("([a-zA-Z%-_]+)%(", "functions.%1(")
- --~ return str, loadstring(format("return function(functions,i,a,t) return %s end", str))()
- --~ end
-
-- a rather dumb lpeg
local P, S, R, C, V, Cc = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc
- local lp_position = P("position()") / "id"
+ -- instead of using functions we just parse a few names which saves a call
+ -- later on
+
+ local lp_position = P("position()") / "ps"
+ local lp_index = P("index()") / "id"
local lp_text = P("text()") / "tx"
- local lp_name = P("name()") / "((rt.ns~='' and rt.ns..':'..rt.tg) or '')"
- local lp_tag = P("tag()") / "(rt.tg or '')"
- local lp_ns = P("ns()") / "(rt.ns or '')"
+ local lp_name = P("name()") / "(ns~='' and ns..':'..tg)" -- "((rt.ns~='' and rt.ns..':'..rt.tg) or '')"
+ local lp_tag = P("tag()") / "tg" -- (rt.tg or '')
+ local lp_ns = P("ns()") / "ns" -- (rt.ns or '')
local lp_noequal = P("!=") / "~=" + P("<=") + P(">=") + P("==")
local lp_doequal = P("=") / "=="
local lp_attribute = P("@") / "" * Cc("(at['") * R("az","AZ","--","__")^1 * Cc("'] or '')")
- local lp_function = C(R("az","AZ","--","__")^1) * P("(") / function(t)
- if functions[t] then
- return "functions." .. t .. "("
+ local lp_lua_function = C(R("az","AZ","--","__")^1 * (P(".") * R("az","AZ","--","__")^1)^1) * P("(") / function(t) -- todo: better . handling
+ return t .. "("
+ end
+
+ local lp_function = C(R("az","AZ","--","__")^1) * P("(") / function(t) -- todo: better . handling
+ if expressions[t] then
+ return "expressions." .. t .. "("
else
- return "functions.error("
+ return "expressions.error("
end
end
@@ -850,34 +852,45 @@ do
local rparent = lpeg.P(")")
local noparent = 1 - (lparent+rparent)
local nested = lpeg.P{lparent * (noparent + lpeg.V(1))^0 * rparent}
- local value = lpeg.P(lparent * lpeg.C((noparent + nested)^0) * rparent)
+ local value = lpeg.P(lparent * lpeg.C((noparent + nested)^0) * rparent) -- lpeg.P{"("*C(((1-S("()"))+V(1))^0)*")"}
---~ local value = P { "(" * C(((1 - S("()")) + V(1))^0) * ")" }
+ -- if we use a dedicated namespace then we don't need to pass rt and k
local lp_special = (C(P("name")+P("text")+P("tag"))) * value / function(t,s)
- if functions[t] then
+ if expressions[t] then
if s then
- return "functions." .. t .. "(rt,k," .. s ..")"
+ return "expressions." .. t .. "(r,k," .. s ..")"
else
- return "functions." .. t .. "(rt,k)"
+ return "expressions." .. t .. "(r,k)"
end
else
- return "functions.error(" .. t .. ")"
+ return "expressions.error(" .. t .. ")"
end
end
local converter = lpeg.Cs ( (
lp_position +
+ lp_index +
lp_text + lp_name + -- fast one
lp_special +
lp_noequal + lp_doequal +
lp_attribute +
+ lp_lua_function +
lp_function +
1 )^1 )
+ -- expressions,root,rootdt,k,e,edt,ns,tg,idx,hsh[tg] or 1
+
+ local template = [[
+ return function(expressions,r,d,k,e,dt,ns,tg,id,ps)
+ local at, tx = e.at or { }, dt[1] or ""
+ return %s
+ end
+ ]]
+
local function make_expression(str)
str = converter:match(str)
- return str, loadstring(format("return function(functions,id,at,tx,rt,k) return %s end", str))()
+ return str, loadstring(format(template,str))()
end
local map = { }
@@ -987,7 +1000,7 @@ do
local selector = (
instruction +
- many + any +
+--~ many + any + -- brrr, not here !
parent + stay +
dont_position + position +
dont_match_one_of_and_eq + dont_match_one_of_and_ne +
@@ -999,6 +1012,7 @@ do
has_attribute + has_value +
dont_match_one_of + match_one_of +
dont_match + match +
+ many + any +
crap + empty
)
@@ -1035,7 +1049,7 @@ do
return { map[2] }
end
if m ~= 11 and m ~= 12 and m ~= 13 and m ~= 14 and m ~= 15 and m ~= 16 then
- table.insert(map, 1, { 16 })
+ insert(map, 1, { 16 })
end
-- print((table.serialize(map)):gsub("[ \n]+"," "))
return map
@@ -1080,7 +1094,8 @@ do
if type(pattern) == "string" then
report(format("pattern: %s\n",pattern))
end
- for k,v in ipairs(lp) do
+ for k=1,#lp do
+ local v = lp[k]
if #v > 1 then
local t = { }
for i=2,#v do
@@ -1134,22 +1149,25 @@ functions.
do
- local functions = xml.functions
+ local functions = xml.functions
+ local expressions = xml.expressions
- functions.contains = string.find
- functions.find = string.find
- functions.upper = string.upper
- functions.lower = string.lower
- functions.number = tonumber
- functions.boolean = toboolean
+ expressions.contains = string.find
+ expressions.find = string.find
+ expressions.upper = string.upper
+ expressions.lower = string.lower
+ expressions.number = tonumber
+ expressions.boolean = toboolean
- functions.oneof = function(s,...) -- slow
+ expressions.oneof = function(s,...) -- slow
local t = {...} for i=1,#t do if s == t[i] then return true end end return false
end
- functions.error = function(str)
- xml.error_handler("unknown function in lpath expression",str)
+
+ expressions.error = function(str)
+ xml.error_handler("unknown function in lpath expression",str or "?")
return false
end
+
functions.text = function(root,k,n) -- unchecked, maybe one deeper
local t = type(t)
if t == "string" then
@@ -1159,6 +1177,7 @@ do
return (rdt and rdt[k]) or root[k] or ""
end
end
+
functions.name = function(d,k,n) -- ns + tg
local found = false
n = n or 0
@@ -1203,6 +1222,7 @@ do
return ""
end
end
+
functions.tag = function(d,k,n) -- only tg
local found = false
n = n or 0
@@ -1239,6 +1259,10 @@ do
return (found and found.tg) or ""
end
+ expressions.text = functions.text
+ expressions.name = functions.name
+ expressions.tag = functions.tag
+
local function traverse(root,pattern,handle,reverse,index,parent,wildcard) -- multiple only for tags, not for namespaces
if not root then -- error
return false
@@ -1311,10 +1335,13 @@ do
start, stop, step = stop, start, -1
end
local idx = 0
+ local hsh = { } -- this will slooow down the lot
for k=start,stop,step do -- we used to have functions for all but a case is faster
local e = rootdt[k]
local ns, tg = e.rn or e.ns, e.tg
if tg then
+ -- we can optimize this for simple searches, but it probably does not pay off
+ hsh[tg] = (hsh[tg] or 0) + 1
idx = idx + 1
if command == 30 then
local ns_a, tg_a = action[3], action[4]
@@ -1437,7 +1464,7 @@ do
end
if not action[2] then matched = not matched end
if matched then
- matched = action[6](functions,idx,e.at or { },edt[1],rootdt,k)
+ matched = action[6](expressions,root,rootdt,k,e,edt,ns,tg,idx,hsh[tg] or 1)
end
end
if matched then -- combine tg test and at test
@@ -1912,11 +1939,20 @@ do
local r, d, k, element = m[1], m[2], m[3], m[4]
if not before then k = k + 1 end
if element.tg then
- table.insert(d,k,element) -- untested
- elseif element.dt then
- for _,v in ipairs(element.dt) do -- i added
- table.insert(d,k,v)
- k = k + 1
+ insert(d,k,element) -- untested
+--~ elseif element.dt then
+--~ for _,v in ipairs(element.dt) do -- i added
+--~ insert(d,k,v)
+--~ k = k + 1
+--~ end
+--~ end
+ else
+ local edt = element.dt
+ if edt then
+ for i=1,#edt do
+ insert(d,k,edt[i])
+ k = k + 1
+ end
end
end
end
diff --git a/tex/context/base/lang-frq.tex b/tex/context/base/lang-frq.tex
index 7c70b7454..372813f70 100644
--- a/tex/context/base/lang-frq.tex
+++ b/tex/context/base/lang-frq.tex
@@ -121,17 +121,7 @@
%D This macro reports the average width for the current main
%D language (\the \dimexpr (\averagecharwidth)).
-\beginTEX
-
- \def\averagecharwidth{\the\emwidth}
-
-\endTEX
-
-\beginETEX \dimexpr
-
- \def\averagecharwidth{\dimexpr((\zeropoint\charactertable\charwidthlanguage)/100)}
-
-\endETEX
+\def\averagecharwidth{\dimexpr((\zeropoint\charactertable\charwidthlanguage)/100)}
\def\showcharfreq
{\hbox\bgroup
diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua
index c47d55a7a..e9e9af1b6 100644
--- a/tex/context/base/lang-ini.lua
+++ b/tex/context/base/lang-ini.lua
@@ -23,143 +23,136 @@ languages.hyphenation.data = languages.hyphenation.data or { }
--~ lang:clear_hyphenation()
-do
- -- we can consider hiding data (faster access too)
-
- --~ local function filter(filename,what)
- --~ local data = io.loaddata(input.find_file(filename))
- --~ local data = data:match(string.format("\\%s%%s*(%%b{})",what or "patterns"))
- --~ return data:match("{%s*(.-)%s*}") or ""
- --~ end
-
- -- loading the 26 languages that we normally load in mkiv, the string based variant
- -- takes .84 seconds (probably due to the sub's) while the lpeg variant takes .78
- -- seconds
-
- local leftbrace = lpeg.P("{")
- local rightbrace = lpeg.P("}")
- local spaces = lpeg.S(" \r\n\t\f")
- local spacing = spaces^0
- local validchar = 1-(spaces+rightbrace+leftbrace)
- local validword = validchar^1
- local content = spacing * leftbrace * spacing * lpeg.C((spacing * validword)^0) * spacing * rightbrace * lpeg.P(true)
-
- local command = lpeg.P("\\patterns")
- local parser = (1-command)^0 * command * content
-
- local function filterpatterns(filename)
- if filename:find("%.rpl") then
- return io.loaddata(input.find_file(filename)) or ""
- else
- return parser:match(io.loaddata(input.find_file(filename)) or "")
- end
- end
+-- we can consider hiding data (faster access too)
- local command = lpeg.P("\\hyphenation")
- local parser = (1-command)^0 * command * content
+--~ local function filter(filename,what)
+--~ local data = io.loaddata(input.find_file(filename))
+--~ local data = data:match(string.format("\\%s%%s*(%%b{})",what or "patterns"))
+--~ return data:match("{%s*(.-)%s*}") or ""
+--~ end
- local function filterexceptions(filename)
- if filename:find("%.rhl") then
- return io.loaddata(input.find_file(filename)) or ""
- else
- return parser:match(io.loaddata(input.find_file(filename)) or {}) -- "" ?
- end
- end
+-- loading the 26 languages that we normally load in mkiv, the string based variant
+-- takes .84 seconds (probably due to the sub's) while the lpeg variant takes .78
+-- seconds
- local function record(tag)
- local data = languages.hyphenation.data[tag]
- if not data then
- data = lang.new()
- languages.hyphenation.data[tag] = data
- end
- return data
- end
+local leftbrace = lpeg.P("{")
+local rightbrace = lpeg.P("}")
+local spaces = lpeg.S(" \r\n\t\f")
+local spacing = spaces^0
+local validchar = 1-(spaces+rightbrace+leftbrace)
+local validword = validchar^1
+local content = spacing * leftbrace * spacing * lpeg.C((spacing * validword)^0) * spacing * rightbrace * lpeg.P(true)
- languages.hyphenation.record = record
+local command = lpeg.P("\\patterns")
+local parser = (1-command)^0 * command * content
- function languages.hyphenation.define(tag)
- local data = record(tag)
- return data:id()
+local function filterpatterns(filename)
+ if filename:find("%.rpl") then
+ return io.loaddata(input.find_file(filename)) or ""
+ else
+ return parser:match(io.loaddata(input.find_file(filename)) or "")
end
+end
- function languages.hyphenation.number(tag)
- local d = languages.hyphenation.data[tag]
- return (d and d:id()) or 0
- end
+local command = lpeg.P("\\hyphenation")
+local parser = (1-command)^0 * command * content
- function languages.hyphenation.load(tag, filename, filter, target)
- input.starttiming(languages)
- local data = record(tag)
- filename = (filename and filename ~= "" and input.find_file(filename)) or ""
- local ok = filename ~= ""
- if ok then
- lang[target](data,filterpatterns(filename))
- else
- lang[target](data,"")
- end
- languages.hyphenation.data[tag] = data
- input.stoptiming(languages)
- return ok
+local function filterexceptions(filename)
+ if filename:find("%.rhl") then
+ return io.loaddata(input.find_file(filename)) or ""
+ else
+ return parser:match(io.loaddata(input.find_file(filename)) or {}) -- "" ?
end
+end
- function languages.hyphenation.loadpatterns(tag, patterns)
- return languages.hyphenation.load(tag, patterns, filterpatterns, "patterns")
+local function record(tag)
+ local data = languages.hyphenation.data[tag]
+ if not data then
+ data = lang.new()
+ languages.hyphenation.data[tag] = data or 0
end
+ return data
+end
- function languages.hyphenation.loadexceptions(tag, exceptions)
- return languages.hyphenation.load(tag, patterns, filterexceptions, "hyphenation")
- end
+languages.hyphenation.record = record
- function languages.hyphenation.exceptions(tag, ...)
- local data = record(tag)
- data:hyphenation(...)
- end
+function languages.hyphenation.define(tag)
+ local data = record(tag)
+ return data:id()
+end
- function languages.hyphenation.hyphenate(tag, str)
- return lang.hyphenate(record(tag), str)
- end
+function languages.hyphenation.number(tag)
+ local d = languages.hyphenation.data[tag]
+ return (d and d:id()) or 0
+end
- function languages.hyphenation.lefthyphenmin(tag, value)
- local data = record(tag)
- if value then data:lefthyphenmin(value) end
- return data:lefthyphenmin()
- end
- function languages.hyphenation.righthyphenmin(tag, value)
- local data = record(tag)
- if value then data:righthyphenmin(value) end
- return data:righthyphenmin()
+function languages.hyphenation.load(tag, filename, filter, target)
+ input.starttiming(languages)
+ local data = record(tag)
+ filename = (filename and filename ~= "" and input.find_file(filename)) or ""
+ local ok = filename ~= ""
+ if ok then
+ lang[target](data,filterpatterns(filename))
+ else
+ lang[target](data,"")
end
+ languages.hyphenation.data[tag] = data
+ input.stoptiming(languages)
+ return ok
+end
- function languages.hyphenation.n()
- return table.count(languages.hyphenation.data)
- end
+function languages.hyphenation.loadpatterns(tag, patterns)
+ return languages.hyphenation.load(tag, patterns, filterpatterns, "patterns")
+end
+function languages.hyphenation.loadexceptions(tag, exceptions)
+ return languages.hyphenation.load(tag, patterns, filterexceptions, "hyphenation")
end
-do
+function languages.hyphenation.exceptions(tag, ...)
+ local data = record(tag)
+ data:hyphenation(...)
+end
- -- we can speed this one up with locals if needed
+function languages.hyphenation.hyphenate(tag, str)
+ return lang.hyphenate(record(tag), str)
+end
- local function tolang(what)
- if type(what) == "number" then
- return languages.hyphenation.data[languages.numbers[what]]
- elseif type(what) == "string" then
- return languages.hyphenation.data[what]
- else
- return what
- end
- end
+function languages.hyphenation.lefthyphenmin(tag, value)
+ local data = record(tag)
+ if value then data:lefthyphenmin(value) end
+ return data:lefthyphenmin()
+end
+function languages.hyphenation.righthyphenmin(tag, value)
+ local data = record(tag)
+ if value then data:righthyphenmin(value) end
+ return data:righthyphenmin()
+end
- function languages.prehyphenchar(what)
- return lang.prehyphenchar(tolang(what))
- end
- function languages.posthyphenchar(what)
- return lang.posthyphenchar(tolang(what))
- end
+function languages.hyphenation.n()
+ return table.count(languages.hyphenation.data)
+end
+
+-- we can speed this one up with locals if needed
- languages.tolang = tolang
+local function tolang(what)
+ if type(what) == "number" then
+ return languages.hyphenation.data[languages.numbers[what]]
+ elseif type(what) == "string" then
+ return languages.hyphenation.data[what]
+ else
+ return what
+ end
+end
+function languages.prehyphenchar(what)
+ return lang.prehyphenchar(tolang(what))
end
+function languages.posthyphenchar(what)
+ return lang.posthyphenchar(tolang(what))
+end
+
+languages.tolang = tolang
languages.registered = languages.registered or { }
languages.associated = languages.associated or { }
@@ -243,7 +236,7 @@ end
function languages.hyphenation.loadwords(tag, filename)
local id = languages.hyphenation.number(tag)
if id > 0 then
- local l = lang.new(id)
+ local l = lang.new(id) or 0
input.starttiming(languages)
local data = io.loaddata(filename) or ""
l:hyphenation(data)
@@ -270,7 +263,6 @@ function languages.logger.report()
return (#result > 0 and table.concat(result," ")) or "none"
end
-
languages.words = languages.words or {}
languages.words.data = languages.words.data or {}
languages.words.enable = false
diff --git a/tex/context/base/lang-ini.tex b/tex/context/base/lang-ini.tex
index 3196014ec..17393da33 100644
--- a/tex/context/base/lang-ini.tex
+++ b/tex/context/base/lang-ini.tex
@@ -320,6 +320,9 @@
[\s!lefthyphenmin=2,
\s!righthyphenmin=2,
\c!spacing=\v!packed,
+ \c!lefthyphen=,
+ \c!righthyphen=-,
+ \c!hyphen=-,
\c!midsentence=---,
\c!leftsentence=---,
\c!rightsentence=---,
diff --git a/tex/context/base/lang-ita.tex b/tex/context/base/lang-ita.tex
index 950f87344..93a169112 100644
--- a/tex/context/base/lang-ita.tex
+++ b/tex/context/base/lang-ita.tex
@@ -479,12 +479,14 @@
%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!see=voir ]
+
%D Ordinal converters:
\def\frordinaldaynumber#1% date is masculine
diff --git a/tex/context/base/lang-mis.tex b/tex/context/base/lang-mis.tex
index 13a3f2bb9..41f370974 100644
--- a/tex/context/base/lang-mis.tex
+++ b/tex/context/base/lang-mis.tex
@@ -377,26 +377,26 @@
% test|^|test
% \stop
-\def\hyphenliketextmodediscretionary#1#2#3#4%
+\def\hyphenliketextmodediscretionary#1#2%
{\ifconditional\spaceafterdiscretionary
\prewordbreak\hbox{#1}\relax
\else\ifconditional\punctafterdiscretionary
\prewordbreak\hbox{#1}\relax
\else
- \prewordbreak\discretionary{#2}{#3}{#4}\postwordbreak % was prewordbreak
+ \prewordbreak#2\postwordbreak % was prewordbreak
\fi\fi}
\definetextmodediscretionary {}
- {\hyphenliketextmodediscretionary\compoundhyphen\compoundhyphen\empty\compoundhyphen}
+ {\hyphenliketextmodediscretionary\textmodehyphen\textmodehyphendiscretionary}
\definetextmodediscretionary -
- {\hyphenliketextmodediscretionary\hyphen\hyphen\empty\hyphen}
-
-\definetextmodediscretionary ~
- {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak}
+ {\hyphenliketextmodediscretionary\normalhyphen\normalhyphendiscretionary}
\definetextmodediscretionary _
- {\hyphenliketextmodediscretionary\compoundhyphen\compoundhyphen\compoundhyphen\compoundhyphen}
+ {\hyphenliketextmodediscretionary\composedhyphen\composedhyphendiscretionary}
+
+\definetextmodediscretionary )
+ {\hyphenliketextmodediscretionary{)}{\discretionary{-)}{}{)}}}
\definetextmodediscretionary (
{\ifdim\lastskip>\zeropoint
@@ -405,8 +405,8 @@
\prewordbreak\discretionary{}{(-}{(}\prewordbreak
\fi}
-\definetextmodediscretionary )
- {\hyphenliketextmodediscretionary{)}{-)}{}{)}}
+\definetextmodediscretionary ~
+ {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak}
\definetextmodediscretionary '
{\prewordbreak\discretionary{-}{}{'}\postwordbreak}
diff --git a/tex/context/base/luat-cbk.lua b/tex/context/base/luat-cbk.lua
index 038ad0105..4069fe61f 100644
--- a/tex/context/base/luat-cbk.lua
+++ b/tex/context/base/luat-cbk.lua
@@ -91,61 +91,54 @@ nodes (in this case 121049).
The following code is kind of experimental. In the documents
that describe the development of we report
on speed tests. One observation is thta it sometimes helps to
-restart the collector.
+restart the collector. Okay, experimental code has been removed,
+because messing aroudn with the gc is too unpredictable.
--ldx]]--
-garbagecollector = { }
-
-do
- local level = 0
-
---~ collectgarbage("setstepmul", 165)
---~ collectgarbage("setstepmul",50)
-
- garbagecollector.trace = false
- garbagecollector.tune = false -- for the moment
-
- local function report(format)
- if garbagecollector.trace then
- -- texio.write_nl(string.format(format,level,status.luastate_bytes))
- texio.write_nl(string.format(format,level,collectgarbage("count")))
- end
- end
-
- function garbagecollector.update()
- report("%s: memory before update: %s")
- collectgarbage("restart")
- end
-
- function garbagecollector.push()
- if garbagecollector.tune then
- level = level + 1
- if level == 1 then
- collectgarbage("stop")
+garbagecollector = garbagecollector or { }
+
+garbagecollector.trace = false
+garbagecollector.enabled = false
+
+-- Lua allocates up to 12 times the amount of memory needed for
+-- handling a string, and for large binary chunks (like chinese otf
+-- files) we get a prominent memory consumption. Even when a variable
+-- is nilled, there is some delay in freeing the associated memory (the
+-- hashed string) because if we do the same thing directly afterwards,
+-- we see only a slight increase in memory. For that reason it makes
+-- sense to do a collector pass after a huge file.
+--
+-- test file:
+--
+-- function test()
+-- local b = collectgarbage("count")
+-- local s = io.loaddata("some font table, e.g. a big tmc file")
+-- local a = collectgarbage("count")
+-- print(">>> STATUS",b,a,a-b,#s,1000*(a-b)/#s)
+-- end
+--
+-- test() test() test() test() collectgarbage("collect") test() test() test() test()
+--
+-- As a result of this, LuaTeX now uses an optimized version of f:read("*a"),
+-- one that does not use the 4K allocations but allocates in one step.
+
+garbagecollector.criterium = 4*1024*1024
+
+function garbagecollector.check(size,criterium)
+ if garbagecollector.enabled then
+ criterium = criterium or garbagecollector.criterium
+ if not size or (criterium and criterium > 0 and size > criterium) then
+ if garbagecollector.trace then
+ local round = math.round or math.floor
+ local b = collectgarbage("count")
+ collectgarbage("collect")
+ local a = collectgarbage("count")
+ logs.report("memory","forced sweep, collected: %s MB, used: %s MB",round((b-a)/1000),round(a/1000))
+ else
+ collectgarbage("collect")
end
- report("%s: memory after push: %s")
- else
- garbagecollector.update()
end
end
-
- function garbagecollector.pop()
- if garbagecollector.tune then
- report("%s: memory before pop: %s")
- if level == 1 then
- collectgarbage("restart")
- end
- level = level - 1
- end
- end
-
- function garbagecollector.cycle()
- if garbagecollector.tune then
- report("%s: memory before collect: %s")
- collectgarbage("collect")
- report("%s: memory after collect: %s")
- end
- end
-
end
+
diff --git a/tex/context/base/luat-env.tex b/tex/context/base/luat-env.tex
index 9a0a7d9f8..164be174c 100644
--- a/tex/context/base/luat-env.tex
+++ b/tex/context/base/luat-env.tex
@@ -48,9 +48,8 @@
\chardef\CTXlua\zerocount \luadefcounter\CTXlua \luastartup\CTXlua
-\def\ctxlua {\directlua\CTXlua}
-\def\directctxlua{\directlua\CTXlua}
-\def\latectxlua {\latelua \CTXlua}
+\def\ctxdirectlua{\directlua\CTXlua} \let\ctxlua\ctxdirectlua
+\def\ctxlatelua {\latelua \CTXlua}
%D The simple \type {\lua} command is just a shortcut to the
%D zero instance. Beware, we don't use the 0--9 range for
@@ -61,7 +60,7 @@
\newlua \luadefault
\def \lua {\directlua\luadefault} % zero is the main one, and reserved for ctx
-\edef\luaversion{\CTXlua{tex.print(_VERSION)}}
+\edef\luaversion{\ctxlua{tex.print(_VERSION)}}
%D We want to define \LUA\ related things in the format but
%D need to reluad code because \LUA\ instances are not dumped
@@ -112,6 +111,10 @@
\let\stopruntimeluacode \relax
\let\stopruntimectxluacode\relax
+\ifx\normalprotected \undefined \let\normalprotected \protected \fi
+\ifx\normalunexpanded\undefined \let\normalunexpanded\unexpanded \fi
+\ifx\normalexpanded \undefined \let\normalexpanded \expanded \fi
+
\long\def\lastexpanded{} % todo: elsewhere we use \@@expanded
\long\def\expanded#1{\long\xdef\lastexpanded{\noexpand#1}\lastexpanded}
diff --git a/tex/context/base/luat-inp.lua b/tex/context/base/luat-inp.lua
index 5eee43b6f..d71ab3b73 100644
--- a/tex/context/base/luat-inp.lua
+++ b/tex/context/base/luat-inp.lua
@@ -37,7 +37,7 @@ if not input.hashers then input.hashers = { } end -- load databases
if not input.generators then input.generators = { } end -- generate databases
if not input.filters then input.filters = { } end -- conversion filters
-local format = string.format
+local format, concat, sortedkeys = string.format, table.concat, table.sortedkeys
input.locators.notfound = { nil }
input.hashers.notfound = { nil }
@@ -259,27 +259,44 @@ input.settrace(tonumber(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRA
do
local clock = os.gettimeofday or os.clock
+ function input.hastimer(instance)
+ return instance and instance.starttime
+ end
+
function input.starttiming(instance)
if instance then
- instance.starttime = clock()
- if not instance.loadtime then
- instance.loadtime = 0
+ local it = instance.timing
+ if not it then
+ it = 0
+ end
+ if it == 0 then
+ instance.starttime = clock()
+ if not instance.loadtime then
+ instance.loadtime = 0
+ end
end
+ instance.timing = it + 1
end
end
function input.stoptiming(instance, report)
if instance then
- local starttime = instance.starttime
- if starttime then
- local stoptime = clock()
- local loadtime = stoptime - starttime
- instance.stoptime = stoptime
- instance.loadtime = instance.loadtime + loadtime
- if report then
- input.report("load time %0.3f",loadtime)
+ local it = instance.timing
+ if it > 1 then
+ instance.timing = it - 1
+ else
+ local starttime = instance.starttime
+ if starttime then
+ local stoptime = clock()
+ local loadtime = stoptime - starttime
+ instance.stoptime = stoptime
+ instance.loadtime = instance.loadtime + loadtime
+ if report then
+ input.report("load time %0.3f",loadtime)
+ end
+ instance.timing = 0
+ return loadtime
end
- return loadtime
end
end
return 0
@@ -841,8 +858,6 @@ function input.serialize(files)
-- luatools and mtxtools are called frequently. Okay,
-- we pay a small price for properly tabbed tables.
local t = { }
- local concat = table.concat
- local sorted = table.sortedkeys
local function dump(k,v,m)
if type(v) == 'string' then
return m .. "['" .. k .. "']='" .. v .. "',"
@@ -854,11 +869,11 @@ function input.serialize(files)
end
t[#t+1] = "return {"
if input.instance.sortdata then
- for _, k in pairs(sorted(files)) do
+ for _, k in pairs(sortedkeys(files)) do
local fk = files[k]
if type(fk) == 'table' then
t[#t+1] = "\t['" .. k .. "']={"
- for _, kk in pairs(sorted(fk)) do
+ for _, kk in pairs(sortedkeys(fk)) do
t[#t+1] = dump(kk,fk[kk],"\t\t")
end
t[#t+1] = "\t},"
@@ -1330,7 +1345,6 @@ end
function input.aux.splitpathexpr(str, t, validate)
-- no need for optimization, only called a few times, we can use lpeg for the sub
t = t or { }
- local concat = table.concat
str = str:gsub(",}",",@}")
str = str:gsub("{,","{@,")
-- str = "@" .. str .. "@"
@@ -1655,7 +1669,7 @@ function input.aux.find_file(filename) -- todo : plugin (scanners, checkers etc)
if input.trace > 2 then
input.logger('? filename: %s',filename)
input.logger('? filetype: %s',filetype or '?')
- input.logger('? wanted files: %s',table.concat(wantedfiles," | "))
+ input.logger('? wanted files: %s',concat(wantedfiles," | "))
end
for _, fname in pairs(wantedfiles) do
if fname and input.is_readable.file(fname) then
@@ -1678,8 +1692,8 @@ function input.aux.find_file(filename) -- todo : plugin (scanners, checkers etc)
local doscan, recurse
if input.trace > 2 then
input.logger('? filename: %s',filename)
- -- if pathlist then input.logger('? path list: %s',table.concat(pathlist," | ")) end
- -- if filelist then input.logger('? file list: %s',table.concat(filelist," | ")) end
+ -- if pathlist then input.logger('? path list: %s',concat(pathlist," | ")) end
+ -- if filelist then input.logger('? file list: %s',concat(filelist," | ")) end
end
-- a bit messy ... esp the doscan setting here
for _, path in pairs(pathlist) do
@@ -1888,6 +1902,8 @@ function input.find_wildcard_files(filename) -- todo: remap:
if done and not allresults then break end
end
end
+ -- we can consider also searching the paths not in the database, but then
+ -- we end up with a messy search (all // in all path specs)
return result
end
@@ -1908,7 +1924,7 @@ function input.save_used_files_in_trees(filename,jobname)
f:write("\t" .. jobname .. " \n")
end
f:write("\t\n")
- for _,v in pairs(table.sortedkeys(instance.foundintrees)) do
+ for _,v in pairs(sorted(instance.foundintrees)) do -- ipairs
f:write("\t\t" .. v .. " \n")
end
f:write("\t \n")
@@ -2014,7 +2030,7 @@ function table.sequenced(t,sep) -- temp here
for k, v in pairs(t) do
s[#s+1] = k .. "=" .. v
end
- return table.concat(s, sep or " | ")
+ return concat(s, sep or " | ")
end
function input.methodhandler(what, filename, filetype) -- ...
@@ -2250,7 +2266,7 @@ do
str[k] = resolve(v) or v
end
elseif str and str ~= "" then
- str = str:gsub("([a-z]+):([^ ]*)", function(method,target)
+ str = str:gsub("([a-z]+):([^ \"\']*)", function(method,target)
if resolvers[method] then
return resolvers[method](target)
else
diff --git a/tex/context/base/luat-lib.lua b/tex/context/base/luat-lib.lua
index bbbf1a142..06d00e778 100644
--- a/tex/context/base/luat-lib.lua
+++ b/tex/context/base/luat-lib.lua
@@ -57,7 +57,7 @@ function environment.setargument(name,value)
environment.arguments[name] = value
end
-function environment.argument(name)
+function environment.argument(name) -- todo: default (plus typecheck on default)
local arguments, sortedflags = environment.arguments, environment.sortedflags
if arguments[name] then
return arguments[name]
@@ -92,28 +92,83 @@ function environment.split_arguments(separator) -- rather special, cut-off befor
return before, after
end
-function environment.reconstruct_commandline(arg)
+--~ function environment.reconstruct_commandline(arg)
+--~ if not arg then arg = environment.original_arguments end
+--~ local result = { }
+--~ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+--~ local kk, vv = a:match("^(%-+.-)=(.+)$")
+--~ if kk and vv then
+--~ if vv:find(" ") then
+--~ vv = vv:unquote()
+--~ vv = vv:gsub('"','\\"')
+--~ result[#result+1] = kk .. "=" .. vv:quote()
+--~ else
+--~ a = a:unquote()
+--~ a = a:gsub('"','\\"')
+--~ result[#result+1] = a
+--~ end
+--~ elseif a:find(" ") then
+--~ a = a:unquote()
+--~ a = a:gsub('"','\\"')
+--~ result[#result+1] = a:quote()
+--~ else
+--~ result[#result+1] = a
+--~ end
+--~ end
+--~ return table.join(result," ")
+--~ end
+
+function environment.reconstruct_commandline(arg,noquote)
if not arg then arg = environment.original_arguments end
- local result = { }
- for _,a in ipairs(arg) do -- ipairs 1 .. #n
- local kk, vv = a:match("^(%-+.-)=(.+)$")
- if kk and vv then
- if vv:find(" ") then
- result[#result+1] = kk .. "=" .. string.quote(vv)
+ if noquote and #arg == 1 then
+ local a = arg[1]
+ a = input.resolve(a)
+ a = a:unquote()
+ return a
+ elseif #arg == 1 then
+ local result = { }
+ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+ a = input.resolve(a)
+ a = a:unquote()
+ a = a:gsub('"','\\"') -- tricky
+ if a:find(" ") then
+ result[#result+1] = a:quote()
else
result[#result+1] = a
end
- elseif a:find(" ") then
- result[#result+1] = string.quote(a)
- else
- result[#result+1] = a
end
+ return table.join(result," ")
end
- return table.join(result," ")
end
if arg then
- environment.initialize_arguments(arg)
- environment.original_arguments = arg
+
+ -- new, reconstruct quoted snippets (maybe better just remnove the " then and add them later)
+ local newarg, instring = { }, false
+
+ for index, argument in ipairs(arg) do
+ if argument:find("^\"") then
+ newarg[#newarg+1] = argument:gsub("^\"","")
+ if not argument:find("\"$") then
+ instring = true
+ end
+ elseif argument:find("\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument:gsub("\"$","")
+ instring = false
+ elseif instring then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument
+ else
+ newarg[#newarg+1] = argument
+ end
+ end
+ for i=1,-5,-1 do
+ newarg[i] = arg[i]
+ end
+
+ environment.initialize_arguments(newarg)
+ environment.original_arguments = newarg
+ environment.raw_arguments = arg
+
arg = { } -- prevent duplicate handling
+
end
diff --git a/tex/context/base/luat-log.lua b/tex/context/base/luat-log.lua
index 499e10dd3..3704b3999 100644
--- a/tex/context/base/luat-log.lua
+++ b/tex/context/base/luat-log.lua
@@ -129,6 +129,14 @@ function input.reportlines(str) -- todo:
end
end
+input.moreinfo = [[
+more information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
function input.help(banner,message)
if not input.verbose then
input.verbose = true
@@ -137,6 +145,10 @@ function input.help(banner,message)
input.report(banner,"\n")
input.report("")
input.reportlines(message)
+ if input.moreinfo and input.moreinfo ~= "" then
+ input.report("")
+ input.reportlines(input.moreinfo)
+ end
end
logs.set_level('error')
diff --git a/tex/context/base/luat-tex.lua b/tex/context/base/luat-tex.lua
index 75e8daf8e..8560c528d 100644
--- a/tex/context/base/luat-tex.lua
+++ b/tex/context/base/luat-tex.lua
@@ -48,8 +48,9 @@ if texconfig and not texlua then
end
input.filters.dynamic_translator = nil
- input.filters.frozen_translator = nil
+ input.filters.frozen_translator = nil -- not used here
input.filters.utf_translator = nil
+ input.filters.user_translator = nil
function input.openers.text_opener(filename,file_handle,tag)
local u = unicode.utftype(file_handle)
@@ -76,6 +77,7 @@ if texconfig and not texlua then
input.logger('= closer: %s (%s), file: %s',tag,unicode.utfname[u],filename)
end
input.show_close(filename)
+ t = nil
end,
--~ getline = function(n)
--~ local line = t.lines[n]
@@ -95,16 +97,20 @@ if texconfig and not texlua then
current = current + 1
self.current = current
local line = lines[current]
- if line == "" then
+ if not line then
+ return nil
+ elseif line == "" then
return ""
else
- local translator = input.filters.utf_translator
- -- return (translator and translator(line)) or line
+ translator = filters.utf_translator
if translator then
- return translator(line)
- else
- return line
+ line = translator(line)
+ translator = filters.user_translator
+ if translator then
+ line = translator(line)
+ end
end
+ return line
end
end
end
@@ -118,18 +124,21 @@ if texconfig and not texlua then
t = {
reader = function(self)
local line = file_handle:read()
- if line == "" then
+ if not line then
+ return nil
+ elseif line == "" then
return ""
+ else
+ translator = filters.dynamic_translator or filters.utf_translator
+ if translator then
+ line = translator(line)
+ translator = filters.user_translator
+ if translator then
+ line = translator(line)
+ end
+ end
+ return line
end
- local translator = filters.utf_translator
- if translator then
- return translator(line)
- end
- translator = filters.dynamic_translator
- if translator then
- return translator(line)
- end
- return line
end,
close = function()
if input.trace > 0 then
@@ -137,6 +146,7 @@ if texconfig and not texlua then
end
input.show_close(filename)
file_handle:close()
+ t = nil
end,
handle = function()
return file_handle
@@ -173,6 +183,7 @@ if texconfig and not texlua then
input.logger('+ loader: %s, file: %s',tag,filename)
end
local s = f:read("*a")
+ if garbagecollector and garbagecollector.check then garbagecollector.check(#s) end
f:close()
if s then
return true, s, #s
@@ -206,15 +217,12 @@ if texconfig and not texlua then do
ctx = ctx or { }
- local ss = { }
-
- function ctx.writestatus(a,b,...)
- local s = ss[a]
- if not ss[a] then
- s = a:rpadd(15) .. ": "
- ss[a] = s
+ function ctx.writestatus(a,b,c,...)
+ if c then
+ texio.write_nl(("%-15s: %s\n"):format(a,b:format(c,...)))
+ else
+ texio.write_nl(("%-15s: %s\n"):format(a,b)) -- b can have %'s
end
- texio.write_nl(s .. format(b,...) .. "\n")
end
-- this will become: ctx.install_statistics(fnc() return ..,.. end) etc
@@ -226,6 +234,12 @@ if texconfig and not texlua then do
if #tag > n then n = #tag end
end
+ function ctx.memused() -- no math.round yet -)
+ -- collectgarbage("collect")
+ local round = math.round or math.floor
+ return string.format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+ end
+
function ctx.show_statistics() -- todo: move calls
local loadtime, register_statistics = input.loadtime, ctx.register_statistics
if caches then
@@ -238,6 +252,12 @@ if texconfig and not texlua then do
if input.instance then
register_statistics("input load time", "%s seconds", function() return loadtime(input.instance) end)
end
+ if ctx and input.hastimer(ctx) then
+ register_statistics("startup time","%s seconds (including runtime option file processing)", function() return loadtime(ctx) end)
+ end
+ if job then
+ register_statistics("jobdata time","%s seconds saving, %s seconds loading", function() return loadtime(job._save_), loadtime(job._load_) end)
+ end
if fonts then
register_statistics("fonts load time","%s seconds", function() return loadtime(fonts) end)
end
@@ -271,8 +291,8 @@ if texconfig and not texlua then do
if metapost then
register_statistics("metapost processing time", "%s seconds, loading: %s seconds, execution: %s seconds, n: %s", function() return loadtime(metapost), loadtime(mplib), loadtime(metapost.exectime), metapost.n end)
end
- if status.luastate_bytes then
- register_statistics("current memory usage", "%s bytes", function() return status.luastate_bytes end)
+ if status.luastate_bytes and ctx.memused then
+ register_statistics("current memory usage", "%s", ctx.memused)
end
if nodes then
register_statistics("cleaned up reserved nodes", "%s nodes, %s lists of %s", function() return nodes.cleanup_reserved(tex.count[24]) end) -- \topofboxstack
@@ -286,6 +306,25 @@ if texconfig and not texlua then do
if fonts then
register_statistics("loaded fonts", "%s", function() return fonts.logger.report() end)
end
+ if status.cs_count then
+ register_statistics("control sequences", "%s of %s", function() return status.cs_count, status.hash_size+status.hash_extra end)
+ end
+ if status.callbacks and xml then -- xml for being in context -)
+ ctx.register_statistics("callbacks", "direct: %s, indirect: %s, total: %s%s", function()
+ local total, indirect = status.callbacks, status.indirect_callbacks
+ local pages = tex.count['realpageno'] - 1
+ if pages > 1 then
+ return total-indirect, indirect, total, format(" (%i per page)",total/pages)
+ else
+ return total-indirect, indirect, total, ""
+ end
+ end)
+ else
+ ctx.register_statistics("callbacks", "direct: %s, indirect: %s, total: %s", function()
+ local total, indirect = status.callbacks, status.indirect_callbacks
+ return total-indirect, indirect, total
+ end)
+ end
if xml then -- so we are in mkiv, we need a different check
register_statistics("runtime", "%s seconds, %i processed pages, %i shipped pages, %.3f pages/second", function()
input.stoptiming(input.instance)
@@ -355,12 +394,12 @@ if texconfig and not texlua then
-- image
callback.register('read_map_file' , function(file) return input.loadbinfile(file,"map") end)
callback.register('read_ocp_file' , function(file) return input.loadbinfile(file,"ocp") end)
- callback.register('read_opentype_file' , function(file) return input.loadbinfile(file,"otf") end)
+--~ callback.register('read_opentype_file' , function(file) return input.loadbinfile(file,"otf") end)
-- output
callback.register('read_pk_file' , function(file) return input.loadbinfile(file,"pk") end)
callback.register('read_sfd_file' , function(file) return input.loadbinfile(file,"sfd") end)
- callback.register('read_truetype_file' , function(file) return input.loadbinfile(file,"ttf") end)
- callback.register('read_type1_file' , function(file) return input.loadbinfile(file,"pfb") end)
+--~ callback.register('read_truetype_file' , function(file) return input.loadbinfile(file,"ttf") end)
+--~ callback.register('read_type1_file' , function(file) return input.loadbinfile(file,"pfb") end)
callback.register('read_vf_file' , function(file) return input.loadbinfile(file,"vf" ) end)
end
diff --git a/tex/context/base/luat-tmp.lua b/tex/context/base/luat-tmp.lua
index b9c7e958d..1e3f55380 100644
--- a/tex/context/base/luat-tmp.lua
+++ b/tex/context/base/luat-tmp.lua
@@ -362,7 +362,7 @@ input.storage.data = { }
input.storage.min = 0 -- 500
input.storage.max = input.storage.min - 1
input.storage.trace = false -- true
-input.storage.done = 0
+input.storage.done = input.storage.done or 0
input.storage.evaluators = { }
-- (evaluate,message,names)
@@ -420,6 +420,8 @@ function input.storage.dump()
end
end
+-- we also need to count at generation time (nicer for message)
+
if lua.bytecode then -- from 0 upwards
local i = input.storage.min
while lua.bytecode[i] do
diff --git a/tex/context/base/luat-tra.lua b/tex/context/base/luat-tra.lua
index ccf1be13e..5314b48c6 100644
--- a/tex/context/base/luat-tra.lua
+++ b/tex/context/base/luat-tra.lua
@@ -4,6 +4,10 @@
-- copyright: PRAGMA ADE / ConTeXt Development Team
-- license : see context related readme files
+-- the tag is kind of generic and used for functions that are not
+-- bound to a variable, like node.new, node.copy etc (contrary to for instance
+-- node.has_attribute which is bound to a has_attribute local variable in mkiv)
+
if not versions then versions = { } end versions['luat-tra'] = 1.001
debugger = { }
@@ -13,23 +17,27 @@ local names = { }
local getinfo = debug.getinfo
local format = string.format
+-- one
+
local function hook()
local f = getinfo(2,"f").func
+ local n = getinfo(2,"Sn")
+-- if n.what == "C" and n.name then print (n.namewhat .. ': ' .. n.name) end
if f then
- if counters[f] == nil then
+ local cf = counters[f]
+ if cf == nil then
counters[f] = 1
- names[f] = getinfo(2,"Sn")
+ names[f] = n
else
- counters[f] = counters[f] + 1
+ counters[f] = cf + 1
end
end
end
-
local function getname(func)
local n = names[func]
if n then
if n.what == "C" then
- return n.name or ''
+ return n.name or ''
else
-- source short_src linedefined what name namewhat nups func
local name = n.name or n.namewhat or n.what
@@ -40,7 +48,6 @@ local function getname(func)
return "unknown"
end
end
-
function debugger.showstats(printer,threshold)
printer = printer or texio.write or print
threshold = threshold or 0
@@ -61,6 +68,40 @@ function debugger.showstats(printer,threshold)
printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
end
+-- two
+
+--~ local function hook()
+--~ local n = getinfo(2)
+--~ if n.what=="C" and not n.name then
+--~ local f = tostring(debug.traceback())
+--~ local cf = counters[f]
+--~ if cf == nil then
+--~ counters[f] = 1
+--~ names[f] = n
+--~ else
+--~ counters[f] = cf + 1
+--~ end
+--~ end
+--~ end
+--~ function debugger.showstats(printer,threshold)
+--~ printer = printer or texio.write or print
+--~ threshold = threshold or 0
+--~ local total, grandtotal, functions = 0, 0, 0
+--~ printer("\n") -- ugly but ok
+--~ -- table.sort(counters)
+--~ for func, count in pairs(counters) do
+--~ if count > threshold then
+--~ printer(format("%8i %s", count, func))
+--~ total = total + count
+--~ end
+--~ grandtotal = grandtotal + count
+--~ functions = functions + 1
+--~ end
+--~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
+--~ end
+
+-- rest
+
function debugger.savestats(filename,threshold)
local f = io.open(filename,'w')
if f then
diff --git a/tex/context/base/lxml-ini.lua b/tex/context/base/lxml-ini.lua
index 0dec292d1..6b8d014a7 100644
--- a/tex/context/base/lxml-ini.lua
+++ b/tex/context/base/lxml-ini.lua
@@ -104,15 +104,48 @@ do
--~ content / function(s) texsprint(tex.xmlcatcodes,s) end
--~ )^0
+ local forceraw, rawroot = false, nil
+
+ function lxml.startraw()
+ forceraw = true
+ end
+ function lxml.stopraw()
+ forceraw = false
+ end
+ function lxml.rawroot()
+ return rawroot
+ end
+ function lxml.rawpath(rootid)
+ if rawroot and type(rawroot) == "table" then
+ local text, path, rp
+ if not rawroot.dt then
+ text, path, rp = "text", "", rawroot[0]
+ else
+ path, rp = "tree", "", rawroot.__p__
+ end
+ while rp do
+ local rptg = rp.tg
+ if rptg then
+ path = rptg .. "/" .. path
+ end
+ rp = rp.__p__
+ end
+ return { rootid, "/" .. path, text }
+ end
+ end
+
local function sprint(root)
if not root then
+--~ rawroot = false
-- quit
else
local tr = type(root)
if tr == "string" then -- can also be result of lpath
+--~ rawroot = false
capture:match(root)
elseif tr == "table" then
- serialize(root,sprint,nil,nil,specialhandler)
+ rawroot = forceraw and root
+ serialize(root,sprint,nil,nil,specialhandler,forceraw)
end
end
end
@@ -137,15 +170,18 @@ do
function xml.cprint(root) -- content
if not root then
+--~ rawroot = false
-- quit
elseif type(root) == 'string' then
+--~ rawroot = false
capture:match(root)
else
local rootdt = root.dt
+ rawroot = forceraw and root
if rootdt then -- the main one
- serialize(rootdt,sprint,nil,nil,specialhandler)
+ serialize(rootdt,sprint,nil,nil,specialhandler,forceraw)
else -- probably dt
- serialize(root,sprint,nil,nil,specialhandler)
+ serialize(root,sprint,nil,nil,specialhandler,forceraw)
end
end
end
@@ -162,11 +198,14 @@ do
function lines(root)
if not root then
+--~ rawroot = false
-- quit
elseif type(root) == 'string' then
+--~ rawroot = false
capture:match(root)
elseif next(root) then -- tr == 'table'
- serialize(root, lines)
+ rawroot = forceraw and root
+ serialize(root,lines,forceraw)
end
end
@@ -189,7 +228,7 @@ do
space / function( ) texsprint(tex.texcatcodes,spacecommand .. "{}") end
)^0
- function toverbatim(str)
+ local function toverbatim(str)
if beforecommand then texsprint(tex.texcatcodes,beforecommand .. "{}") end
capture:match(str)
if aftercommand then texsprint(tex.texcatcodes,aftercommand .. "{}") end
@@ -207,11 +246,25 @@ do
specialhandler['@cd@'] = nil
end
+ -- local capture = (space^0*newline)^0 * capture * (space+newline)^0 * -1
+
+ local function toverbatim(str)
+ if beforecommand then texsprint(tex.texcatcodes,beforecommand .. "{}") end
+ -- todo: add this to capture
+ str = str:gsub("^[ \t]+[\n\r]+","")
+ str = str:gsub("[ \t\n\r]+$","")
+ capture:match(str)
+ if aftercommand then texsprint(tex.texcatcodes,aftercommand .. "{}") end
+ end
+
function lxml.verbatim(id,before,after)
local root = get_id(id)
if root then
if before then texsprint(tex.ctxcatcodes,format("%s[%s]",before,root.tg)) end
- serialize(root.dt,toverbatim,nil,nil,nil,true) -- was root
+ -- serialize(root.dt,toverbatim,nil,nil,nil,true) -- was root
+ local t = { }
+ serialize(root.dt,function(s) t[#t+1] = s end,nil,nil,nil,true) -- was root
+ toverbatim(table.concat(t,""))
if after then texsprint(tex.ctxcatcodes,after) end
end
end
@@ -328,9 +381,10 @@ end
function lxml.nonspace(id,pattern) -- slow, todo loop
xmltprint(xmlcollect(get_id(id),pattern,true))
end
-function lxml.content(id,pattern)
- xmlsprint(xmlcontent(get_id(id),pattern) or "")
-end
+
+--~ function lxml.content(id)
+--~ xmlsprint(xmlcontent(get_id(id)) or "")
+--~ end
function lxml.strip(id,pattern,nolines)
xml.strip(get_id(id),pattern,nolines)
@@ -350,7 +404,7 @@ end
function lxml.raw(id,pattern) -- the content, untouched by commands
local c = xmlfilter(get_id(id),pattern)
if c then
- texsprint(concat(c.dt,""))
+ xml.serialize(c.dt,texsprint,nil,nil,nil,true)
end
end
@@ -398,37 +452,7 @@ function xml.element(e,n)
end
function lxml.element(id,n)
- local e = get_id(id)
- if e then
- local edt = e.dt
- if edt then
- if n > 0 then
- for i=1,#edt do
- local ei = edt[i]
- if type(ei) == "table" then
- if n == 1 then
- xmlsprint(ei)
- return
- else
- n = n - 1
- end
- end
- end
- elseif n < 0 then
- for i=#edt,1,-1 do
- local ei = edt[i]
- if type(ei) == "table" then
- if n == -1 then
- xmlsprint(ei)
- return
- else
- n = n + 1
- end
- end
- end
- end
- end
- end
+ xml.element(get_id(id),n)
end
function lxml.stripped(id,pattern,nolines)
@@ -441,7 +465,11 @@ function lxml.stripped(id,pattern,nolines)
end
function lxml.flush(id)
- xmlsprint(get_id(id).dt)
+ id = get_id(id)
+ local dt = id and id.dt
+ if dt then
+ xmlsprint(dt)
+ end
end
--~ function lxml.strip(id,flush)
diff --git a/tex/context/base/lxml-ini.tex b/tex/context/base/lxml-ini.tex
index 4a4a63c1d..0d03044b2 100644
--- a/tex/context/base/lxml-ini.tex
+++ b/tex/context/base/lxml-ini.tex
@@ -23,17 +23,18 @@
\def\xmlattdef #1#2#3{\ctxlua{lxml.attribute("#1","/","#2","#3")}}
\def\xmlattribute #1#2#3{\ctxlua{lxml.attribute("#1","#2","#3")}}
\def\xmlattributedef #1#2#3#4{\ctxlua{lxml.attribute("#1","#2","#3","#4")}}
-\def\xmlchecknamespace #1#2#3{\ctxlua{xml.check_namespace(lxml.id("#1"),"#2","#3")}} % element
\def\xmlcommand #1#2#3{\ctxlua{lxml.command("#1","#2","#3")}}
\def\xmlconcat #1#2#3{\ctxlua{lxml.concat("#1","#2",[[\detokenize{#3}]])}}
\def\xmlconcatrange#1#2#3#4#5{\ctxlua{lxml.concatrange("#1","#2","#3","#4",[[\detokenize{#5}]])}}
-\def\xmlcontent #1#2{\ctxlua{lxml.content("#1","#2")}}
\def\xmlcount #1#2{\ctxlua{lxml.count("#1","#2")}}
\def\xmldelete #1#2{\ctxlua{xml.delete(lxml.id("#1"),"#2")}}
-\def\xmldirectives #1{\ctxlua{lxml.directives.setups("#1")}}
+\def\xmldirectives #1{\ctxlua{lxml.directives.setup("#1")}}
+\def\xmldirectivesbefore #1{\ctxlua{lxml.directives.before("#1")}}
+\def\xmldirectivesafter #1{\ctxlua{lxml.directives.after("#1")}}
\def\xmlfilter #1#2{\ctxlua{lxml.filter("#1","#2")}}
\def\xmlfirst #1#2{\ctxlua{lxml.first("#1","#2")}}
\def\xmlflush #1{\ctxlua{lxml.flush("#1")}}
+% \def\xmlcontent #1{\ctxlua{lxml.content("#1")}}
% \def\xmlstrip #1{\ctxlua{lxml.strip("#1")}}
% \def\xmlflushstripped #1{\ctxlua{lxml.strip("#1",true)}}
\def\xmldirect #1{\ctxlua{lxml.direct("#1")}} % in loops, not dt but root
@@ -57,6 +58,7 @@
\def\xmlregisterns #1#2{\ctxlua{xml.registerns("#1","#2")}} % document
\def\xmlremapname #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}} % element
\def\xmlremapnamespace #1#2#3{\ctxlua{xml.rename_space(lxml.id("#1"),"#2","#3")}} % document
+\def\xmlchecknamespace #1#2#3{\ctxlua{xml.check_namespace(lxml.id("#1"),"#2","#3")}} % element
\def\xmlsetfunction #1#2#3{\ctxlua{lxml.setaction("#1","#2",#3)}}
\def\xmlsetsetup #1#2#3{\ctxlua{lxml.setsetup("#1","#2","#3")}}
\def\xmlstrip #1#2{\ctxlua{lxml.strip("#1","#2")}}
@@ -68,10 +70,17 @@
\def\xmltags #1#2{\ctxlua{lxml.tags("#1","#2")}}
\def\xmlutfize #1{\ctxlua{lxml.utfize("#1")}}
\def\xmlverbatim #1{\ctxlua{lxml.verbatim("#1")}}
+\def\xmldisplayverbatim #1{\ctxlua{lxml.displayverbatim("#1")}}
+\def\xmlinlineverbatim #1{\ctxlua{lxml.inlineverbatim("#1")}}
%def\xmldoifelse #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",false))}}
%def\xmldoifelsetext #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",true ))}}
+% kind of special:
+
+\def\xmlstartraw{\ctxlua{lxml.startraw()}}
+\def\xmlstopraw {\ctxlua{lxml.stopraw()}}
+
% todo: \xmldoifelseattribute
\def\xmldoif #1#2{\ctxlua{lxml.doif("#1","#2")}}
@@ -157,7 +166,7 @@
\let\xmlprocess \xmlprocessfile
% beware: \xmlmain takes the real root, so also processing
-% instructions preceing the root element; well, in some
+% instructions preceding the root element; well, in some
% sense that is the root
\startsetups xml:process
diff --git a/tex/context/base/m-chart.tex b/tex/context/base/m-chart.tex
index f5d0ea7b9..c8928f2d5 100644
--- a/tex/context/base/m-chart.tex
+++ b/tex/context/base/m-chart.tex
@@ -11,7 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% to do: \localpushmacro/\localpopmacro (dohandleflowchart etc)
+% todo: \localpushmacro/\localpopmacro (dohandleflowchart etc)
+% todo: make mkiv variant
+% todo: use dimexpr/numspr
% will be redone with layers and dimexpr ro even better, by just using
% textext
@@ -185,10 +187,10 @@
\def\dodoFLOWconnection[#1][#2]#3%
{\ignorespaces}
-\def\doFLOWconnect%
+\def\doFLOWconnect
{\connection}
-\def\doFLOWlocate%
+\def\doFLOWlocate
{\location}
\def\doFLOWexit[#1]#2%
@@ -300,26 +302,19 @@
\popmacro\includeFLOWx
\popmacro\includeFLOWy}
-%\def\setFLOWlocation#1,#2\end%
-% {\scratchcounter=0#1\advance\scratchcounter\includeFLOWx
-% \xdef\FLOWlocation{\the\scratchcounter}%
-% \scratchcounter=0#2\advance\scratchcounter\includeFLOWy
-% \xdef\FLOWlocation{\FLOWlocation,\the\scratchcounter}}
-
\def\resetFLOWlocation
- {\gdef\lastFLOWx{0}%
- \gdef\lastFLOWy{0}}
+ {\globallet\lastFLOWx\!!zerocount
+ \globallet\lastFLOWy\!!zerocount}
\def\dosetFLOWlocation[#1#2]#3#4%
{\processaction
[#1#2]
- [ +=>\scratchcounter=#4\advance\scratchcounter+1,
- -=>\scratchcounter=#4\advance\scratchcounter-1,
- +#2=>\scratchcounter=#4\advance\scratchcounter+#2,
- -#2=>\scratchcounter=#4\advance\scratchcounter-#2,
- \s!default=>\scratchcounter=#4,
- \s!unknown=>\scratchcounter=0#1#2]%
- \advance\scratchcounter#3%
+ [ +=>\scratchcounter\numexpr#4+ 1+#3\relax,
+ -=>\scratchcounter\numexpr#4- 1+#3\relax,
+ +#2=>\scratchcounter\numexpr#4+#2+#3\relax,
+ -#2=>\scratchcounter\numexpr#4-#2+#3\relax,
+ \s!default=>\scratchcounter\numexpr#4 +#3\relax,
+ \s!unknown=>\scratchcounter\numexpr0#1#2+#3\relax]%
\xdef#4{\the\scratchcounter}}
\def\setFLOWlocation#1,#2\end
@@ -340,8 +335,8 @@
{\donefalse
\let\cFLOWfrom\empty
\let\cFLOWto\empty
- \def\zFLOWfrom{0}%
- \def\zFLOWto{0}%
+ \let\zFLOWfrom\!!zerocount
+ \let\zFLOWto\!!zerocount
\handletokens#1\with\doFLOWsetconnect
\ifx\cFLOWto\empty\let\cFLOWfrom\empty\fi}
@@ -404,7 +399,7 @@
\ifFLOWscaling
\doifnothing{\@@FLOWmaxwidth }{\let\@@FLOWmaxwidth \maxdimen}%
\doifnothing{\@@FLOWmaxheight}{\let\@@FLOWmaxheight\maxdimen}%
- \scratchcounter=\bodyfontpoints
+ \scratchcounter\bodyfontpoints
\doloop % NOG FONTSWITCH OM EX EN EM TE LATEN WERKEN
{\ifnum\scratchcounter>1 % NU DIMENSIONS IN TERMS OF BODYFONTSIZE
\bodyfontsize=\the\scratchcounter pt
@@ -492,23 +487,7 @@
connection_smooth_size := \@@FLOLradius ;
connection_arrow_size := \@@FLOLradius ;
connection_dash_size := \@@FLOLradius ;
-% \stopMPdrawing
-% \def\getFLOWlocationX##1,##2\end%
-% {\ifnum0##1>\FLOWwidth \xdef\FLOWwidth {##1}\fi
-% \ifnum0##2>\FLOWheight\xdef\FLOWheight{##2}\fi}%
-% \long\def\startFLOWcellX##1\stopFLOWcell%
-% {\resetFLOWcell
-% \ignorespaces##1\unskip
-% \expandafter\getFLOWlocationX\FLOWlocation\end
-% \ignorespaces}%
-% \let\startFLOWcell\startFLOWcellX
-% \resetFLOWlocation
-% \processFLOWbuffer\currentFLOWnumber
-% \ifnum\@@FLOWnx\@@FLOWny=11 % listig
-% \let\@@FLOWnx\FLOWwidth
-% \let\@@FLOWny\FLOWheight
-% \fi
-% \startMPdrawing
+ currentpicture := nullpicture ;
begin_chart(0,\FLOWwidth,\FLOWheight);
reverse_y := true ;
chart_offset := \@@FLOW@@offset ;
@@ -1026,7 +1005,8 @@
\ifnum\!!counta<1 \!!counta=1 \fi
\edef#4{\the\!!counta}%
\else
- \def#1{1}\def#4{0}% no {1}
+ \let#1\!!plusone
+ \let#4\!!zerocount % no {1}
\fi}
% \useFLOWchart[name][parent][setting,setting][additional settings]
@@ -1086,8 +1066,8 @@
\def\dogetFLOWsize[#1][#2]%
{\setbox\scratchbox=\vbox
- {\xdef\FLOWmaxwidth {0}%
- \xdef\FLOWmaxheight{0}%
+ {\globallet\FLOWmaxwidth \!!zerocount
+ \globallet\FLOWmaxheight\!!zerocount
\def\getFLOWlocation##1,##2\end
{\ifnum0##1>\FLOWmaxwidth \xdef\FLOWmaxwidth {##1}\fi
\ifnum0##2>\FLOWmaxheight\xdef\FLOWmaxheight{##2}\fi}%
diff --git a/tex/context/base/m-graph.mkii b/tex/context/base/m-graph.mkii
new file mode 100644
index 000000000..db7538e98
--- /dev/null
+++ b/tex/context/base/m-graph.mkii
@@ -0,0 +1,72 @@
+%D \module
+%D [ file=m-graph,
+%D version=2000.08.06,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\METAPOST\ graph module support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D I finally finished graph support, if only because I could
+%D not stand the idea that Karel Wesseling would revert to
+%D \PiCTeX.
+
+% pre 2000.08.06 version
+%
+% \forceMPTEXgraphictrue
+%
+% \startMPinitializations
+% initialize_numbers ; % make sure that pseudo typesetting is set up
+% input graph ; % load the graph package
+% Autoform := "@g" ; % change the % template char into @
+% \stopMPinitializations
+
+%D The latest version does things more automatically (and
+%D efficiently when no text processing is needed). For
+%D definitions embedded in your document, you need to
+%D use \type {@} as template character, in external files,
+%D \type {%} is also supported.
+
+\startMPinclusions
+ input graph ;
+\stopMPinclusions
+
+%D Graphics that have \type {begingraph} in them are
+%D recognized as such and force handling of embedded \TEX\
+%D code.
+
+\forceMPTEXcheck{begingraph}
+
+%D If you run into troubles, try:
+%D
+%D \starttyping
+%D \forceMPTEXgraphictrue
+%D \stoptyping
+%D
+%D A demo can be run with:
+%D
+%D \starttyping
+%D texexec --mode=demo --pdf m-graph
+%D \stoptyping
+
+\startMPinclusions
+ % @# is X_ or Y_; $ is Gxcvlin_ or Gycvlin_; l and h are numeric or string
+ % It would not be OK to set (@#low,@#high) to a pair expression because $ might
+ % try to rescale @#low when evaluating the right-hand side for @#high.
+ vardef Gsetr_@\#(suffix $)(expr l, h) =
+ Gclbnds_@\# ;
+ if @\#ctyp>0 :
+ @\#low = if abs @\#ctyp<>log: $ fi Mlog_Str l ;
+ @\#high = if abs @\#ctyp<>log: $ fi Mlog_Str h ;
+ else :
+ -@\#high = if abs @\#ctyp<>log: $ fi Mlog_Str l ;
+ -@\#low = if abs @\#ctyp<>log: $ fi Mlog_Str h ;
+ fi
+ enddef ;
+\stopMPinclusions
+
+\endinput
diff --git a/tex/context/base/m-graph.mkiv b/tex/context/base/m-graph.mkiv
new file mode 100644
index 000000000..39a1271d7
--- /dev/null
+++ b/tex/context/base/m-graph.mkiv
@@ -0,0 +1,63 @@
+%D \module
+%D [ file=m-graph,
+%D version=2008.09.08,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\METAPOST\ graph module support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% We just assume lua specification instead of the graph ones that
+% are limited by what mp can do. We support @ as replacement for
+% the percent symbol. We also add a specifier when no one is given.
+
+\startluacode
+ local function strip(s)
+ return "\times10^{"..(s:gsub("%+*0*","")).."}"
+ end
+ function metapost.format_n(fmt,str)
+ fmt = fmt:gsub("@","%%")
+ local initial, format, final = fmt:match("^(.-)(%%.-[%a])(.-)$")
+ if format then
+ str = fmt:format(str)
+ str = str:gsub("e(.-)$",strip)
+ str = ("%s\\mathematics{%s}%s"):format(initial,str,final)
+ elseif not fmt:find("%%") then
+ str = ("%"..fmt):format(str)
+ str = str:gsub("e(.-)$",strip)
+ str = ("\\mathematics{%s}"):format(str)
+ end
+ tex.sprint(str)
+ end
+\stopluacode
+
+\unexpanded\long\def\MPgraphformat#1#2{\ctxlua{metapost.format_n("#1","#2")}}
+
+\startMPinclusions
+ input graph.mp ;
+ vardef escaped_format(expr s) =
+ "" for n=1 upto length(s) : &
+ if ASCII substring (n,n+1) of s = 37 :
+ "@"
+ else :
+ substring (n,n+1) of s
+ fi
+ endfor
+ enddef ;
+ vardef dofmt_@\#(expr f, x) =
+ textext("\MPgraphformat{"&escaped_format(f)&"}{"&(if string x : x else: decimal x fi)&"}")
+ enddef ;
+
+ % vardef format(expr f, x) =
+ % textext("\MPgraphformatN{"&escaped_format(f)&"}{"&(if string x : x else: decimal x fi)&"}")
+ % enddef;
+ % vardef Mformat(expr f, x) =
+ % format(f,x)
+ % enddef;
+\stopMPinclusions
+
+\endinput
diff --git a/tex/context/base/m-graph.tex b/tex/context/base/m-graph.tex
index dd30cef46..6f71cca3c 100644
--- a/tex/context/base/m-graph.tex
+++ b/tex/context/base/m-graph.tex
@@ -11,47 +11,79 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D I finally finished graph support, if only because I could
-%D not stand the idea that Karel Wesseling would revert to
-%D \PiCTeX.
+\loadmarkfile{m-graph}
-% pre 2000.08.06 version
-%
-% \forceMPTEXgraphictrue
-%
-% \startMPinitializations
-% initialize_numbers ; % make sure that pseudo typesetting is set up
-% input graph ; % load the graph package
-% Autoform := "@g" ; % change the % template char into @
-% \stopMPinitializations
+\doifnotmode {demo} {\endinput}
+
+%D You need to have the data files in your path,
+%D otherwise the run is aborted.
+
+\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end}
+
+%D The test:
-%D The latest version does things more automatically (and
-%D efficiently when no text processing is needed). For
-%D definitions embedded in your document, you need to
-%D use \type {@} as template character, in external files,
-%D \type {%} is also supported.
+\starttext
-\startMPinitializations
- input graph ;
-\stopMPinitializations
+\startMPpage
+draw begingraph(3in,2in);
+ gdraw "agepop91.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ gdraw "agepop91.d" plot btex$\bullet$etex;
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ gdraw "agepopm.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ setrange(origin, whatever,whatever);
+ gdraw "agepopm.d";
+ endgraph;
+\stopMPpage
-%D Graphics that have \type {begingraph} in them are
-%D recognized as such and force handling of embedded \TEX\
-%D code.
+\startMPpage
+draw begingraph(2.3in,2in);
+ setcoords(log,log);
+ glabel.lft(btex Seconds etex,OUT);
+ glabel.bot(btex Matrix size etex,
+ OUT);
+ gdraw "matmul.d" dashed evenly;
+ glabel.ulft(btex Standard etex,8);
+ gdraw "matmul.d";
+ glabel.lrt(btex Strassen etex,7);
+ endgraph;
+\stopMPpage
-\forceMPTEXcheck{begingraph}
+\startMPpage
+draw begingraph(6.5cm,4.5cm);
+ setrange(80,0, 90,whatever);
+ glabel.bot(btex Year etex, OUT);
+ glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+ \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+ gdraw "lead.d" withpen pencircle scaled 1.5pt;
+ autogrid(,otick.lft);
+ setcoords(linear,linear);
+ setrange(80,0, 90,whatever);
+ glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+ \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+ gdraw "lead.d";
+ autogrid(otick.bot,otick.rt);
+ endgraph;
+\stopMPpage
-%D If you run into troubles, try:
-%D
-%D \starttyping
-%D \forceMPTEXgraphictrue
-%D \stoptyping
-%D
-%D A demo can be run with:
-%D
-%D \starttyping
-%D texexec --mode=demo --pdf m-graph
-%D \stoptyping
+\stoptext
% No longer needed, since John will fix it.
%
@@ -141,92 +173,3 @@
% string everybegingraph ;
% % everybegingraph := "setrange(0,0,20000,20000)" ;
% fi ;
-
-\startMPinitializations
- % @# is X_ or Y_; $ is Gxcvlin_ or Gycvlin_; l and h are numeric or string
- % It would not be OK to set (@#low,@#high) to a pair expression because $ might
- % try to rescale @#low when evaluating the right-hand side for @#high.
- vardef Gsetr_@\#(suffix $)(expr l, h) =
- Gclbnds_@\# ;
- if @\#ctyp>0 :
- @\#low = if abs @\#ctyp<>log: $ fi Mlog_Str l ;
- @\#high = if abs @\#ctyp<>log: $ fi Mlog_Str h ;
- else :
- -@\#high = if abs @\#ctyp<>log: $ fi Mlog_Str l ;
- -@\#low = if abs @\#ctyp<>log: $ fi Mlog_Str h ;
- fi
- enddef ;
-\stopMPinitializations
-
-\doifnotmode {demo} {\endinput}
-
-%D You need to have the data files in your path,
-%D otherwise the run is aborted.
-
-\doiffileelse {agepop91.d}
- {} {\writestatus{graph}{no data files found}\wait\end}
-
-%D The test:
-
-\starttext
-
-\startMPpage
-draw begingraph(3in,2in);
- gdraw "agepop91.d";
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(3in,2in);
- gdraw "agepop91.d" plot btex$\bullet$etex;
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(3in,2in);
- glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
- glabel.bot(btex Age in years etex, OUT);
- gdraw "agepopm.d";
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(3in,2in);
- glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
- glabel.bot(btex Age in years etex, OUT);
- setrange(origin, whatever,whatever);
- gdraw "agepopm.d";
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(2.3in,2in);
- setcoords(log,log);
- glabel.lft(btex Seconds etex,OUT);
- glabel.bot(btex Matrix size etex,
- OUT);
- gdraw "matmul.d" dashed evenly;
- glabel.ulft(btex Standard etex,8);
- gdraw "matmul.d";
- glabel.lrt(btex Strassen etex,7);
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(6.5cm,4.5cm);
- setrange(80,0, 90,whatever);
- glabel.bot(btex Year etex, OUT);
- glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
- \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
- gdraw "lead.d" withpen pencircle scaled 1.5pt;
- autogrid(,otick.lft);
- setcoords(linear,linear);
- setrange(80,0, 90,whatever);
- glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
- \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
- gdraw "lead.d";
- autogrid(otick.bot,otick.rt);
- endgraph;
-\stopMPpage
-
-\stoptext
diff --git a/tex/context/base/m-mkivhacks.tex b/tex/context/base/m-mkivhacks.tex
new file mode 100644
index 000000000..f47658739
--- /dev/null
+++ b/tex/context/base/m-mkivhacks.tex
@@ -0,0 +1,52 @@
+%D \module
+%D [ file=m-mkivhacks,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Temporary Compatilibility Hacks,
+%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.
+
+\doifnotmode{mkiv}{\endinput}
+
+%D For Aditya, who needed it for his thesis.
+
+\startluacode
+ -- -- a lot or work
+ --
+ -- mathematics.slots.euler = {
+ -- [0x03B1] = { "mr", 0x0B }, -- alpha
+ -- }
+ --
+ -- mathematics.slots.euler = table.merge(mathematics.slots.traditional,mathematics.slots.euler)
+ --
+ -- versus a quick hack
+
+ document.hacks = document.hacks or { }
+
+ function document.hacks()
+ mathematics.families.lcgreek = mathematics.families.mr
+ mathematics.families.ucgreek = mathematics.families.mr
+ mathematics.families.vargreek = mathematics.families.mr
+
+ mathematics.define(mathematics.slots.euler)
+ end
+\stopluacode
+
+% \usemodule[mkivhacks] \setups{eulermath}
+% \definetypeface[modern][mm][math][euler][default]
+% \usemathcollection[eul]
+% \switchtobodyfont[modern,11pt]
+% \starttext
+% $\alpha$
+% \stoptext
+
+\startsetups eulermath
+ \ctxlua{document.hacks()}
+\stopsetups
+
+\endinput
diff --git a/tex/context/base/m-timing.tex b/tex/context/base/m-timing.tex
index 792cc67f4..5f543042a 100644
--- a/tex/context/base/m-timing.tex
+++ b/tex/context/base/m-timing.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\doifnotmode{mkiv}{\endinput}
+
\ifx\ShowNamedUsage\undefined \else \endinput \fi
%D Written at the end of 2007, this module is dedicated to Taco. Reaching this
diff --git a/tex/context/base/m-translate.tex b/tex/context/base/m-translate.tex
new file mode 100644
index 000000000..a11eef4bc
--- /dev/null
+++ b/tex/context/base/m-translate.tex
@@ -0,0 +1,88 @@
+%D \module
+%D [ file=m-translate,
+%D version=2008.10.09,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Translations,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\doifnotmode{mkiv}{\endinput}
+
+%D We can make this module more clever (wildcards and such) but since
+%D it's only a demo we stick to the simple case for now. After all, it's
+%D better to fix your source.
+
+\startluacode
+ translators = { }
+
+ local compiled, list = nil, nil
+
+ function translators.register(from,to)
+ local l = lpeg.P(from)/to
+ if not list then
+ list = l
+ else
+ list = list + l
+ end
+ compiled = nil
+ end
+
+ function translators.translate(s)
+ if list then
+ if not compiled then
+ compiled = lpeg.Cs((list + lpeg.P(1))^0)
+ end
+ return compiled:match(s)
+ else
+ return s
+ end
+ end
+
+ function translators.reset(s)
+ input.filters.user_translator = nil
+ list, compiled = nil, nil
+ end
+ function translators.enable(s)
+ input.filters.user_translator = translators.translate
+ end
+ function translators.disable(s)
+ input.filters.user_translator = nil
+ end
+\stopluacode
+
+\unprotect
+
+\def\translateinput{\dodoubleargument\dotranslateinput}
+
+\def\dotranslateinput[#1][#2]{\ctxlua{translators.register(\!!bs#1\!!es,\!!bs#2\!!es)}}
+
+\def\resetinputtranslation {\ctxlua{translators.reset()}}
+\def\enableinputtranslation {\ctxlua{translators.enable()}}
+\def\disableinputtranslation{\ctxlua{translators.disable()}}
+
+\def\readtranslatedfile#1%
+ {\enableinputtranslation
+ \readfile{#1}\donothing\donothing
+ \disableinputtranslation}
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+ \translateinput[Moica][Mojca]
+ \translateinput[Idris][Idris (aka ادريس)]
+
+ \enableinputtranslation
+
+ Well, it's not that hard to satisfy Idris and Moica.
+
+ \readtranslatedfile{tufte}
+
+\stoptext
diff --git a/tex/context/base/math-ini.lua b/tex/context/base/math-ini.lua
index 81d545ba7..73b8852b3 100644
--- a/tex/context/base/math-ini.lua
+++ b/tex/context/base/math-ini.lua
@@ -404,7 +404,7 @@ mathematics.slots.traditional = {
[0x22C3] = { "ex", 0x53 }, -- bigcup
[0x22C4] = { "sy", 0x05 }, -- diamond
[0x22C5] = { "sy", 0x01 }, -- cdot
- [0x22C6] = { "sy", 0x3F }, -- star
+ [0x22C6] = { "mi", 0x3F }, -- star
[0x25B3] = { "sy", 0x34 }, -- triangle up
[0x2220] = { "ma", 0x5C }, -- angle
diff --git a/tex/context/base/math-ini.tex b/tex/context/base/math-ini.tex
index 7ffef6bb8..98738e500 100644
--- a/tex/context/base/math-ini.tex
+++ b/tex/context/base/math-ini.tex
@@ -64,8 +64,6 @@
% Simple variant:
%
-% \beginETEX \ifcsname
-%
% \def\dohandlemathtoken#1%
% {\csname\@mt@
% \ifcsname\@mt@\mathcollection#1\endcsname
@@ -74,24 +72,6 @@
% \nomathcollection
% \fi\fi
% #1\endcsname}
-%
-% \endETEX
-%
-% \beginTEX
-%
-% \def\dohandlemathtoken#1%
-% {\csname\@mt@
-% \@EA\ifx\csname\@mt@\mathcollection#1\endcsname\relax
-% \@EA\ifx\csname\@mt@\nomathcollection#1\endcsname\relax
-% \else
-% \nomathcollection
-% \fi
-% \else
-% \mathcollection
-% \fi
-% #1\endcsname}
-%
-% \endTEX
%D Because a command can have a different meaning in math
%D and in text mode, we provide a selector. We also provide
@@ -105,8 +85,6 @@
% More clever layout:
%
-% \beginETEX \ifcsname
-%
% \def\dohandlemathtoken#1%
% {\csname
% \ifmmode
@@ -128,41 +106,8 @@
% \fi
% #1\endcsname}
%
-% \endETEX
-%
-% \beginTEX
-%
-% \def\dohandlemathtoken#1%
-% {\csname
-% \ifmmode
-% \@EA\ifx\csname\@mt@\mathcollection#1\endcsname\relax
-% \@EA\ifx\csname\@mt@\nomathcollection#1\endcsname\relax
-% \@EA\ifx\csname\characterencoding#1\endcsname\relax
-% \nocharacterencoding
-% \else
-% \characterencoding
-% \fi
-% \else
-% \@mt@\nomathcollection
-% \fi
-% \else
-% \@mt@\mathcollection
-% \fi
-% \else
-% \@EA\ifx\csname\characterencoding#1\endcsname\relax
-% \nocharacterencoding
-% \else
-% \characterencoding
-% \fi
-% \fi
-% #1\endcsname}
-%
-% \endTEX
-%
% fallback to math when in text mode (handy for unicode vectors)
-\beginETEX
-
\def\dohandlemathtoken#1%
{\csname
\ifmmode
@@ -190,57 +135,12 @@
\fi
#1\endcsname}
-\endETEX
-
-\beginTEX
-
-\def\dohandlemathtoken#1%
- {\csname
- \ifmmode
- \@EA\ifx\csname\@mt@\mathcollection#1\endcsname\relax
- \@EA\ifx\csname\@mt@\nomathcollection#1\endcsname\relax
- \@EA\ifx\csname\characterencoding#1\endcsname\relax
- \nocharacterencoding
- \else
- \characterencoding
- \fi
- \else
- \@mt@\nomathcollection
- \fi
- \else
- \@mt@\mathcollection
- \fi
- \else
- \@EA\ifx\csname\characterencoding#1\endcsname\relax
- \@EA\ifx\csname\nocharacterencoding#1\endcsname\relax
- \@EA\ifx\csname\@mt@\mathcollection#1\endcsname\relax
- \@EA\ifx\csname\@mt@\nomathcollection#1\endcsname\relax
- \nocharacterencoding
- \else
- \strippedcsname\mathematics\expandafter\endcsname\csname\@mt@\nomathcollection
- \fi
- \else
- \strippedcsname\mathematics\expandafter\endcsname\csname\@mt@\mathcollection
- \fi
- \else
- \nocharacterencoding
- \fi
- \else
- \characterencoding
- \fi
- \fi
- #1\endcsname}
-
-\endTEX
-
%D Now we redefine the text encoding handler.
%D A better fallback:
% Just ETEX which is the default nowadays.
-\beginETEX \ifcsname
-
\def\dohandlemathtoken#1%
{\csname
\ifmmode
@@ -272,8 +172,6 @@
\fi
#1\endcsname}
-\endETEX
-
\let\dohandlecommand\dohandlemathtoken
\def\definefamilysynonym
@@ -291,8 +189,6 @@
\def\purefamily #1{\csname \truefamily{#1}\mathsubfamily\s!fam\endcsname}
\def\purefamilyhex#1{\csname hex\truefamily{#1}\mathsubfamily\s!fam\endcsname}
-\beginETEX \ifcsname
-
\def\truefamily#1%
{\ifcsname\@mf@\mathcollection#1\endcsname
\@EA\truefamily\csname\@mf@\mathcollection#1\endcsname
@@ -304,27 +200,6 @@
#1%
\fi\fi\fi}
-\endETEX
-
-\beginTEX
-
-\def\truefamily#1%
- {\@EA\ifx\csname\@mf@\mathcollection#1\endcsname\relax
- \@EA\ifx\csname\@mf@#1\endcsname\relax
- \@EA\ifx\csname\@mf@\nomathcollection#1\endcsname\relax
- #1%
- \else
- \@EA\truefamily\csname\@mf@\nomathcollection#1\endcsname
- \fi
- \else
- \@EA\truefamily\csname\@mf@#1\endcsname
- \fi
- \else
- \@EA\truefamily\csname\@mf@\mathcollection#1\endcsname
- \fi}
-
-\endTEX
-
\newif\ifdynamicmathfamilies \dynamicmathfamiliestrue % true per 2003.11.25; needed for mixed bold math
\let\normalpurefamilyhex\purefamilyhex
diff --git a/tex/context/base/math-lbr.tex b/tex/context/base/math-lbr.tex
index 3df4a36d0..ecc3632b1 100644
--- a/tex/context/base/math-lbr.tex
+++ b/tex/context/base/math-lbr.tex
@@ -420,6 +420,13 @@
\def\LBRbiggg{\@@dobig{17.72}}
\def\LBRBiggg{\@@dobig{21.25}}
+% \def\LBRbig {\@@dobig{0.820}}
+% \def\LBRBig {\@@dobig{1.080}}
+% \def\LBRbigg {\@@dobig{1.342}}
+% \def\LBRBigg {\@@dobig{1.603}}
+% \def\LBRbiggg{\@@dobig{1.772}}
+% \def\LBRBiggg{\@@dobig{2.125}}
+
\startrawmathcollection[lbr]
\definemathcommand [big] {\LBRbig}
diff --git a/tex/context/base/meta-ini.mkii b/tex/context/base/meta-ini.mkii
index f7651f821..cb59ed44b 100644
--- a/tex/context/base/meta-ini.mkii
+++ b/tex/context/base/meta-ini.mkii
@@ -165,27 +165,11 @@
\let\@@framed\s!unknown
-% \def\MPvariable#1%
-% {\getvalue{\ifundefined{\@@framed\@@meta#1}\else\@@framed\fi\@@meta#1}}
-
-\beginTEX
-
-\def\MPvariable#1%
- {\csname
- \@EA\ifx\csname\@@framed\@@meta#1\endcsname\relax\else\@@framed\fi\@@meta#1%
- \endcsname}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\MPvariable#1%
{\csname
\ifcsname\@@framed\@@meta#1\endcsname\@@framed\fi\@@meta#1%
\endcsname}
-\endETEX
-
\let\MPvar\MPvariable
\let\setMPvariables\setupMPvariables
@@ -286,6 +270,9 @@
\elabelgroup}
\let\stopuniqueMPcode \relax % so that we can use it in \expanded
+
+\def\includeMPgraphic#1%
+ {\executeifdefined{\@@MPG#1};} % ; if not found
\long\def\handleuseMPgraphic#1#2#3%
{\blabelgroup
@@ -513,9 +500,9 @@
\def\getMPdata
{\long\def\MPdata##1##2{\ifnum##1=\currentMPgraphic\relax##2\fi}%
\startreadingfile
- \startnointerference
+ % \startnointerference % no, else we need to do all data global
\readlocfile\MPdataMPDfile\donothing\donothing
- \stopnointerference
+ % \stopnointerference
\stopreadingfile}
%D We have to enable this mechanism with:
@@ -1064,7 +1051,11 @@
\resetlanguagespecifics
\to \everyMPgraphic
-% Done.
+%D Goody for preventing overflows:
+
+\def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}
+
+%D Done.
\protect \endinput
diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv
index 78c626272..8d2f7a724 100644
--- a/tex/context/base/meta-ini.mkiv
+++ b/tex/context/base/meta-ini.mkiv
@@ -156,7 +156,7 @@
{\elabelgroup\secondoftwoarguments}}
\def\includeMPgraphic#1%
- {\executeifdefined{\@@MPG#1};}
+ {\executeifdefined{\@@MPG#1};} % ; if not found
\def\enableincludeMPgraphics
{\let\handleuseMPgraphic \secondoftwoarguments
@@ -621,9 +621,9 @@
\def\getMPdata
{\let\MPdata\secondoftwoarguments
\startreadingfile
- \startnointerference
+ % \startnointerference % no, else we need to do all data global
\readlocfile\MPdataMPDfile\donothing\donothing
- \stopnointerference
+ % \stopnointerference
\stopreadingfile}
%D \macros
@@ -1122,6 +1122,10 @@
\let\initializeMPgraphics\relax
-% Done.
+%D Goody for preventing overflows:
+
+\def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}
+
+%D Done.
\protect \endinput
diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua
index 68ecab994..39f24aa5b 100644
--- a/tex/context/base/meta-pdf.lua
+++ b/tex/context/base/meta-pdf.lua
@@ -216,12 +216,10 @@ end
function mptopdf.convertmpstopdf(name)
if mptopdf.loaded(name) then
- garbagecollector.push()
input.starttiming(mptopdf)
mptopdf.parse()
mptopdf.reset()
input.stoptiming(mptopdf)
- garbagecollector.pop()
else
tex.print("file " .. name .. " not found")
end
diff --git a/tex/context/base/meta-pdf.mkii b/tex/context/base/meta-pdf.mkii
index 51e01d8ed..d1a803604 100644
--- a/tex/context/base/meta-pdf.mkii
+++ b/tex/context/base/meta-pdf.mkii
@@ -1218,94 +1218,6 @@
%D We cannot use \type {\beginETEX} here since in plain we
%D get \type {\outer} problems, sigh.
-%OLD \beginTEX
-%OLD
-%OLD \def\MPcriteriumA {512pt} % scale
-%OLD \def\MPcriteriumB {2pt} % scale
-%OLD
-%OLD \endTEX
-%OLD
-%OLD \ifx\MPcriteriumA\undefined
-%OLD
-%OLD \newdimen\MPcriteriumA \MPcriteriumA=512pt
-%OLD \newdimen\MPcriteriumB \MPcriteriumB= 2pt
-%OLD
-%OLD \fi
-
-%OLD \def\doMPconcat#1#2#3#4%
-%OLD {\dimen12=#1\onepoint % p_x
-%OLD \dimen14=#3\onepoint % p_y
-%OLD %
-%OLD \chardef\MPfactor\zerocount
-%OLD \ifdim\dimen4<\MPcriteriumB\ifdim\dimen4>-\MPcriteriumB
-%OLD \ifdim\dimen6<\MPcriteriumB\ifdim\dimen6>-\MPcriteriumB
-%OLD \ifdim\dimen8<\MPcriteriumB\ifdim\dimen8>-\MPcriteriumB
-%OLD \ifdim\dimen10<\MPcriteriumB\ifdim\dimen10>-\MPcriteriumB
-%OLD \chardef\MPfactor\plusone
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \ifcase\MPfactor % spurious 0 removed
-%OLD \chardef\MPfactor\plusone
-%OLD \ifdim\dimen12<\MPcriteriumA\ifdim\dimen12>-\MPcriteriumA
-%OLD \ifdim\dimen14<\MPcriteriumA\ifdim\dimen14>-\MPcriteriumA
-%OLD \chardef\MPfactor16
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \fi
-%OLD %
-%OLD \multiply\dimen12 \MPfactor
-%OLD \multiply\dimen14 \MPfactor
-%OLD %
-%OLD \doMPreducedimen12
-%OLD \doMPreducedimen14
-%OLD %
-%OLD \dimen16 \dimen 0
-%OLD \multiply \dimen16 \dimen 6
-%OLD \dimen20 \dimen 2
-%OLD \multiply \dimen20 \dimen 4
-%OLD \advance \dimen16 -\dimen20
-%OLD %
-%OLD \dimen18 \dimen12
-%OLD \multiply \dimen18 \dimen 6
-%OLD \dimen20 \dimen14
-%OLD \multiply \dimen20 \dimen 4
-%OLD \advance \dimen18 -\dimen20
-%OLD \dimen20 \dimen 4
-%OLD \multiply \dimen20 \dimen10
-%OLD \advance \dimen18 \dimen20
-%OLD \dimen20 \dimen 6
-%OLD \multiply \dimen20 \dimen 8
-%OLD \advance \dimen18 -\dimen20
-%OLD %
-%OLD \multiply \dimen12 -\dimen 2
-%OLD \multiply \dimen14 \dimen 0
-%OLD \advance \dimen12 \dimen14
-%OLD \dimen20 \dimen 2
-%OLD \multiply \dimen20 \dimen 8
-%OLD \advance \dimen12 \dimen20
-%OLD \dimen20 \dimen 0
-%OLD \multiply \dimen20 \dimen10
-%OLD \advance \dimen12 -\dimen20
-%OLD %
-%OLD \ifdim\dimen16=\onepoint \else
-%OLD \ifdim\dimen16>\MPconcatfactor \onepoint \relax
-%OLD \doMPreducedimen16
-%OLD \divide \dimen18 \dimen16 \doMPexpanddimen18
-%OLD \divide \dimen12 \dimen16 \doMPexpanddimen12
-%OLD \else
-%OLD \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
-%OLD \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
-%OLD \fi
-%OLD \fi
-%OLD %
-%OLD \divide\dimen18 \MPfactor
-%OLD \divide\dimen12 \MPfactor
-%OLD %
-%OLD \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
-%OLD \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
-
%D DHL: Ideally, $r_x$, $r_y$, $s_x$, $s_y$ should be in macros, not
%D dimensions (they are scalar quantities after all, not lengths). I
%D suppose the authors decided to do calculations with integer
diff --git a/tex/context/base/meta-pdf.tex b/tex/context/base/meta-pdf.tex
index d5b7f202f..8bf976f97 100644
--- a/tex/context/base/meta-pdf.tex
+++ b/tex/context/base/meta-pdf.tex
@@ -74,7 +74,7 @@
%D \pdfclippedimage {file} {l} {r} {t} {b}
%D \stoptyping
-\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13 % still relevant?
\def\pdfimage#1#%
{\dopdfimage{#1}}
@@ -592,7 +592,26 @@
\newcount\currentPDFshade % 0 % global (document wide) counter
-\def\dosetMPlinearshade#1%
+% \def\dosetMPsomePDFshade#1#2% generic but needs refs
+% {\global\advance\currentPDFshade \plusone
+% \doPDFdictionaryobject{FDF}{ftn:Sh:\the\currentPDFshade}
+% {/FunctionType 2
+% /Domain [\gMPs1 \gMPs2]
+% /C0 [\MPshadeA]
+% /C1 [\MPshadeB]
+% /N \gMPs3}%
+% \doPDFgetobjectreference{FDF}{ftn:Sh:\the\currentPDFshade}\PDFobjectreference
+% \doPDFdictionaryobject{FDF}{obj:Sh:\the\currentPDFshade}
+% {/ShadingType #1
+% /ColorSpace /\MPresolvedspace
+% /Function \PDFobjectreference\space
+% /Coords [\MPshadeC]
+% /Extend [true true]}%
+% \doPDFgetobjectreference{FDF}{obj:Sh:\the\currentPDFshade}\PDFobjectreference
+% \appendtoPDFdocumentshades{/Sh\the\currentPDFshade\space\PDFobjectreference}%
+% \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
+
+\def\dosetMPsomePDFshade#1#2%
{\immediate\pdfobj
{<>}%
\immediate\pdfobj
- {<>}%
\global\advance\currentPDFshade \plusone
\appendtoPDFdocumentshades{/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }%
- \setxvalue{\@@MPSK#1}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
+ \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
+
+\def\dosetMPlinearshade {\dosetMPsomePDFshade2}% #1
+\def\dosetMPcircularshade{\dosetMPsomePDFshade3}% #1
\defineMPspecial{30}
{\expanded{\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
@@ -615,53 +637,37 @@
\edef\MPshadeC{\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}}%
\dosetMPlinearshade{\gMPs{14}}}
-\defineMPspecial{32}
- {\expanded{\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
- \expanded{\resolveMPcmykcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
- \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
- \dosetMPlinearshade{\gMPs{16}}}
-
-\defineMPspecial{34}
- {\expanded{\resolveMPspotcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
- \expanded{\resolveMPspotcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
- \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
- \dosetMPlinearshade{\gMPs{16}}}
-
-\def\dosetMPcircularshade#1%
- {\immediate\pdfobj
- {<>}%
- \immediate\pdfobj
- {<>}%
- \global\advance\currentPDFshade \plusone
- \appendtoPDFdocumentshades{/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }%
- \setxvalue{\@@MPSK#1}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
-
\defineMPspecial{31}
{\expanded{\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
\expanded{\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}
+ {\expanded{\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+ \expanded{\resolveMPcmykcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
+ \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
+ \dosetMPlinearshade{\gMPs{16}}}
+
\defineMPspecial{33}
{\expanded{\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
\expanded{\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}
+ {\expanded{\resolveMPspotcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+ \expanded{\resolveMPspotcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
+ \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
+ \dosetMPlinearshade{\gMPs{16}}}
+
\defineMPspecial{35}
{\expanded{\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
\expanded{\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%
diff --git a/tex/context/base/meta-tex.mkiv b/tex/context/base/meta-tex.mkiv
index 6afc7efc5..a1d7aced0 100644
--- a/tex/context/base/meta-tex.mkiv
+++ b/tex/context/base/meta-tex.mkiv
@@ -17,19 +17,32 @@
\long\def\doTeXtext[#1]#2{[do we need TeXtexts in MkIV]}
\long\def\TeXtext{\dosingleempty\doTeXtext}
-\def\definetextext[#1]#2{\setvalue{textext@@#1}{#2}}
-
% \definetextext[framed]{\framed}
%
% \startMPcode
% draw \sometxt[framed]{black} rotated 45 ;
% \stopMPcode
-\def\definetextext[#1]#2{\setvalue{@@st@@[#1]}{#2}}
+\def\definetextext[#1]#2{\setvalue{@@st@@[#1]}{#2}\setvalue{@@st@@[#1] }{#2}} % we don't grab spaces after [#1]
\long\def\sometxt#1#{\dosometxt{#1}} % grab optional [args]
\long\def\dosometxt#1#2%
- {textext("\ifcsname @@st@@#1\endcsname\csname @@st@@#1\endcsname{#2}\else#2\fi")}
+ {textext.drt("\ifcsname @@st@@#1\endcsname\csname @@st@@#1\endcsname{#2}\else#2\fi")}
+
+% Best use the mp macro instead since it provides positioning.
+%
+% \startuseMPgraphic{testgraphic}
+% draw \sometxt{\ruledhbox{\strut hans hagen}} scaled 3;
+% % draw textext.drt("\ruledhbox{\strut hans hagen}") scaled 3;
+% % draw textext.dlft("\ruledhbox{\strut hans hagen}") scaled 3;
+% % draw textext.lft("\ruledhbox{\strut hans hagen}") scaled 3;
+% draw llcorner currentpicture -- urcorner currentpicture withcolor yellow;
+% draw lrcorner currentpicture -- ulcorner currentpicture withcolor yellow;
+% draw boundingbox currentpicture withcolor blue ;
+% draw origin withcolor red withpen pencircle scaled 1pt;
+% \stopuseMPgraphic
+%
+% {\showstruts\useMPgraphic{testgraphic}}
\protect \endinput
diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua
index e8abf7087..a12db3d82 100644
--- a/tex/context/base/mlib-pdf.lua
+++ b/tex/context/base/mlib-pdf.lua
@@ -205,6 +205,8 @@ function metapost.flush(result,flusher) -- pdf flusher, table en dan concat is s
flusher.startfigure(fignum,llx,lly,urx,ury,"begin",figure)
t[#t+1] = "q"
if objects then
+ -- once we have multiple prescripts we can do more tricky things like
+ -- text and special colors at the same time
for o=1,#objects do
local object = objects[o]
local objecttype = object.type
diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua
index 998321798..3d5187c0f 100644
--- a/tex/context/base/mlib-pps.lua
+++ b/tex/context/base/mlib-pps.lua
@@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['mlib-pps'] = { -- prescript, pos
license = "see context related readme files",
}
+-- current limitation: if we have textext as well as a special color then due to
+-- prescript/postscript overload we can have problems
+
local format, concat, round = string.format, table.concat, math.round
local sprint = tex.sprint
@@ -39,12 +42,21 @@ function metapost.specials.register(str) -- only colors
data[#data+1] = s
end
class, n = tonumber(class), tonumber(n)
- if class == 3 or class == 4 or class == 5 then -- weird
+ if class == 3 or class == 4 or class == 5 then
+ -- hm, weird
+ else
+ n = tonumber(data[1])
+ end
+ if n then
colordata[class][n] = data
else
- colordata[class][tonumber(data[1])] = data
+ -- there is some bug to be solved, so we issue a message
+ logs.report("[msr bug] %s", str or "?")
end
end
+--~ if str:match("^%%%%MetaPostOption: multipass") then
+--~ metapost.multipass = true
+--~ end
end
function metapost.colorhandler(cs, object, result, colorconverter)
@@ -188,7 +200,13 @@ local function normalize(ca,cb)
end
end
+-- todo: check for the same colorspace (actually a backend issue), now we can
+-- have several similar resources
+--
+-- normalize(ca,cb) fails for spotcolors
+
function metapost.specials.cs(specification,object,result,flusher) -- spot colors?
+ -- a mess, not dynamic anyway
nofshades = nofshades + 1
flusher.flushfigure(result)
result = { }
@@ -204,6 +222,14 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color
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(tex.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]))
else
if #ca > #cb then
normalize(ca,cb)
@@ -218,6 +244,7 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color
if #ca == 4 then
ca[1], ca[2], ca[3] = cmyktorgb(ca[1],ca[2],ca[3],ca[4])
cb[1], cb[2], cb[3] = cmyktorgb(cb[1],cb[2],cb[3],cb[4])
+ ca[4], cb[4] = nil, nil
elseif #ca == 1 then
local a, b = 1-ca[1], 1-cb[1]
ca[1], ca[2], ca[3] = a, a, a
@@ -352,6 +379,18 @@ metapost.textext_current = metapost.first_box
metapost.trace_texttexts = false
metapost.multipass = false
+function metapost.free_boxes()
+ local tb = tex.box
+ for i = metapost.first_box,metapost.last_box do
+ local b = tb[i]
+ if b then
+ tb[i] = nil -- no node.flush_list(b) needed, else double free error
+ else
+ break
+ end
+ end
+end
+
function metapost.specials.tf(specification,object)
--~ print("setting", metapost.textext_current)
local n, str = specification:match("^(%d+):(.+)$")
@@ -373,7 +412,7 @@ function metapost.specials.ts(specification,object,result,flusher)
print("metapost", format("second pass: order %s, box %s",n,metapost.textext_current))
end
local op = object.path
- local first, second, fourth = op[1], op[2], op[4]
+ local first, second, fourth = op[1], op[2], op[4]
local tx, ty = first.x_coord , first.y_coord
local sx, sy = second.x_coord - tx, fourth.y_coord - ty
local rx, ry = second.y_coord - ty, fourth.x_coord - tx
@@ -607,15 +646,16 @@ do
local P, S, V, Cs = lpeg.P, lpeg.S, lpeg.V, lpeg.Cs
- local btex = P("btex")
- local etex = P(" etex")
- local vtex = P("verbatimtex")
- local ttex = P("textext")
- local gtex = P("graphictext")
- local spacing = S(" \n\r\t\v")^0
- local dquote = P('"')
+ local btex = P("btex")
+ local etex = P(" etex")
+ local vtex = P("verbatimtex")
+ local ttex = P("textext")
+ local gtex = P("graphictext")
+ local multipass = P("forcemultipass")
+ local spacing = S(" \n\r\t\v")^0
+ local dquote = P('"')
- local found = false
+ local found, forced = false, false
local function convert(str)
found = true
@@ -627,11 +667,15 @@ do
local function register()
found = true
end
+ local function force()
+ forced = true
+ end
local parser = P {
- [1] = Cs((V(2)/register + V(3)/convert + 1)^0),
+ [1] = Cs((V(2)/register + V(3)/convert + V(4)/force + 1)^0),
[2] = ttex + gtex,
[3] = (btex + vtex) * spacing * Cs((dquote/ditto + (1 - etex))^0) * etex,
+ [4] = multipass, -- experimental, only for testing
}
-- currently a a one-liner produces less code
@@ -639,15 +683,16 @@ do
local parser = Cs(((ttex + gtex)/register + ((btex + vtex) * spacing * Cs((dquote/ditto + (1 - etex))^0) * etex)/convert + 1)^0)
function metapost.check_texts(str)
- found = false
- return parser:match(str), found
+ found, forced = false, false
+ return parser:match(str), found, forced
end
end
-local factor = 65536*(7200/7227)
+--~ local factor = 65536*(7200/7227)
+local factor = 65536*(7227/7200)
-function metapost.edefsxsy(wd,ht,dp) -- helper for text
+function metapost.edefsxsy(wd,ht,dp) -- helper for figure
commands.edef("sx",(wd ~= 0 and 1/( wd /(factor))) or 0)
commands.edef("sy",(wd ~= 0 and 1/((ht+dp)/(factor))) or 0)
end
@@ -676,59 +721,30 @@ metapost.intermediate = metapost.intermediate or {}
metapost.intermediate.actions = metapost.intermediate.actions or {}
metapost.intermediate.needed = false
---~ function metapost.graphic_base_pass(mpsformat,str,preamble)
---~ local prepared, done = metapost.check_texts(str)
---~ metapost.textext_current = metapost.first_box
---~ metapost.intermediate.needed = false
---~ if done then
---~ current_format, current_graphic = mpsformat, prepared
---~ metapost.process(mpsformat, {
---~ preamble or "",
---~ "beginfig(1); ",
---~ "_trial_run_ := true ;",
---~ prepared,
---~ "endfig ;"
---~ }, true ) -- true means: trialrun
---~ if metapost.intermediate.needed then
---~ for _, action in pairs(metapost.intermediate.actions) do
---~ action()
---~ end
---~ end
---~ sprint(tex.ctxcatcodes,"\\ctxlua{metapost.graphic_extra_pass()}")
---~ else
---~ metapost.process(mpsformat, {
---~ preamble or "",
---~ "beginfig(1); ",
---~ "_trial_run_ := false ;",
---~ "resettextexts;",
---~ str,
---~ "endfig ;"
---~ } )
---~ end
---~ end
-
metapost.method = 1 -- 1:dumb 2:clever
function metapost.graphic_base_pass(mpsformat,str,preamble)
- local done_1, done_2
- str, done_1 = metapost.check_texts(str)
+ local done_1, done_2, forced_1, forced_2
+ str, done_1, forced_1 = metapost.check_texts(str)
if preamble then
- preamble, done_2 = metapost.check_texts(preamble)
+ preamble, done_2, forced_2 = metapost.check_texts(preamble)
else
- preamble, done_2 = "", false
+ preamble, done_2, forced_2 = "", false, false
end
metapost.textext_current = metapost.first_box
metapost.intermediate.needed = false
metapost.multipass = false -- no needed here
current_format, current_graphic = mpsformat, str
if metapost.method == 1 or (metapost.method == 2 and (done_1 or done_2)) then
+ -- first true means: trialrun, second true means: avoid extra run if no multipass
local flushed = metapost.process(mpsformat, {
preamble,
"beginfig(1); ",
"_trial_run_ := true ;",
str,
"endfig ;"
- }, true, nil, true ) -- true means: trialrun, true means: avoid extra run if no multipass
+ -- }, true, nil, true )
+ }, true, nil, not (forced_1 or forced_2))
if metapost.intermediate.needed then
for _, action in pairs(metapost.intermediate.actions) do
action()
@@ -748,12 +764,14 @@ function metapost.graphic_base_pass(mpsformat,str,preamble)
"endfig ;"
} )
end
+ -- here we could free the textext boxes
+ metapost.free_boxes()
end
function metapost.graphic_extra_pass()
metapost.textext_current = metapost.first_box
metapost.process(current_format, {
- "beginfig(0); ", -- why not 1
+ "beginfig(1); ",
"_trial_run_ := false ;",
concat(metapost.text_texts_data()," ;\n"),
current_graphic,
diff --git a/tex/context/base/mlib-pps.tex b/tex/context/base/mlib-pps.tex
index df325c316..546b94f28 100644
--- a/tex/context/base/mlib-pps.tex
+++ b/tex/context/base/mlib-pps.tex
@@ -20,6 +20,11 @@
\immediate\pdfobj{<>}%
\appendtoPDFdocumentshades{/MpSh#1 \the\pdflastobj\space0 R }}
+% \def\xMPLIBcircularshade#1#2#3#4#5#6#7% nr domain color-a color-b ? colorspace oordinates
+% {\immediate\pdfobj{<>}%
+% \immediate\pdfobj{<>}%
+% \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{<>}%
\immediate\pdfobj{<>}%
@@ -35,6 +40,9 @@
\def\MPLIBsettext#1% #2%
{\global\setbox#1\hbox}% {#2}}
+\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}%
@@ -42,7 +50,7 @@
% \pdfliteral{Q}}
\def\MPLIBgettextscaled#1#2#3%
- {\vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[sx=#2,sy=#3]{\raise\dp#1\box#1}\hss}}}
+ {\vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[sx=#2,sy=#3]{\raise\dp#1\copy#1}\hss}}}
\def\MPLIBallocate#1%
{\newbox\MPLIBfirst
@@ -52,8 +60,8 @@
\def\MPLIBregister
{\ctxlua{metapost.first_box, metapost.last_box = \number\MPLIBfirst, \number\MPLIBlast}}
-\appendtoks \MPLIBallocate{500}\to \everydump
-\appendtoks \MPLIBregister \to \everyjob
+\appendtoks \MPLIBallocate{1000}\to \everydump
+\appendtoks \MPLIBregister \to \everyjob
\def\MPLIBgraphictext#1%
{\startTEXpage[scale=10000]#1\stopTEXpage}
diff --git a/tex/context/base/mlib-run.lua b/tex/context/base/mlib-run.lua
index bfa9d0c11..1edd00be7 100644
--- a/tex/context/base/mlib-run.lua
+++ b/tex/context/base/mlib-run.lua
@@ -140,7 +140,7 @@ function metapost.reporterror(result)
metapost.report("mp terminal: %s",t)
end
if e then
- metapost.report("mp error: %s",e)
+ metapost.report("mp error: %s",(e=="" and "?") or e)
end
if not t and not e and l then
metapost.report("mp log: %s",l)
@@ -249,7 +249,10 @@ function metapost.process(mpx, data, trialrun, flusher, multipass)
input.stoptiming(metapost.exectime)
if not metapost.reporterror(result) then
if metapost.showlog then
- metapost.report("mp error: %s",(result.term ~= "" and result.term) or "no terminal output")
+ local str = (result.term ~= "" and result.term) or "no terminal output"
+ if not str:is_empty() then
+ metapost.report("mp log: %s",str)
+ end
end
if result.fig then
converted = metapost.convert(result, trialrun, flusher, multipass)
diff --git a/tex/context/base/mult-com.tex b/tex/context/base/mult-com.tex
index 4a7133f40..118616837 100644
--- a/tex/context/base/mult-com.tex
+++ b/tex/context/base/mult-com.tex
@@ -11,2726 +11,21 @@
%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
%C details.
-%D In this module we define the commands. A more than quick
-%D glance at this list leans that it's incomplete. This is due
-%D to the fact that the system generated a lot of commands by
-%D means of the elements specified somewhere else.
-%D
-%D {\em Because the original interface to \CONTEXT\ is dutch,
-%D the words left of the \type{:} are in dutch. In the near
-%D future english will be the core language.}
-%D
-%D The German translations were provided by Tobias Burnus,
-%D the Czech ones by Tom Hudec, and the Italian ones
-%D by Giuseppe Bilotta. Here we include their comments.
-
-%D Giuseppe Bilotta: \quotation {Having to choose between a
-%D full|-|length name and a shortcut, I decided to resort to the
-%D latter, especially in the case of commonly used commands, or
-%D when shortened commands become too short. This led to one
-%D inconsistency: \tex{footer} (pi\`e di pagina in Italian) became
-%D \tex{piedipagina} as a standalone term, but is commonly
-%D shortened to \typ{-pdp}. \tex{setupfooter} becomes
-%D \tex{impostapdp}, and so for all composed words: \tex{footnote}
-%D (nota a pi\`e di pagina) becomes \tex{notapdp};
-%D \tex{footnotetext} (testo della nota a pi\`e di pagina) becomes
-%D \tex{testonotapdp}; and so on.}
-
-\writestatus{loading}{Context Multilingual Macros / Commands}
-
-\startlogginginterface context.com
-
-%D The commands are grouped according to their functionality.
-%D Although the \type{\stop} counterpart of the
-%D \type{\start}||commands could be generated automatically,
-%D we've chosen do define it explicitly.
-%D
-%D One complication of the english commands, is that we don't
-%D want them to overrule or conflict with Plain \TEX. The
-%D names therefore are not always optimal.
-
-%D \startcompressdefinitions
-
-\startcommands dutch english
- german czech
- italian romanian
- french
-
- language: taal language
- sprache jazyk
- lingua limba
- langue
- mainlanguage: hoofdtaal mainlanguage
- hauptsprache hlavnijazyk
- linguaprincipale limbaprincipala
- langueprincipale
- translate: vertaal translate
- uebersetzten prelozit
- traduci traduce
- traduire
- installlanguage: installeertaal installlanguage
- installieresprache instalacejazyka
- installalingua instalarelimba
- installelangue
- setuplanguage: steltaalin setuplanguage
- stellespracheein nastavjazyk
- impostalingua setarelimba
- reglelangue
- showmakeup: toonopmaak showmakeup
- zeigeumbruch ukazupravu
- mostramakeup afiseazamakeup
- montremakeup
- useencoding: usecodering useencoding
- benutzekodierung uzijkodovani
- usacodifica folosestecodificarea
- utiliseencodage
- usespecials: gebruikspecials usespecials
- benutzespezielles uzijspeciality
- usaspecialita folosestespeciale
- utilisespecialites
- defineoutput: definieeruitvoer defineoutput
- defineoutput definujvystup
- definiscioutput definesteoutput
- definitsortie
- setupoutput: steluitvoerin setupoutput
- stelleausgabeein nastavvystup
- impostaoutput setareoutput
- reglesortie
- defineaccent: definieeraccent defineaccent
- definiereakzent definujakcent
- definisciaccento definesteaccent
- definitaccent
- definecharacter: definieerkarakter definecharacter
- definierezeichen definujznak
- definiscicarattere definestecaracter
- definicaractere
- definecommand: definieercommando definecommand
- definierebefehl definujprikaz
- definiscicomando definestecomanda
- definitcommande
- startcoding: startcodering startcoding
- startkodierung startkodovani
- iniziacodifica startcodificare
- demarrecodage
- stopcoding: stopcodering stopcoding
- stopkodierung stopkodovani
- terminacodifica stopcodificare
- stoppecodage
- definebodyfontenvironment: definieerkorpsomgeving definebodyfontenvironment
- definierefliesstextumgebung definujprostredizakladnihofontu
- definisciambientefontdeltesto definestemediulfonttext
- definitenvironnementpolicecorps
- setupbodyfontenvironment: stelkorpsomgevingin setupbodyfontenvironment
- stellefliesstextumgebungein nastavprostredizakladnihofontu
- impostaambientefontdeltesto seteazamediulfonttext
- regleenvironnementpolicecorps
- definebodyfont: definieerkorps definebodyfont
- definierefliesstext definujzakladnifont
- definiscifontdeltesto definestefonttext
- definitpolicecorps
- definefont: definieerfont definefont
- definiereschrift definujfont
- definiscifont definestefont
- definitpolice
- definefontsynonym: definieerfontsynoniem definefontsynonym
- defineschriftsynonym definujsynonumumfontu
- definiscisinonimofont definestesinonimfont
- definitsynonymepolice
- definestyle: definieerletter definestyle
- definierestil definujstyl
- definiscistile definestestil
- definitstyle
- definefontstyle: definieerfontstijl definefontstyle
- definiereschriftstil definujstylfontu
- definiscistilefont definestestilfont
- definitstylepolice
- setupstrut: stelstrutin setupstrut
- setupstrut setupstrut
- impostastrut seteazastrut
- reglestrut
- setuptype: steltypein setuptype
- stelletipein nastavtype
- impostatype seteazatype
- regletype
- type: type type
- tippen opis
- type type
- dactylographier
- typ: typ typ
- tip pis
- typ typ
- typ
- arg: arg arg
- arg arg
- arg arg
- arg
- tex: tex tex
- tex tex
- tex tex
- tex
- definetyping: definieertypen definetyping
- definieretippen definujopis
- definiscityping definestetyping
- definitdactylo
- definetype: definieertype definetype
- definetype definetype
- definiscitype definetype
- definittype
- setuptyping: steltypenin setuptyping
- stelletippenein nastavopis
- impostatyping seteazatyping
- regledactylo
- typefile: typefile typefile
- tippedatei opissoubor
- typefile typefile
- fichierdactylo
- setupfootnotes: stelvoetnotenin setupfootnotes
- stellefussnotenein nastavpoznamkypodcarou
- impostanotepdp seteazanotasubsol
- reglenotepdp
- setupfootnotedefinition: stelvoetnootdefinitiein setupfootnotedefinition
- stellefussnotendefinitionein nastavdefinicipoznamekpodcarou
- impostadefinizionenotepdp seteazadefinireanotasubsol
- definitnotepdp
- note: noot note
- notiz poznamka
- nota nota
- note
- footnote: voetnoot footnote
- fussnote poznamkapodcarou
- notapdp notasubsol
- notepdp
- footnotetext: voetnoottekst footnotetext
- footnotetext footnotetext
- testonotapdp footnotetext
- textenotepdp
- startlocalfootnotes: startlokalevoetnoten startlocalfootnotes
- startlokalefussnoten startlokalnipoznamkypodcarou
- inizianotepdplocali startnotesubsollocale
- demarrenotespdplocales
- stoplocalfootnotes: stoplokalevoetnoten stoplocalfootnotes
- stoplokalefussnoten stoplokalnipoznamkypodcarou
- terminanotepdplocali stopnotesubsollocale
- stoppenotespdplocales
- placelocalfootnotes: plaatslokalevoetnoten placelocalfootnotes
- platzierelokalefussnoten umistilokalnipoznamkypodcarou
- mettinotepdplocali punenotesubsollocale
- placenotespdplocales
- placefootnotes: plaatsvoetnoten placefootnotes
- platzierefussnoten umistipoznamkypodcarou
- mettinotepdp punenotesubsol
- placenotespdp
- currentdate: huidigedatum currentdate
- heutigesdatum aktualnidatum
- datadioggi datacurenta
- datecourante
- date: datum date
- datum datum
- data data
- date
- weekday: weekdag weekday
- wochentag vsedniden
- giornosettimana zidinsaptamana
- joursemaine
- WEEKDAY: WEEKDAG WEEKDAY
- WOCHENTAG VSEDNIDEN
- GIORNOSETTIMANA ZIDINSAPTAMANA
- JOURSEMAINE
- month: maand month
- monat mesic
- mese luna
- mois
- MONTH: MAAND MONTH
- MONAT MESIC
- MESE LUNA
- MOIS
- Numbers: Cijfers Numbers
- Ziffern Cisla
- Numeri Numere
- Numeros
- numbers: cijfers numbers
- ziffern cisla
- numeri numere
- numeros
- romannumerals: romeins romannumerals
- roemischezahlen rimskecislice
- numeriromani numereromane
- chiffresromains
- Romannumerals: Romeins Romannumerals
- Roemischezahlen Rimskecislice
- Numeriromani Numereromane
- Chiffresromains
- character: letter character
- buchstabe znak
- lettera litera
- caractere
- Character: Letter Character
- Buchstabe Znak
- Lettera Litera
- Caractere
- characters: letters characters
- buchstaben znaky
- lettere litere
- caracteres
- Characters: Letters Characters
- Buchstaben Znaky
- Lettere Litere
- Caracteres
- unknown: onbekend unknown
- unbekant neznamo
- ignoto necunoscut
- inconnu
- definesymbol: definieersymbool definesymbol
- definieresymbol definujsymbol
- definiscisimbolo definestesimbol
- definitsymbole
- definefiguresymbol: definieerfiguursymbool definefiguresymbol
- definiereabbsymbol definujobrazeksymbol
- definiscifigurasimbolo definestesimbolfigura
- definitsymbolefigure
- symbol: symbool symbol
- symbol symbol
- simbolo simbol
- symbole
- setupsymbolset: stelsymboolsetin setupsymbolset
- stellesymbolsetein nastavsadusymbolu
- impostasetsimboli seteazasimbol
- reglejeusymboles
- showsymbolset: toonsymboolset showsymbolset
- showsymbolset ukazsadusymbolu
- mostrasetsimboli afiseazasetsimboluri
- montrejeusymboles
- startsymbolset: startsymboolset startsymbolset
- startsymbolset startsadasymbolu
- iniziasetsimboli startsetsimboluri
- demarrejeusymboles
- usesymbols: gebruiksymbolen usesymbols
- verwendesymbole uzijsymbol
- usasimboli folosestesimboluri
- utilisesymboles
- defineconversion: definieerconversie defineconversion
- definierekonversion definujkonverzi
- definisciconversione definesteconversie
- definitconversion
- convertnumber: converteernummer convertnumber
- konvertierezahl konvertujcislo
- convertinumero convertestenumar
- convertitnumero
- setupcapitals: stelkapitalenin setupcapitals
- stelleversalienein nastavkapitalky
- impostamaiuscole seteazamajuscule
- reglecapitales
- smallcapped: kap cap
- kap kap
- cap kap
- cap
- notsmallcapped: nokap nocap
- nokap nokap
- nocap nokap
- nocap
- CAPPED: KAP CAP
- KAP KAP
- CAP KAP
- CAP
- SmallCapped: Kap Cap
- Kap Kap
- Cap Kap
- Cap
- SmallCaps: Kaps Caps
- Kaps Kaps
- Caps Kaps
- Caps
- WORD: WOORD WORD
- WORT SLOVO
- PAROLA CUVANT
- MOT
- WORDS: WOORDEN WORDS
- WOERTER SLOVA
- PAROLE CUVINTE
- MOTS
- Word: Woord Word
- Wort Slovo
- Parola Cuvant
- Mot
- Words: Woorden Words
- Woerter Slova
- Parole Cuvinte
- Mots
- stretched: uitgerekt stretched
- gestreckt roztazene
- stirato intins
- etire
- overstrike: doorstreep overstrike
- durchgestrichen preskrtnuto
- sbarrato liniepeste
- surlignetout
- overstrikes: doorstrepen overstrikes
- durchstreichen preskrtnuti
- sbarrati liniipeste
- surligne
- overbar: overstreep overbar
- ueberstrichen nadtrzeno
- sopralinea barasus
- overbar
- overbars: overstrepen overbars
- ueberstreichen nadtrzeni
- sopralinee supralinie
- overbars
- underbar: onderstreep underbar
- unterstrichen podtrzeno
- sottolinea sublinie
- souslignetout
- underbars: onderstrepen underbars
- unterstreichen podtrzeni
- sottolinee sublinii
- sousligne
- setupunderbar: stelonderstrepenin setupunderbar
- stelleunterstreichenein nastavpodtrzeni
- impostasottolinea seteazasublinie
- reglesouslignage
- setupbodyfont: stelkorpsin setupbodyfont
- stellefliesstextein nastavzakladnifont
- impostafontdeltesto seteazafonttext
- reglepolicecorps
- switchtobodyfont: switchnaarkorps switchtobodyfont
- wechselezumfliesstext prepninazakladnifont
- cambiaafontdeltesto trecilafonttext
- changepolicecorps
- showbodyfont: toonkorps showbodyfont
- zeigefliesstext ukazzakladnifont
- mostrafontdeltesto afiseazafonttext
- montrepolicecorps
- showbodyfontenvironment: toonkorpsomgeving showbodyfontenvironment
- zeigefliesstextumgebung ukazpostredizakladnihofontu
- mostraambientefontdeltesto afiseazamediufonttext
- montreenvironnementpolicecorps
- headtext: koptekst headtext
- ueberschrifttext texthlavicky
- testoinstestazioni texttitlu
- textetete
- labeltext: labeltekst labeltext
- labeltext textpopisku
- testoetichetta texteticheta
- labeltexte
- LABELTEXT: LABELTEKST LABELTEXT
- LABELTEXT TEXTPOPISKU
- TESTOETICHETTA TEXTETICHETA
- LABELTEXTE
- setupheadtext: stelkoptekstin setupheadtext
- stelleueberschrifttextein nastavtexthlavicky
- impostatestointestazioni seteazatexttitlu
- regletextetete
- setuplabeltext: stellabeltekstin setuplabeltext
- stellelabeltextein nastavtextpopisku
- impostatestoetichette seteazatexteticheta
- reglelabeltexte
- marginrule: kantlijn marginrule
- marginallinie marginalnilinka
- lineamargine liniemargine
- margereglee
- startmarginrule: startkantlijn startmarginrule
- startmarginallinie startmarginalnilinka
- inizialineamargine startliniemargine
- demarremargereglee
- stopmarginrule: stopkantlijn stopmarginrule
- stopmarginallinie stopmarginalnilinka
- terminalineamargine stopliniemargine
- stoppemargereglee
- setupmarginrules: stelkantlijnin setupmarginrules
- stellemarginallinieein nastavmarginalnilinky
- impostalineemargine seteazaliniimargine
- reglemargereglee
- blackrule: blokje blackrule
- rechteck cernalinka
- lineanera linieneagra
- lignenoire
- blackrules: blokjes blackrules
- rechtecke cernelinky
- lineenere liniinegre
- lignesnoires
- setupblackrules: stelblokjesin setupblackrules
- stellerechteckein nastavcernelinky
- impostalineenere seteazaliniinegre
- reglelignesnoires
- setupscreens: stelrastersin setupscreens
- stellerasterein nastavrastr
- impostaschermi seteazaecrane
- regleecrans
- framed: omlijnd framed
- umrahmt oramovani
- incorniciato framed
- framed
- inframed: inlijnd inframed
- imumriss zaramovani
- circondato inframed
- inframed
- mframed: wilijnd maframed
- maumrise maoramovani
- maframed maframed
- mframed
- inmframed: inwilijnd inmaframed
- immaumrise mazaramovani
- inmaframed inmaframed
- inmframed
- setupframed: stelomlijndin setupframed
- stelleumrahmtein nastavoramovani
- impostaincorniciato seteazainconjurat
- regleencadre
- setuplinewidth: stellijndiktein setuplinewidth
- stellelinienbreiteein nastavsirkucary
- impostaampiezzariga seteazagrosimelinie
- regleepaisseurligne
- setupthinrules: steldunnelijnenin setupthinrules
- stelleduennerumrissein nastavtenkelinky
- impostalineesottili seteazaliniesubtire
- regletraitsfins
- thinrule: dunnelijn thinrule
- duennelinie tenkalinka
- lineasottile liniesubtire
- traitfin
- thinrules: dunnelijnen thinrules
- duennerumriss tenkelinky
- lineesottili liniisubtiri
- traitsfins
- hairline: haarlijn hairline
- haarlinie vlasovalinka
- capello firdepar
- ligneh
- vl: vl vl
- vl vl
- vl vl
- vl
- hl: hl hl
- hl hl
- hl hl
- hl
- defineframed: definieeromlijnd defineframed
- definiereumrahmt definujoramovani
- definisciincorniciato definesteinconjurare
- defineframed
- defineframedtext: definieerkadertekst defineframedtext
- definiereumrahmtertext definujoramovanytext
- definiscitestoincorniciato definestetextinconjurat
- defineframedtext
- setupframedtexts: stelkadertekstenin setupframedtexts
- stelleumrahmtetexteein nastavoramovanetexty
- impostatestiincorniciati definestetexteinconjurate
- setupframedtexts
- defineoverlay: definieeroverlay defineoverlay
- definiereoverlay definujprekryv
- definiscisovrapposizione definesteoverlay
- definitrevetement
- definelayer: definieerlayer definelayer
- definelayer definelayer
- definelayer definelayer
- definitcalque
- background: achtergrond background
- hintergrund pozadi
- sfondo fundal
- arriereplan
- startbackground: startachtergrond startbackground
- starthintergrund startpozadi
- iniziasfondo startfundal
- demarrearriereplan
- stopbackground: stopachtergrond stopbackground
- stophintergrund stoppozadi
- terminasfondo stopfundal
- stoppearriereplan
- setupbackground: stelachtergrondin setupbackground
- stellehintergrundein nastavpozadi
- impostasfondo seteazafundal
- reglearriereplan
- fillinrules: invullijnen fillinrules
- gefuelltesrechteck vyplnovelinky % ve formulari
- lineeriempimento rigleumplere
- remplitlignesreglees
- setupfillinrules: stelinvullijnenin setupfillinrules
- stellegefuelltesrechteckein nastavvyplnovelinky
- impostalineeriempimento seteazarigleumplere
- regleremplitlignesreglees
- fillintext: invultekst fillintext
- ausfuelltext vyplnenytext
- testoriempimento textumplere
- remplittexte
- setupfillinlines: stelinvulregelsin setupfillinlines
- stellegefuelltezeileein nastavvyplnoveradky
- impostarigheriempimento seteazaliniiumplere
- regleremplitligne
- fillinline: invulregel fillinline
- gefuelltezeile vyplnovyradek
- rigariempimento linieumplere
- remplitligne
- setuptextrules: steltekstlijnenin setuptextrules
- stelletextumrissein nastavtextovelinky
- impostalineetesto seteazarigletext
- reglelignesreglestexte
- textrule: tekstlijn textrule
- textlinie textovalinka
- lineatesto riglatext
- ligneregleetexte
- starttextrule: starttekstlijn starttextrule
- starttextlinie starttextovalinka
- inizialineatesto startriglatext
- demarreligneregleetexte
- stoptextrule: stoptekstlijn stoptextrule
- stoptextlinie stoptextovalinka
- terminalineatesto stopriglatext
- stoppeligneregleetexte
- usemodule: gebruikmodule usemodule
- verwendemodul uzijmodul
- usamodulo folosestemodul
- utilisemodule
- usemodules: gebruikmodules usemodules
- verwendemodule uzijmoduly
- usamoduli folosestemodule
- utilisemodules
- starttext: starttekst starttext
- starttext starttext
- iniziatesto starttext
- demarretexte
- stoptext: stoptekst stoptext
- stoptext stoptext
- terminatesto stoptext
- stoppetexte
- margintitle: margetitel margintitle
- marginaltitel marginalninadpis
- titoloinmargine titlumarginal
- titremarge
- marginword: margewoord marginword
- marginalwort marginalnislovo
- parolainmargine cuvantmarginal
- motmarge
- margintext: margetekst margintext
- marginaltext marginalnitext
- testoinmargine textmarginal
- textemarge
- inleft: inlinker inleft
- imlinken vlevo
- insinistra instanga
- dansgauche
- inmargin: inmarge inmargin
- inmarginalie naokraj
- inmargine marginal
- dansmarge
- inothermargin: inanderemarge inothermargin
- inanderermarginale nadruhyokraj
- inaltromargine inaltamargine
- dansautremarge
- inright: inrechter inright
- imrechten vpravo
- indestra indreapta
- dansdroite
- ininner: inbinnen ininner
- ininner ininner
- ininner ininner
- ininner
- inouter: inbuiten inouter
- inouter inouter
- inouter inouter
- inouter
- startmarginblock: startmargeblok startmarginblock
- startmarginalblock startmarginalniblok
- iniziabloccomargine startblocmarginal
- demarreblocmarge
- stopmarginblock: stopmargeblok stopmarginblock
- stopmarginalblock stopmarginalniblok
- terminabloccomargine stopblocmarginal
- stoppeblocmarge
- defineinmargin: definieerinmarge defineinmargin
- defineinmargin defineinmargin
- defineinmargin defineinmargin
- definitdansmarge
- setupinmargin: stelinmargein setupinmargin
- stelleinmarginalieein nastavmarginalie
- impostainmargine seteazamarginal
- regledansmarge
- setupmarginblocks: stelmargeblokkenin setupmarginblocks
- stellemarginalblockein nastavmarginalniblok
- impostablocchimargine seteazablocurimarginale
- regleblocmarge
- inleftedge: inlinkerrand inleftedge
- imlinkenrand nalevo
- inlatosinistro inparteastanga
- dansbordgauche
- inleftmargin: inlinkermarge inleftmargin
- inlinkermarginale nalevyokraj
- inmarginesinistro inmargineastanga
- dansmargegauche
- inrightmargin: inrechtermarge inrightmargin
- inrechtermarginale napravyokraj
- inmarginedestro inmargineadreapta
- dansmargedroite
- inrightedge: inrechterrand inrightedge
- imrechtenrand napravo
- inlatodestro inparteadreapta
- dansborddroit
- atleftmargin: oplinkermarge atleftmargin
- atleftmargin atleftmargin
- atleftmargin atleftmargin
- atleftmargin
- atrightmargin: oprechtermarge atrightmargin
- atrightmargin atrightmargin
- atrightmargin atrightmargin
- atrightmargin
- wordright: woordrechts wordright
- wortrechts slovovpravo
- paroladestra cuvantdreapta
- motdroit
- defineblank: definieerblanko defineblank
- definiereblanko definujpreskok
- definiscirigovuoto definesteblanc
- definitvide
- blank: blanko blank
- blanko preskoc
- rigovuoto blanc
- vide
- setupblank: stelblankoin setupblank
- stelleblankoein nastavpreskok
- impostarigovuoto seteazablanc
- definitvide
- correctwhitespace: corrigeerwitruimte correctwhitespace
- korrigierezwischenraum korekcebilehomista
- correggispaziobianco corecteazaspatiualb
- corrigeespaceblanc
- fixedspaces: vastespaties fixedspaces
- festesspatium tvrdemezery
- spazifissi spatiifixate
- espacesfixes
- fixedspace: vastespatie fixedspace
- festesspatium tvrdamezera
- spaziofisso spatiufixat
- espacefixe
- nospace: geenspatie nospace
- keinspatium zadnamezera
- nientespazio faraspatiu
- sansespace
- space: spatie space
- spatium mezera
- spazio spatiu
- espace
- nowhitespace: geenwitruimte nowhitespace
- keinzwischenraum zadnebilemisto
- nientespaziobianco faraspatiualb
- sansespaceblanc
- packed: opelkaar packed
- kleinerdurchschuss zhustene
- impaccato impachetat
- groupe
- startpacked: startopelkaar startpacked
- startkleinerdurchschuss startzhustene
- iniziaimpaccato startimpachetat
- demarregroupe
- stoppacked: stopopelkaar stoppacked
- stopkleinerdurchschuss stopzhustene
- terminaimpaccato stopimpachetat
- stoppegroupe
- startunpacked: startvanelkaar startunpacked
- startgrosserdurchschuss startnezhustene
- iniziaunpacked startneimpachetat
- demarredegroupe
- stopunpacked: stopvanelkaar stopunpacked
- stopgrosserdurchschuss stopnezhustene
- terminaunpacked stopneimpachetat
- stoppedegroupe
- startlinecorrection: startregelcorrectie startlinecorrection
- startzeilenkorrektur startkorekceradku
- iniziacorrezioneriga startcorectielinie
- demarrecorrectionligne
- stoplinecorrection: stopregelcorrectie stoplinecorrection
- stopzeilenkorrektur stopkorekceradku
- terminacorrezioneriga stopcorectielinie
- stoppecorrectionligne
- godown: omlaag godown
- nachunten jdidolu
- vaigiu injos
- vaenbas
- whitespace: witruimte whitespace
- zwischenraum bilemisto
- spaziobianco spatiualb
- espaceblanc
- noindenting: nietinspringen noindenting
- nichteinziehen zadneodsazovani
- nienterientro faraaliniat
- sansalinea
- indenting: inspringen indenting
- einziehen odsazovani
- rientro aliniat
- composeenalinea
- setupindenting: stelinspringenin setupindenting
- stelleeinziehenein nastavodsazovani
- impostarientro seteazaaliniat
- reglecomposeenalinea
- startalignment: startuitlijnen startalignment
- startausrichtung startzarovnavani
- iniziaallineamento startaliniere
- demarrealignement
- stopalignment: stopuitlijnen stopalignment
- stopausrichtung stopzarovnavani
- terminaallineamento stopaliniere
- stoppealignement
- startlines: startregels startlines
- startzeilen startradky
- iniziarighe startlinii
- demarrelignes
- stoplines: stopregels stoplines
- stopzeilen stopradky
- terminarighe stoplinii
- stoppelignes
- setupparagraphnumbering: stelparagraafnummerenin setupparagraphnumbering
- stelleabsatznummerierungein nastavcislovaniodstavcu
- impostanumerazionecapoversi seteazanumerotareparagrafe
- reglenumerotationparagraphe
- setuplinenumbering: stelregelnummerenin setuplinenumbering
- stellezeilennumerierungein nastavcislovaniradku
- impostanumerazionerighe seteazanumerotarelinii
- reglenumerotationligne
- startlinenumbering: startregelnummeren startlinenumbering
- startzeilennumerierung startcislovaniradku
- inizianumerazionerighe startnumerotarelinii
- demarrenumerotationligne
- stoplinenumbering: stopregelnummeren stoplinenumbering
- stopzeilennumerierung stopcislovaniradku
- terminanumerazionerighe stopnumerotarelinii
- stoppenumerotationligne
- startline: startregel startline
- startzeile startradek
- iniziariga startlinie
- demarreligne
- stopline: stopregel stopline
- stopzeile stopradek
- terminariga stoplinie
- stoppeligne
- someline: eenregel someline
- einezeile nejakyradek
- qualcheriga olinie
- uneligne
- inline: inregel inline
- inzeile vradku
- inriga inlinie
- alaligne
- crlf: crlf crlf
- crlf crlf
- crlf crlf
- crlf
- emptylines: legeregels emptylines
- emptylines emptylines
- emptylines emptylines
- emptylines
- setuplines: stelregelsin setuplines
- stellezeilenein nastavradky
- impostarighe seteazalinii
- reglelignes
- startnarrower: startsmaller startnarrower
- startenger startzuzeni
- iniziapiustretto startingust
- demarrecompoetroite
- stopnarrower: stopsmaller stopnarrower
- stopenger stopzuzeni
- terminapiustretto stopingust
- stopcompoetroite
- setupnarrower: stelsmallerin setupnarrower
- stelleengerein nastavzuzeni
- impostapiustretto seteazaingust
- reglecompoetroite
- definetabulate: definieertabulatie definetabulate
- definieretabulator definujtabelaci
- definiscitabulato definestetabulatori
- definittabulation
- setuptabulate: steltabulatiein setuptabulate
- stelletabulatorein nastavtabelaci
- impostatabulato seteazatabulatori
- regletabulation
- starttable: starttabel starttable
- starttabelle starttabulka
- iniziatabella starttabel
- demarretableau
- stoptable: stoptabel stoptable
- stoptabelle stoptabulka
- terminatabella stoptabel
- stoppetableau
- starttables: starttabellen starttables
- starttabellen starttabulky
- iniziatabelle starttabele
- demarretableaux
- stoptables: stoptabellen stoptables
- stoptabellen stoptabulky
- terminatabelle stoptabele
- stoppetableaux
- setuptables: steltabellenin setuptables
- stelletabellenein nastavtabulky
- impostatabelle seteazatabele
- regletableaux
- definetabletemplate: definieertabelvorm definetabletemplate
- definieretabellenvorlage definujsablonutabulky
- definiscimodellotabella definestesablontabel
- definittrametableau
- page: pagina page
- seite strana
- pagina pagina
- page
- testcolumn: testkolom testcolumn
- testcolumn testcolumn
- testcolumn testcolumn
- testcolumn
- testpage: testpagina testpage
- testpage testpage
- testpage testpage
- testpage
- couplepage: koppelpagina couplepage
- doppelseite parovastrana
- accoppiapagina paginadubla
- pagedouble
- pagetype: soortpagina pagetype
- seitentyp typstrany
- tipopagina tippagina
- tapepage
- processpage: verwerkpagina processpage
- bearbeiteseite zpracujstranu
- elaborapagina proceseazapagina
- traitepage
- couplepaper: koppelpapier couplepaper
- doppelseitigespapier dvoustrannypapir
- accoppiacarta hartiedubla
- couplepapier
- selectpaper: selecteerpapier selectpaper
- waehlepapieraus vyberpapir
- selezionacarta selecteazahartie
- selectionnepapier
- screen: scherm screen
- bildschirm obrazovka
- schermo ecran
- ecran
- definesection: definieersectie definesection
- definiereabschnitt definujsekci
- definiscisezione definestesectiune
- definitsection
- definesectionblock: definieersectieblok definesectionblock
- definiereabschnittsblock definujbloksekce
- definiscibloccosezione definesteblocsectiune
- definitblocsection
- setupsectionblock: stelsectieblokin setupsectionblock
- stelleabschnittsblockein nastavbloksekce
- impostabloccosezione seteazablocsectiune
- regleblocsection
- setupsection: stelsectiein setupsection
- stelleabschnittein nastavsekci
- impostasezione seteazasectiune
- reglesection
- notopandbottomlines: geenbovenenonderregels notopandbottomlines
- keinzeilenobenundunten zadnehorniadolniradky
- nientelineecimafondo faraliniisussijos
- sanslignessupetinf
- noheaderandfooterlines: geenhoofdenvoetregels noheaderandfooterlines
- keinekopfundfusszeilen zadnezahlaviaupati
- nientelineintestazionepdp faraliniiantetsisubsol
- sanslignesenteteetpdp
- setuptop: stelbovenin setuptop
- stellenobenein nastavhorejsek
- impostacima seteazasus
- reglesup
- setuptoptexts: stelboventekstenin setuptoptexts
- stelletextobenein nastavhornitexty
- impostatesticima seteazatextesus
- regletextessup
- setupheader: stelhoofdin setupheader
- stellekopfzeileein nastavzahlavi
- impostainstestazione seteazaantet
- regleentete
- setupheadertexts: stelhoofdtekstenin setupheadertexts
- stellekopfzeilentextein nastavtextyzahlavi
- impostatestiintestazioni seteazatexteantet
- regletextesentete
- setuppagenumbering: stelpaginanummeringin setuppagenumbering
- stelleseitennummeriernungein nastavcislovanistran
- impostanumerazionepagina seteazanumerotarepagina
- reglenumerotationpage
- getnumber: haalnummer getnumber
- getnumber getnumber
- getnumber getnumber
- getnumber
- incrementnumber: verhoognummer incrementnumber
- nummererhoehen zvysujicicislo
- incrementanumero numarincrement
- incrementenumero
- decrementnumber: verlaagnummer decrementnumber
- decrementnumber decrementnumber
- decrementnumber decrementnumber
- decrementenumero
- resetnumber: resetnummer resetnumber
- resetnumber resetnumber
- resetnumber resetnumber
- raznumero
- setnumber: setnummer setnumber
- setnumber setnumber
- setnumber setnumber
- affectenumero
- setupnumber: stelnummerin setupnumber
- setupnumber setupnumber
- impostanumerazione setupnumber
- reglenumero
- setupbottom: stelonderin setupbottom
- stelleuntenein nastavspodek
- impostafondo seteazajos
- regleinf
- setupbottomtexts: stelondertekstenin setupbottomtexts
- stelletextuntenein nastavdolnitexty
- impostatestifondo seteazatextejos
- regletextesinf
- setupfooter: stelvoetin setupfooter
- stellefusszeileein nastavupati
- impostapdp seteazasubsol
- reglepdp
- setupfootertexts: stelvoettekstenin setupfootertexts
- stellefusszeilentextein nastavtextyupati
- impostatestipdp seteazatextesubsol
- regletextespdp
- setuppagenumber: stelpaginanummerin setuppagenumber
- stelleseitennummerein nastavcislostrany
- impostanumeropagina seteazanumarpagina
- reglenumeropage
- setupsubpagenumber: stelsubpaginanummerin setupsubpagenumber
- stelleunterseitennummerein nastavpodcislostrany
- impostanumerosottopagina seteazanumarsubpagina
- reglesousnumeropage
- subpagenumber: subpaginanummer subpagenumber
- subpagenumber subpagenumber
- subpagenumber subpagenumber
- sousnumeropage
- setuptext: steltekstin setuptext
- stelletextein nastavtext
- impostatesto seteazatext
- regletexte
- setuptexttexts: stelteksttekstenin setuptexttexts
- stelletexttexteein nastavtexttexty
- impostatestotesti seteazatextetext
- regletextestexte
- settextcontent: steltekstinhoudin settextcontent
- settext settextcontent
- settext settextcontent
- settext
- resettext: resettekstinhoud resettextcontent
- resettextcontent resettextcontent
- resettextcontent resettextcontent
- resettextcontent
- definetext: definieertekst definetext
- definieretext definujtext
- definiscitesto definestetext
- definittexte
- pagenumber: paginanummer pagenumber
- seitenummer cislostrany
- numeropagina numarpagina
- numeropage
- completepagenumber: volledigepaginanummer completepagenumber
- completepagenumber completepagenumber % TOBIAS % TO
- numeropaginacompleto completeazanumarpagina % TB TH
- completenumeropage
- placepagenumber: plaatspaginanummer placepagenumber
- placepagenumber placepagenumber % TOBIAS % TOM
- mettinumeropagina punenumarpagina % TB TH
- placenumeropage
- items: items items
- posten polozky
- elementi element
- elements
- setupitems: stelitemsin setupitems
- stellepostenein nastavpolozky
- impostaelementi seteazaelemente
- regleelements
- leftaligned: regellinks leftaligned
- linksbuendig zarovnanovlevo
- allineasinistra aliniatstanga
- aligneagauche
- midaligned: regelmidden midaligned
- zentriert zarovnanonastred
- allineacentro aliniatcentru
- aligneaumilieu
- rightaligned: regelrechts rightaligned
- rechtsbuendig zarovnanovpravo
- allineadestra aliniatdreapta
- aligneadroite
- startcolumns: startkolommen startcolumns
- startspalten startsloupce
- iniziacolonne startcoloane
- demarrecolonnes
- stopcolumns: stopkolommen stopcolumns
- stopspalten stopsloupce
- terminacolonne stopcoloane
- stoppecolonnes
- setupcolumns: stelkolommenin setupcolumns
- stellespaltenein nastavsloupce
- impostacolonne seteazacoloane
- reglecolonnes
- column: kolom column
- spalte sloupec
- colonna coloana
- colonne
- head: kop head
- kopf nadpis
- testa titlu
- tete
- but: but but
- but spodek
- fondo but
- but
- item: som item
- pos polozka
- elemento element
- element
- nop: nop nop
- nop nop
- nop nop
- nop
- mar: mar mar
- mar okr
- mar mar
- mar
- sym: sym sym
- sym sym
- sim sim
- sym
- txt: txt txt
- txt txt
- txt txt
- txt
- its: its its
- its pol % abbr. of polozka (it em)
- el el % abbr. of elemento (it) element (ro)
- el % abbr. of element (fr)
- ran: ran ran
- ran ran
- ran ran
- ran
- headsym: kopsym headsym
- headsym headsym
- headsym headsym
- headsym
- defineitemgroup: definieeritemgroep defineitemgroup
- defineitemgroup defineitemgroup
- defineitemgroup defineitemgroup
- defineitemgroup
- setupitemgroup: stelitemgroepin setupitemgroup
- setupitemgroup setupitemgroup
- setupitemgroup setupitemgroup
- setupitemgroup
- setupitemgroups: stelitemgroepenin setupitemgroups
- setupitemgroups setupitemgroups
- setupitemgroups setupitemgroups
- setupitemgroups
- definehead: definieerkop definehead
- definiereueberschrift definujnadpis
- definiscitesta definesteantet
- definittete
- setuphead: stelkopin setuphead
- stelleueberschriftein nastavnadpis
- impostatesta seteazatitlu
- regletete
- setupheads: stelkoppenin setupheads
- stelleueberschriftenein nastavnadpisy
- impostateste seteazatitluri
- regletetes
- setupheadnumber: stelkopnummerin setupheadnumber
- stellekopfzahlein nastavcislonadpisu
- impostanumerotesta seteazanumartitlu
- reglenumerotete
- headnumber: kopnummer headnumber
- kopfnummer cislonadpisu
- numerotesta numartitlu
- numerotete
- currentheadnumber: huidigekopnummer currentheadnumber
- heutigeskopfnummer aktualnicislonadpisu
- numerotestacorrente numartitlucurent
- numerotetecourant
- determineheadnumber: bepaalkopnummer determineheadnumber
- bestimmekopfnummer stanovcislonadpisu
- determinanumerotesta determinanumartitlu
- determinenumerotete
- resetmarking: resetmarkering resetmarking
- ruecksetztenbeschriftung resetznaceni
- reimpostamarcatura reseteazamarcaje
- razmarquage
- setupmarking: stelmarkeringin setupmarking
- stellebeschriftungein nastavznaceni
- impostamarcatura seteazamarcaje
- reglemarquage
- definemarking: definieermarkering definemarking
- definierebeschriftung definujznaceni
- definiscimarcatura definestemarcaje
- definitmarquage
- nomarking: geenmarkering nomarking
- keinebeschriftung zadneznaceni
- nientemarcatura faramarcaje
- sansmarquage
- marking: markeer marking
- beschriftung znaceni
- marcatura marcaje
- marquage
- decouplemarking: ontkoppelmarkering decouplemarking
- entknuepfebeschriftung rozpojeneznaceni
- separamarcatura decupleazamarcaje
- decouplemarquage
- couplemarking: koppelmarkering couplemarking
- verknuepfebeschriftung propojeneznaceni
- accoppiamarcatura cupleazamarcaje
- couplemarquage
- getmarking: haalmarkering getmarking
- holebeschriftung ziskejznaceni
- prendimarcatura adumarcaje
- obtientmarquage
- definelayout: definieerlayout definelayout
- definelayout definelayout
- definiscilayout definelayout
- definitdisposition
- setuplayout: stellayoutin setuplayout
- stellelayoutein nastavvzhled
- impostalayout seteazaaspect
- regledisposition
- adaptlayout: paslayoutaan adaptlayout
- passelayoutan prizpusobvzhled
- adattalayout adapteazaaspect
- adaptedisposition
- placeongrid: plaatsopgrid placeongrid
- amgitterausrichten umistinamrizku
- mettiingriglia plaseazapegrid
- placesurgrille
- moveongrid: verplaatsopgrid moveongrid
- amgitterneuausrichten premistinamrizku
- spostaagriglia mutapegrid
- deplacesurgrille
- showsetups: tooninstellingen showsetups
- zeigeeinstellungen ukaznastaveni
- mostraimpostazioni afiseazasetari
- montrereglages
- showframe: toonkader showframe
- zeigerahmen ukazramecek
- mostracornice afiseazarama
- montrecadre
- showgrid: toongrid showgrid
- zeigegitter ukazmrizku
- mostragriglia afiseazagrid
- montregrille
-% toonopbouw: toonopbouw showbuildup
-% zeigeaufbau ukazstrukturu
-% mostrabuildup afiseazabuildup
- showlayout: toonlayout showlayout
- zeigelayout ukazvzhled
- mostralyout afiseazaaspect
- montredisposition
- showprint: toonprint showprint
- zeigedruck ukazvytisk
- mostrastampa afiseazatiparire
- montreedition
- showstruts: toonstruts showstruts
- zeigestruts ukazpodpery
- mostrastruts afiseazastruts
- montrestruts
- definepapersize: definieerpapierformaat definepapersize
- definierepapierformat definujvelikostpapiru
- definiscidimensionicarta definestedimensiunehartie
- definittaillepapier
- setuppapersize: stelpapierformaatin setuppapersize
- stellepapierformatein nastavvelikostpapiru
- impostadimensionicarta seteazadimensiunihartie
- regletaillepapier
- setuppaper: stelpapierin setuppaper
- setuppaper setuppaper
- setuppaper setuppaper
- reglepapier
- setuparranging: stelarrangerenin setuparranging
- stelleanordnenein nastavusporadani
- impostaparranging seteazaaranjareapag
- reglearrangement
- version: versie version
- version verze
- versione versiune
- version
- setupbackgrounds: stelachtergrondenin setupbackgrounds
- stellehintergruendeein nastavpozadi
- impostasfondi seteazafundaluri
- reglearriereplans
- setupalign: steluitlijnenin setupalign
- stelleausrichtungein nastavzarovnani
- impostaallineamento seteazaalinierea
- reglealignement
- setupwhitespace: stelwitruimtein setupwhitespace
- stellezwischenraumein nastavbilamista
- impostaspaziobianco seteazaspatiualb
- regleespaceblanc
- setupinteraction: stelinteractiein setupinteraction
- stelleinteraktionein nastavinterakci
- impostainterazione seteazainteractiunea
- regleinteraction
- setupinteractionmenu: stelinteractiemenuin setupinteractionmenu
- stelleinteraktionsmenueein nastavinterakcnimenu
- impostamenuinterazione seteazameniuinteractiune
- reglemenuinteraction
- defineinteractionmenu: definieerinteractiemenu defineinteractionmenu
- definiereinteraktionsmenue definujinterakcnimenu
- definiscimenuinterazione definestemeniuinteractiune
- definitmenuinteraction
- disableinteractionmenu: blokkeerinteractiemenu disableinteractionmenu
- inaktiviereinteraktionsmenue zablokujinterakcnimenu
- disabilitamenuinterazione dezactiveazameniuinteractiune
- inhibemenuinteraction
- interactionmenu: interactiemenu interactionmenu
- interaktionsmenue interaktivnimenu
- menuinterattivo meniuinteractiune
- menuinteraction
- interactionbuttons: interactiebuttons interactionbuttons
- interaktionsknopfe interakcnitlacitka
- pulsantinterazione butoaneinteractiune
- boutonsinteraction
- interactionbar: interactiebalk interactionbar
- interaktionsbalken interakcnilista
- barrainterazione barainteractiune
- barreinteraction
- setupinteractionbar: stelinteractiebalkin setupinteractionbar
- stelleinteraktionsbalkenein nastavinterakcnilistu
- impostabarrainterazione seteazabarainteractiune
- reglebarreinteraction
- setupinteractionscreen: stelinteractieschermin setupinteractionscreen
- stelleinteraktionsbildschirmein nastavinterakcniobrazovku
- impostaschermointerazione seteazaecraninteractiune
- regleecraninteraction
- placebookmarks: plaatsbookmarks placebookmarks
- platzierebookmarks umistizalozky
- mettisegnalibro plaseazasemnecarte
- placemarquespages
- bookmark: bookmark bookmark
- bookmark zalozka
- segnalibro semncarte
- marquepage
- definelogo: definieerbeeldmerk definelogo
- definierelogo definujlogo
- definiscilogo definestelogo
- definitlogo
- placelogos: plaatsbeeldmerken placelogos
- platzierelogo umistiloga
- mettiloghi punelogouri
- placelogos
- definecolor: definieerkleur definecolor
- definierefarbe definujbarvu
- definiscicolore definesteculoare
- definitcouleur
- definecolorgroup: definieerkleurgroep definecolorgroup
- definierefarbengruppe definujskupinubarev
- definiscigruppocolori definestegrupculori
- definitgroupecouleur
- definepalet: definieerpalet definepalet
- definierepalette definujpaletu
- definiscitavolozza definestepaleta
- definitpalette
- graycolor: grijskleur graycolor
- graufarbe sedabarva
- coloregrigio culoaregri
- couleurgrise
- color: kleur color
- farbe barva
- colore culoare
- couleur
- startcolor: startkleur startcolor
- startfarbe startbarva
- iniziacolore startculoare
- demarrecouleur
- stopcolor: stopkleur stopcolor
- stopfarbe stopbarva
- terminacolore stopculoare
- stoppecouleur
- setupcolors: stelkleurenin setupcolors
- stellefarbenein nastavbarvy
- impostacolori seteazaculori
- reglecouleurs
- setupcolor: stelkleurin setupcolor
- stellefarbeein nastavbarvu
- impostacolore seteazaculoare
- reglecouleur
- setuppalet: stelpaletin setuppalet
- stellepaletteein nastavpaletu
- impostatavolozza seteazapaleta
- reglepalette
- showcolor: toonkleur showcolor
- zeigefarbe ukazbarvu
- mostracolore afiseazaculoare
- montrecouleur
- showcolorgroup: toonkleurgroep showcolorgroup
- zeigefarbengruppe ukazskupinubarev
- mostragruppocolori afiseazagrupculoare
- montregroupecouleur
- showpalet: toonpalet showpalet
- zeigepalette ukazpaletu
- mostratavolozza afiseazapaleta
- montrepalette
- comparecolorgroup: vergelijkkleurgroep comparecolorgroup
- vergleichefarbengruppe porovnejskupinubarev
- confrontagruppocolori comparagrupculoare
- comparegroupecouleur
- comparepalet: vergelijkpalet comparepalet
- vergleichepalette porovnejpaletu
- confrontatavolozza comparapaleta
- comparepalette
- colorvalue: kleurwaarde colorvalue
- farbewert hodnotabarvy
- valorecolore valoareculoare
- valeurcouleur
- greyvalue: grijswaarde greyvalue
- grauwert hodnotasedi
- valoregrigio valoaregri
- valeurgris
- startraster: startraster startraster
- startraster startrastr
- iniziaraster startraster
- demarreraster
- stopraster: stopraster stopraster
- stopraster stoprastr
- terminaraster stopraster
- stopperaster
- defineblock: definieerblok defineblock
- definiereblock definujblok
- definisciblocco definestebloc
- definitbloc
- setupblock: stelblokin setupblock
- stelleblockein nastavblok
- impostablocco seteazabloc
- reglebloc
- useblocks: gebruikblokken useblocks
- verwendebloecke uzijbloky
- usablocco folosestebloc
- utiliseblocs
- processblocks: verwerkblokken processblocks
- bearbeitebloecke zpracujbloky
- elaborablocchi proceseazabloc
- traiteblocs
- keepblocks: handhaafblokken keepblocks
- behaltebloecke zachovejbloky
- tieniblocchi pastreazablocuri
- gardeblocs
- selectblocks: selecteerblokken selectblocks
- waehlebloeckeaus vyberbloky
- selezionablocchi selecteazablocuri
- selectionneblocs
- hideblocks: verbergblokken hideblocks
- verbergebloecke schovejbloky
- nascondiblocchi ascundeblocuri
- cacheblocs
- bypassblocks: passeerblokken bypassblocks
- bypassblocks bypassblocks
- saltablocchi saripesteblocuri
- sauteblocs
- forceblocks: forceerblokken forceblocks
- forceblocks forceblocks
- forzablocchi forteazablocuri
- forceblocs
- nomoreblocks: geenblokkenmeer nomoreblocks
- keinebloeckemehr zadnedalsibloky
- bastablocchi gatablocuri
- pasplusdeblocs
- definelist: definieerlijst definelist
- definiereliste definujseznam
- definiscielenco definestelista
- definitliste
- definecombinedlist: definieersamengesteldelijst definecombinedlist
- definierezusammengestellteliste definujkombinovanyseznam
- definiscielencocombinato definestelistacombinata
- definitlisteimbriquee
- listsymbol: lijstsymbool listsymbol
- listsymbol listsymbol
- listsymbol listsymbol
- listesymbole
- placelist: plaatslijst placelist
- platziereliste umistiseznam
- mettielenco punelista
- placeliste
- plaatsruwelijst: plaatsruwelijst placerawlist
- placerawlist placerawlist
- placerawlist placerawlist
- placerawlist
- placecombinedlist: plaatssamengesteldelijst placecombinedlist
- platzierezusammengestellteliste umistikombinovanyseznam
- mettielencocombinato punelistacombinata
- placelisteinmbriquee
- writetolist: schrijfnaarlijst writetolist
- schreibezurliste zapisdoseznamu
- scriviinelenco scrieinlista
- ecritdansliste
- writebetweenlist: schrijftussenlijst writebetweenlist
- schreibezwischenliste zapismeziseznam
- scrividentroelenco scrieintreliste
- ecritentreliste
- immediatetolist: directnaarlijst immediatetolist
- immediatetolist immediatetolist
- immediatetolist immediatetolist
- immediatetolist
- immediatebetweenlist: directtussenlijst immediatebetweenlist
- immediatebetweenlist immediatebetweenlist
- immediatebetweenlist immediatebetweenlist
- immediatebetweenlist
- setuplist: stellijstin setuplist
- stellelisteein nastavseznam
- impostaelenco seteazalista
- regleliste
- setupcombinedlist: stelsamengesteldelijstin setupcombinedlist
- stellezusammengestelltelisteein nastavkombinovanyseznam
- impostaelencocombinato seteazalistacombinata
- reglelisteimbriquee
- determinelistcharacteristics: bepaallijstkenmerken determinelistcharacteristics
- bestimmelistencharakeristika stanovcharakteristickuseznamu
- determinacarattersticheelenco determinacaracteristicilelistei
- determinecaracteristiqueliste
- listlength: lijstlengte listlength
- listenlaenge delkaseznamu
- lunghezzaelenco lungimelista
- llongueurliste
- listwidth: lijstbreedte listwidth
- listenbreite sirkaseznamu
- ampiezzaelenco latimelista
- largeurliste
- listheight: lijsthoogte listheight
- listenhoehe vyskaseznamu
- altezzaelenco inaltimelista
- hauteurliste
- nolist: geenlijst nolist
- keineliste zadnyseznam
- nienteelenco faralista
- sansliste
- definereferencelist: definieerreferentielijst definereferencelist
- definierereferenzliste definujseznamodkazu
- definiscilistariferimenti definestelistareferinte
- definitlistereference
- placereferencelist: plaatsreferentielijst placereferencelist
- platzierereferenzliste umistiseznamodkazu
- mettilistariferimenti punelistareferinte
- placelistereference
- writetoreferencelist: schrijfnaarreferentielijst writetoreferencelist
- schreibezurreferenzliste zapisdoseznamuodkazu
- scriviinlistariferimenti scrieinlistareferinte
- ecritdanslistereference
- setupreferencelist: stelreferentielijstin setupreferencelist
- stellereferenzlisteein nastavseznamodkazu
- impostalistariferimenti seteazalistareferinte
- reglelistereference
- definefloat: definieerplaatsblok definefloat
- definieregleitobjekt definujplvouciobjekt
- definiscioggettomobile definestefloat
- definitflottant
- setupfloat: stelplaatsblokin setupfloat
- stellegleitobjektein nastavplvouciobjekt
- impostaoggettomobile seteazafloat
- regleflottant
- setupfloats: stelplaatsblokkenin setupfloats
- stellegleitobjekteein nastavplvouciobjekty
- impostaoggettimobili seteazafloats
- regleflottants
- splitfloat: splitsplaatsblok splitfloat
- teilegleitobjekt rozdelplvouciobjekt
- spezzaoggettomobile impartefloat
- separeflottant
- setupfloatsplitting: stelplaatsbloksplitsenin setupfloatsplitting
- stelleplatziegeteiltegleitobjekt nastavdeleniplvoucichobjektu
- impostaspezzamentooggettomobile seteazaimpartireafloat
- regleseparationflottant
- placefloat: plaatsplaatsblok placefloat
- placefloat placefloat
- placefloat placefloat
- placeflottant
- movesidefloat: verplaatszijblok movesidefloat
- movesidefloat movesidefloat
- movesidefloat movesidefloat
- movesidefloat
- defineplacement: definieerplaats defineplacement
- defineplacement defineplacement
- defineplacement defineplacement
- defineplacement
- setupplacement: stelplaatsin setupplacement
- setupplacement setupplacement
- setupplacement setupplacement
- setupplacement
- definecombination: definieercombinatie definecombination
- definecombination definecombination
- definecombination definecombination
- definecombination
- startcombination: startcombinatie startcombination
- startkombination startspojeni
- iniziacombinazione startcombinare
- demarrecombinaison
- stopcombination: stopcombinatie stopcombination
- stopkombination stopspojeni
- terminacombinazione stopcombinare
- stoppecombinaison
- placesidebyside: plaatsnaastelkaar placesidebyside
- platzierenebeneinander umistivedlesebe
- mettifiancoafianco punefatainfata
- placecoteacote
- placeontopofeachother: plaatsonderelkaar placeontopofeachother
- platziereuntereinander umistinadsebe
- mettiunosullaltro punedeasuprafiecareia
- placelesunsaudessusdesautres
- setupcaption: stelblokkopjein setupcaption
- stellebildunterschriftein nastavpopisek
- impostacaption seteazalegenda
- regleintitule
- setupcaptions: stelblokkopjesin setupcaptions
- stellebilderunterschriftein nastavpopisky
- impostacaptions seteazalegendele
- regleintitules
- setupcombinations: stelcombinatiesin setupcombinations
- stellekombinationein nastavspojeni
- impostacombinazioni seteazacombinari
- reglecombinaisons
- startoverlay: startoverlay startoverlay
- startoverlay startprekryv
- iniziasovrapposizione startoverlay
- demarrerevetement
- stopoverlay: stopoverlay stopoverlay
- stopoverlay stopprekryv
- terminasovrapposizione stopoverlay
- stopperevetement
- defineregister: definieerregister defineregister
- definiereregister definujrejstrik
- definisciregistro definesteregistru
- definitregistre
- coupleregister: koppelregister coupleregister
- verknuepfregister propojenyrejstrik
- accoppiaregistro cupleazaregistru
- coupleregistre
- setupregister: stelregisterin setupregister
- stelleregisterein nastavrejstrik
- impostaregistro seteazaregistru
- regleregistre
- writetoregister: schrijfnaarregister writetoregister
- schreibezumregister zapisdorejstriku
- scriviinregistro scrieinregistru
- ecritregistre
- completeregister: volledigregister completeregister
- completeregister completeregister
- completeregister completeregister
- completeregistre
- placeregister: plaatsregister placeregister
- platziereregister umistirejstrik
- mettiregistro puneregistru
- placeregistre
-determineregistercharacteristics: bepaalregisterkenmerken determineregistercharacteristics
- bestimmeregistercharakteristika urcicharakteristikurejstriku
- determinacaratteristicheregistro determinacaracteristiciregistru
- determinecaracteristiquesregistre
- definesorting: definieersorteren definesorting
- definieresortieren definujtrideni
- definisciordinamento definestesortare
- definittri
- definesynonyms: definieersynoniemen definesynonyms
- definieresynonyme definujsynonyma
- definiscisinonimi definestesinonim
- definitsynonymes
- setupsorting: stelsorterenin setupsorting
- stellesortierenein nastavtrideni
- impostaordinamento seteazasortare
- regletri
- setupsynonyms: stelsynoniemenin setupsynonyms
- stellesynonymein nastavsynonyma
- impostasinonimi seteazasinonime
- reglesynonymes
- startsynchronization: startsynchronisatie startsynchronization
- startsynchronisation startsynchronizace
- iniziasincronizzazione startsincronizare
- demarresynchronisation
- stopsynchronization: stopsynchronisatie stopsynchronization
- stopsynchronisation stopsynchronizace
- terminasincronizzazione stopsincronizare
- stoppesynchronisation
- setupsynchronizationbar: stelsynchronisatiebalkin setupsynchronizationbar
- stellesynchronisationsbalkenein nastavsynchronizacnilistu
- impostabarrasincronizzazione setarebarasincronizare
- reglebarresynchronisation
- setupsynchronization: stelsynchronisatiein setupsynchronization
- stellesynchronisationein nastavsynchronizaci
- impostasincronizzazione setaresincronizare
- reglesynchronisation
- synchronizationbar: synchronisatiebalk synchronizationbar
- synchronisationsbalken synchronizacnilista
- barrasincronizzazione barasincronizare
- barresynchronisation
- synchronize: synchroniseer synchronize
- synchronisieren synchronizovat
- sincronizza sincronizeaza
- synchronise
- useexternaldocument: gebruikexterndocument useexternaldocument
- verwendeexteresdokument uzijexternidokument
- usadocumentoesterno folosestedocumentextern
- utilisedocumentexterne
- useURL: gebruikURL useURL
- verwendeURL uzijURL
- usaURL folosesteURL
- utiliseURL
- useurl: gebruikurl useurl
- verwendeurl uzijurl
- usaurl folosesteurl
- utiliseurl
- setupurl: stelurlin setupurl
- stelleurlein nastavurl
- impostaurl seteazaurl
- regleurl
- coupledocument: koppeldocument coupledocument
- verknuepfedokument propojenydokument
- accoppiadocumento cupleazadocument
- coupledocument
- setupprograms: stelprogrammasin setupprograms
- stelleprogrammein nastavprogramy
- impostaprogrammi seteazaprograme
- regleprogrammes
- defineprogram: definieerprogramma defineprogram
- definiereprogramme definujprogram
- definisciprogramma definesteprogram
- definitprogramme
- program: programma program
- programm program
- programma program
- programme
- setuppagetransitions: stelpaginaovergangenin setuppagetransitions
- stelleseitenuebergangein nastavprechodstrany
- impostatransizionepagina seteazatranzitiepagina
- regletransitionspage
- defineprofile: definieerprofiel defineprofile
- definiereprofil definujprofil
- definisciprofilo definesteprofil
- definitprofil
- defineversion: definieerversie defineversion
- definiereversion definujverzi
- definisciversion definesteversiune
- definitversion
- markversion: markeerversie markversion
- beschrifteversion oznacverzi
- marcaversione marcheazaversiune
- marquageversion
- selectversion: selecteerversie selectversion
- waehleversionaus vyberverzi
- selezionaversione selecteazaversiune
- selectionneversion
- startprofile: startprofiel startprofile
- startprofil startprofil
- iniziaprofilo startprofil
- demarreprofil
- startversion: startversie startversion
- startversion startverze
- iniziaversione startversiune
- demarreversion
- setupprofiles: stelprofielenin setupprofiles
- stelleprofilein nastavprofily
- impostaprofili seteazaprofile
- regleprofils
- setupversions: stelversiesin setupversions
- stelleversionein nastavverze
- impostaversioni seteazaversiuni
- regleversions
- stopprofile: stopprofiel stopprofile
- stopprofil stopprofil
- terminaprofili stopprofil
- stoppeprofil
- stopversion: stopversie stopversion
- stopversion stopverze
- terminaversioni stopversiune
- stoppeversion
- followprofile: volgprofiel followprofile
- folgeprofil dodrzujprofil
- seguiprofilo urmeazaprofil
- suivantprofil
- followprofileversion: volgprofielversie followprofileversion
- folgeprofilversion dodrzujverziprofilu
- seguiversioneprofilo urmeazaversiuneprofil
- suivantversionprofil
- followversion: volgversie followversion
- folgeversion dodrzujverzi
- seguiversione urmeazaversiune
- suivantversion
- definedescription: doordefinieren definedescription
- definierebeschreibung definujpopis
- definiscidescrizione definestedescriere
- definitdescription
- definelabel: doorlabelen definelabel
- definierelabel definujpopisek
- definiscietichetta definesteeticheta
- definitetiquette
- defineenumeration: doornummeren defineenumeration
- definierenummerierung definujvycet
- definiscienumerazione definesteenumerare
- definitenumeration
- defineindenting: doorspringen defineindenting
- definiereeinzug definujodsazovani
- definiscirientro definestealiat
- definitcompoalinea
- setupdescriptions: steldoordefinierenin setupdescriptions
- definierebeschreibungen nastavpopisy
- impostadescrizioni seteazadescriere
- regledescriptions
- setupenumerations: steldoornummerenin setupenumerations
- stellebeschreibungein nastavvycty
- impostaenumerazioni seteazaenumerare
- regleenumerations
- setupindentations: steldoorspringenin setupindentations
- stelleeinzuegein nastavodsazeni
- impostarientri seteazaaliniate
- reglealineas
- setuptab: steltabin setuptab
- stelletabein nastavtab
- impostatab seteazatab
- regletab
- tab: tab tab
- tab tab
- tab tab
- tab
- setupexternalfigures: stelexternefigurenin setupexternalfigures
- stelleexterneabbildungenein nastavexterniobrazy
- impostafigureesterne seteazafiguriexterne
- reglefiguresexternes
- showexternalfigures: toonexternefiguren showexternalfigures
- zeigeexterneabbildungen ukazexterniobrazy
- mostrafiguresterne afiseazafiguriexterne
- montrefiguresexternes
- externalfigure: externfiguur externalfigure
- externeabbildung externiobraz
- figuraesterna figuraexterna
- figureexterne
- useexternalfigure: gebruikexternfiguur useexternalfigure
- verwendeexterneabbildung uzijexterniobraz
- usafiguraesterna folosestefiguraexterna
- utilisefigureexterne
- startfigure: startfiguur startfigure
- startabbildung startobraz
- iniziafigura startfigura
- demarrefigure
- referring: refereer referring
- referieren odkazujici
- referring referring
- faitreference
- remark: toelichting remark
- bemerkung oznaceni
- commento remarca
- commentaire
- colorbar: kleurenbalk colorbar
- farbbalken barevnalista
- barracolori baraculoare
- barrecouleur
- grid: rooster grid
- gitter mrizka
- griglia grid
- grille
- button: button button
- knopf tlacitko
- pulsante buton
- bouton
- menubutton: menubutton menubutton
- menueknopf tlacitkomenu
- pulsantemenu butonmeniu
- boutonmenu
- setupbuttons: stelbuttonsin setupbuttons
- stelleknopfein nastavtlacitka
- impostapulsanti seteazabutoane
- regleboutons
- usereferences: gebruikreferenties usereferences
- verwendereferenzen uzijodkazy
- usariferimenti folosestereferinte
- utilisereferences
- placereferencelist: plaatsreferentielijst placereferencelist
- placereferencelist placereferencelist
- placereferencelist placereferencelist
- placelistereference
- setupreferencelist: stelreferentielijstin setupreferencelist
- stellereferenzlisteein nastavseznamodkazu
- impostalistariferimenti seteazalistareferinte
- reglelistereference
- setupreferencing: stelrefererenin setupreferencing
- stellereferenzierenein nastavodkazovani
- impostariferimento seteazareferinte
- reglereferencage
- textreference: tekstreferentie textreference
- textreferenz odkaznatext
- riferimentotesto referintatext
- referencetexte
- pagereference: paginareferentie pagereference
- seitenreferenz odkaznastranu
- riferimentopagina referintapagina
- referencepage
- reference: referentie reference
- referenz odkaz
- riferimento referinta
- reference
- definereference: definieerreferentie definereference
- definierereferenz definujodkaz
- definisciriferimento definestereferinte
- definitreference
- definereferenceformat: definieerreferentieformaat definereferenceformat
- definierereferenzformat definujformatodkazu
- definisciformatoriferimento definesteformatreferinte
- definitformatreference
- useJSscripts: gebruikJSscripts useJSscripts
- verwendeJSscript uzijJSscripts
- usaJSscripts folosestescriptJS
- utiliseJSscripts
- from: uit from
- von zref
- da din
- de
- in: in in
- in tref
- in in
- dans
- at: op at
- bei pref
- al la
- a
- about: - about
- ueber oref
- intorno despre
- concernant
- goto: naar goto
- zu jdina
- vaia dute
- va
- atpage: oppagina atpage
- aufseite nastrane
- apagina lapagina
- alapage
- somewhere: ergens somewhere
- irgendwo nekde
- daqualcheparte undeva
- qqpart
- navigating: navigerend navigating
- navigating navigating
- navigating navigating
- navigating
- ref: ref ref
- ref ref
- rif ref
- ref
- gotobox: naarbox gotobox
- zurbox jdinabox
- vaiabox dutebox
- vaalaboite
- gotopage: naarpagina gotopage
- zurseite jdinastranu
- vaiapagina dutepagina
- vaalapage
- placeformula: plaatsformule placeformula
- platziereformel umistirovnici
- mettiformula puneformula
- placeformule
- placesubformula: plaatssubformule placesubformula
- platziereunterformel umistipodrovnici
- mettisottoformula punesubformula
- placesousformule
- moveformula: verplaatsformule moveformula
- moveformula moveformula
- spostaformula moveformula
- deplaceformule
- setupformulas: stelformulesin setupformulae
- stelleformelnein nastavrovnice
- impostaformule seteazaformule
- regleformules
- formulanumber: formulenummer formulanumber
- formelnummer cislorovnice
- numeroformula numarformula
- numeroformule
- subformulanumber: subformulenummer subformulanumber
- unterformelnummer cislopodrovnice
- numerosottoformula numarsubformula
- numerosousformule
- leg: leg leg
- leg leg
- leg leg
- leg
- fact: geg fact
- geg fakt
- fatto fact
- fait
- mathematics: wiskunde mathematics
- mathematik matematika
- matematica matematica
- mathematique
- dimension: dimensie dimension
- dimension rozmer
- dimensione dimensiune
- dimension
- nodimension: geendimensie nodimension
- keindimension zadnyrozmer
- nientedimensioni faradimensiune
- sansdimension
- startenvironment: startomgeving startenvironment
- startumgebung startprostredi
- iniziaambiente startmediu
- demarreenvironement
- stopenvironment: stopomgeving stopenvironment
- stopumgebung stopprostredi
- terminaambiente stopmediu
- stoppeenvironement
- startcomponent: startonderdeel startcomponent
- startkomponente startkomponenta
- iniziacomponente startcomponenta
- demarrecomposant
- stopcomponent: stoponderdeel stopcomponent
- stopkomponente stopkomponenta
- terminacomponente stopcomponenta
- stoppecomposant
- startproduct: startprodukt startproduct
- startprodukt startprodukt
- iniziaprodotto startprodus
- demarreproduit
- stopproduct: stopprodukt stopproduct
- stopprodukt stopprodukt
- terminaprodotto stopprodus
- stoppeproduit
- startproject: startprojekt startproject
- startprojekt startprojekt
- iniziaprogetto startproiect
- demarreprojet
- stopproject: stopprojekt stopproject
- stopprojekt stopprojekt
- terminaprogetto stopproiect
- stoppeprojet
- setups: instellingen setups
- einstellungen nastaveni
- impostazioni setari
- reglages
- project: projekt project
- projekt projekt
- progetto proiect
- projet
- component: onderdeel component
- komponente komponenta
- componenet componenta
- composant
- product: produkt product
- produkt produkt
- prodotto produs
- produit
- environment: omgeving environment
- umgebung prostredi
- ambiente mediu
- environement
- nomorefiles: geenfilesmeer nomorefiles
- keinedateienmehr zadnedalsisoubory
- bastafile farafisiere
- pasplusdefichiers
- getbuffer: haalbuffer getbuffer
- holepuffer ziskejbuffer
- prendibuffer adubuffer
- prendbuffer
- setupbuffer: stelbufferin setupbuffer
- stellepufferein nastavbuffer
- impostabuffer seteazabuffer
- reglebuffer
- typebuffer: typebuffer typebuffer
- tippepuffer typebuffer
- typebuffer scriebuffer
- tapebuffer
- definebuffer: definieerbuffer definebuffer
- definierepuffer definujbuffer
- definiscibuffer definestebuffer
- definitbuffer
- unitmeaning: betekenis unitmeaning
- bedeutung vyznam
- nomeunita numeunitate
- sensunite
- infull: voluit infull
- volleswort plnezneni
- perlungo pelung
- infull
- quotation: citaat quotation
- zitat citace
- citazione citat
- citation
- quote: citeer quote
- zitieren citovat
- menzione minicitat
- citer
- startquotation: startcitaat startquotation
- startzitat startcitace
- iniziacitazione startcitat
- demarrecitation
- stopquotation: stopcitaat stopquotation
- stopzitat stopcitace
- terminacitazione stopcitat
- stoppecitation
- setupquote: stelciterenin setupquote
- stellezitierenein nastavcitaci
- impostamenzione seteazaminicitat
- demarreciter
- define: definieer define
- definieren definuj
- definisci defineste
- definit
- redo: herhaal redo
- wiederholen opakovat
- rifai refa
- refait
- usecommands: gebruikcommandos usecommands
- verwendebefehl uzijprikazy
- usacomandi folosestecomenzi
- utilisecommandes
- definestartstop: definieerstartstop definestartstop
- definierestartstop definujstartstop
- definisciiniziatermina definestestartstop
- definitdemarrestoppe
- setupstartstop: stelstartstopin setupstartstop
- setupstartstop setupstartstop
- impostainiziatermina setupstartstop
- regledemarrestoppe
- startlocal: startlokaal startlocal
- startlokal startlokalni
- inizialocale startlocal
- demarrelocal
- stoplocal: stoplokaal stoplocal
- stoplokal stoplokalni
- terminalocale stoplocal
- stoppelocal
- startglobal: startglobaal startglobal
- startglobal startglobalni
- iniziaglobale startglobal
- demarreglobal
- stopglobal: stopglobaal stopglobal
- stopglobal stopglobalni
- terminaglobale stopblobal
- stoppeglobal
- macroname: naam name
- name jmeno
- nome nume
- nommacro
- definemakeup: definieeropmaak definemakeup
- definiereumbruch definujupravu
- definiscimakeup definestemakeup
- definitmakeup
- setupmakeup: stelopmaakin setupmakeup
- stelleumbruchein nastavupravu
- impostamakeup seteazamakeup
- reglemakeup
- startmakeup: startopmaak startmakeup
- startumbruch startuprava
- iniziamakeup startmakeup
- demarremakeup
- stopmakeup: stopopmaak stopmakeup
- stopumbruch stopuprava
- terminamakeup stopmakeup
- stoppemakeup
- useexternalsoundtrack: gebruikexterngeluidsfragment useexternalsoundtrack
- verwendeexternestonstueck uzijexternizvuk
- usacolonnasonoraesterna folosestemuzicaexterna
- utilisepsiteaudioexterne
- useexternalfile: gebruikexternefile useexternalfile
- verwendeexternedatei uzijexternisoubor
- usafileesterno folosestefisierextern
- utilisefichierexterne
- useexternalfiles: gebruikexternefiles useexternalfiles
- verwendeexternedateien uzijexternisoubory
- usafileesterni folosestefisiereexterne
- utilisefichiersexternes
- referral: kenmerk referral
- verweis odkaz
- referral referit
- recommandation
- referraldate: kenmerkdatum referraldate
- verweisdatum odkaznadatum
- datareferral datareferit
- daterecommandation
- high: hoog high
- hoch vysoky
- ap inalt
- haut
- lohi: laho lohi
- tiho nivy
- pedap jossus
- baha
- low: laag low
- tief nizky
- ped jos
- bas
- fraction: breuk fraction
- bruch zlomek
- frazione fractie
- fraction
- chem: chem chem
- chem chem
- chim chem
- chem
- startopposite: startnaast startopposite
- startgegenueber startprotejsek
- iniziaopposto startopozit
- demarreopposition
- stopopposite: stopnaast stopopposite
- stopgegenueber stopprotejsek
- terminaopposto stopopozit
- stoppeopposition
- setupoppositeplacing: stelnaastplaatsenin setupoppositeplacing
- stellegegenueberplatzierenein nastavumisteniprotejsku
- impostaposizionamentoopposti seteazaplasareaopozita
- regleplacementopposition
- startpositioning: startpositioneren startpositioning
- startpositionieren startumistovani
- iniziaposizionamento startpozitionare
- demarrepositionnement
- stoppositioning: stoppositioneren stoppositioning
- stoppositionieren stopumistovani
- terminaposizionamento stoppozitionare
- stoppepositionnement
- position: positioneer position
- position pozice
- posizione pozitie
- position
- setuppositioning: stelpositionerenin setuppositioning
- stellepositionierenein nastavumistovani
- impostaposizionamento setarepozitie
- reglepositionnement
- rotate: roteer rotate
- drehen otocit
- ruota roteste
- oriente
- setuprotate: stelroterenin setuprotate
- stelledrehenein nastavotoceni
- impostarotazione seteazarotare
- regleoriente
- mirror: spiegel mirror
- spiegeln zrcadlit
- riflessione reflexie
- reflete
- scale: schaal scale
- format meritko
- scala scala
- echelle
- setupnumbering: stelnummerenin setupnumbering
- stellenummerierungein nastavcislovani
- impostanumerazione seteazanumerotare
- reglenumerotation
- reset: reset reset
- ruecksetzten reset
- reimposta reset
- raz
- setuppublications: stelpublicatiesin setuppublications
- stellepublikationein nastavpublikace
- impostapubblicazioni seteazapublicatii
- reglepublications
- publication: publicatie publication
- publikation publikace
- pubblicazione publicatie
- publication
- definehbox: definieerhbox definehbox
- definierehbox definujhbox
- definiscihbox definestehbox
- definithbox
- periods: punten periods
- punkt tecky
- punti puncte
- periodes
- setuphyphenmark: stelkoppeltekenin setuphyphenmark
- stellebindestrichein nastavdelitko
- impostasegnosillabazione seteazaliniesilabe
- reglemarquagehyphenation
- setupinterlinespace: stelinterliniein setupinterlinespace
- stellezeilenabstandein nastavmeziradkovoumezeru
- impostainterlinea seteazaspatiuinterliniar
- regleespacementinterligne
- setupspacing: stelspatieringin setupspacing
- stellespatiumein nastavradkovani
- impostaspaziatura seteazaspatiu
- regleespacement
- setuptolerance: steltolerantiein setuptolerance
- stelletoleranzein nastavtoleranci
- impostatolleranza seteazatoleranta
- regletolerance
- setupsystem: stelsysteemin setupsystem
- stellesystemein nastavsystem
- impostasistema seteazasistem
- reglesysteme
- usepath: gebruikgebied usedirectory
- benutzeverzeichnis uzijadresar % TOBIAS
- usacartella folosestedirector
- utilisechemin
- defineparagraphs: definieeralineas defineparagraphs
- definiereabsaetze definujodstavce
- definiscicapoversi definesteparagraf
- definitparagraphes
- setupparagraphs: stelalineasin setupparagraphs
- stelleabsaetzeein nastavodstavce
- impostacapoversi seteazaparagrafe
- regleparagraphes
- donttest: geentest donttest
- keintest zadnytest
- notest nutesta
- sanstest
- setupcomment: stelcommentaarin setupcomment
- stellekommentarein nastavkomentar
- impostacommento seteazacomentariu
- reglecommentaire
- comment: commentaar comment
- kommentar komentar
- commento comentariu
- commentaire
- definefield: definieerveld definefield
- definierefeld definujpole
- definiscicampo definestecamp
- definitchamp
- definemainfield: definieerhoofdveld definemainfield
- definierehauptfeld definujhlavnipole
- definiscicampoprincipale definestecampprincipal
- definitchampprincipal
- definesubfield: definieersubveld definesubfield
- definieresubfeld definujpodpole
- definiscisottocampo definestesubcamp
- definitsouschamp
- clonefield: kloonveld clonefield
- klonierefeld klonujpole
- clonacampo cloneazacamp
- clonechamp
- copyfield: copieerveld copyfield
- kopierefeld kopirujpole
- copiacampo copiazacamp
- copitchamp
- setupfield: stelveldin setupfield
- stellefeldein nastavpole
- impostacampo seteazacamp
- reglechamp
- setupfields: stelveldenin setupfields
- stellefelderin nastavvsechnapole
- impostacampi seteazacampuri
- reglechamps
- field: veld field
- feld pole
- campi camp
- champ
- fitfield: passendveld fitfield
- passendfeld prizpusobivepole % or vhodnepole
- adattacampo potrivestecamp
- ajustechamp
- logfields: registreervelden logfields
- registrierefelder zaznamovepole
- logcampi logcampuri
- logchamp
- showfields: toonvelden showfields
- zeigefelder ukazpole
- mostracampi afiseazacampuri
- montrechamps
- tooltip: suggestie tooltip
- tooltip bublinkovanapoveda
- tooltip tooltip
- suggestion
- fillinfield: invulveld fillinfield
- ausfuellfeld vyplnovepole
- camporiempimento campumplere
- remplitchamp
- definefieldstack: definieerveldstapel definefieldstack
- definierefeldstapel definujzasobnikpoli
- definiscistackcampi definestestivacampuri
- definitpilechamp
- fieldstack: veldstapel fieldstack
- feldstapel zasobnikpoli
- stackcampi stivacampuri
- pilechamp
- setupforms: stelformulierenin setupforms
- setupforms setupforms
- impostaforms seteazaformulare
- regleformulaires
- setupclipping: stelclipin setupclipping
- stelleausschnittein nastavorez
- impostaclippling seteazaclipping
- regleclipping
- clip: clip clip
- ausschnitt orez
- clip clip
- clip
- placelegend: plaatslegenda placelegend
- platzierelegende umistilegendu
- mettilegenda punelegenda
- placelegende
- setuplegend: stellegendain setuplegend
- stellelegendeein nastavlegendu
- impostalegenda seteazalegenda
- reglelegende
- setuppagecomment: stelpaginacommentaarin setuppagecomment
- stelleseitenkommentarein nastavkomentarstrany
- impostacommentopagina seteazacomentariupagina
- reglecommentairepage
- setupstrut: stelstrutin setupstrut
- setupstrut setupstrut
- impostastrut seteazastrut
- reglestrut
- definerule: definieerlijn definerule
- definerule definerule
- definiscilinea definesterigla
- definitregle
- placerule: plaatslijn placerule
- placerule placerule
- mettilinea punerigla
- placeregle
- setuprule: stellijnin setuprule
- setuprule setuprule
- impostalinea seteazarigla
- regleregle
- definetextvariable: definieertekstvariabele definetextvariable
- definetextvariable definetextvariable
- definiscivariabiletesto definestevariabilatext
- definitvariabletexte
- setuptextvariable: steltekstvariabelein setuptextvariable
- setuptextvariable setuptextvariable
- impostavariabiletesto seteazavariabilatext
- reglevariabletexte
- settextvariable: kentekstvariabeletoe settextvariable
- settextvariable settextvariable
- setvariabiletesto setvariabilatext
- affectevariabletexte
- placetextvariable: plaatstekstvariabele placetextvariable
- placetextvariable placetextvariable
- mettivariabiletesto punevariabilatext
- placevariabletexte
- textvariable: tekstvariabele textvariable
- textvariable textvariable
- variabiletesto variabilatext
- variabletexte
- definetextposition: definieertekstpositie definetextposition
- definetextposition definetextposition
- definisciposizionetesto definestepozitietext
- definitpositiontexte
- setuptextposition: steltekstpositiein setuptextposition
- setuptextposition setuptextposition
- impostaposizionetesto seteazapozitietext
- reglepositiontexte
- positiontext: positioneertekst positiontext
- positiontext positiontext
- posizionatesto pozitietext
- positionnetexte
- definerawfont: definerawfont definerawfont
- definerawfont definerawfont
- definiscifontgrezzo definestefontraw
- definitpolicebrute
- switchtorawfont: switchtorawfont switchtorawfont
- switchtorawfont switchtorawfont
- passaafontgrezzo trecilafontraw
- changepolicebrute
- placeheadtext: plaatskoptekst placeheadtext
- placeheadtext placeheadtext
- posizionatestotesta placeheadtext
- placetextetete
- placeheadnumber: plaatskopnummer placeheadnumber
- placeheadnumber placeheadnumber
- posizionanumerotesta placeheadnumber
- placenumerotete
- definepagebreak: definieerpaginaovergang definepagebreak
- definepagebreak definepagebreak
- definepagebreak definepagebreak
- definitsautdepage
- definecolumnbreak: definieerkolomovergang definecolumnbreak
- definecolumnbreak definecolumnbreak
- definecolumnbreak definecolumnbreak
- definitsautdecolonne
- definemathalignment: definieerwiskundeuitlijnen definemathalignment
- definemathalignment definemathalignment
- definemathalignment definemathalignment
- definemathalignment
- setupmathalignment: stelwiskundeuitlijnenin setupmathalignment
- setupmathalignment setupmathalignment
- setupmathalignment setupmathalignment
- setupmathalignment
-
-\stopcommands
-
-% ^ ^ ^ nadenken over \settextvariable vs \setuptextvariable in nl
-
-%D For downward compatibilities sake:
-
-\startcommands dutch english
- german czech
- italian romanian
- french
-
- setupitemgroups: stelopsommingenin setupitemizations
- stelleaufzaehlungenein nastavvycty
- impostaelencazioni setareitemization
- reglegroupeselements
-
-\stopcommands
-
-%D \stopcompressdefinitions
-
-%D There are a lot of variables that users can use in setups
-%D and dedicated macros. ({\em I still have to check the
-%D english names.})
-
-%D \startcompressdefinitions
-
-\startcommands dutch english
- german czech
- italian romanian
- french
-
- topheight: bovenhoogte topheight
- hoeheoben vyskahorejsku
- altezzacima inaltimesus
- hauteursup
- topdistance: bovenafstand topdistance
- abstandoben vzdalenosthorejsku
- distanzacima distantasus
- distancesup
- headerheight: hoofdhoogte headerheight
- kopfzeilenhoehe vyskazahlavi
- altezzaintestazione inaltimeantet
- hauteurentete
- headerdistance: hoofdafstand headerdistance
- kopfzeilenabstand vzdalenostzahlavi
- distanzaintestazione distantaantet
- distanceentete
- textheight: teksthoogte textheight
- texthoehe vyskatextu
- altezzatesto inaltimetext
- hauteurtexte
- footerdistance: voetafstand footerdistance
- fusszeileabstand vzdalenostupati
- distanzapdp distantasubsol
- distancepdp
- footerheight: voethoogte footerheight
- fusszeilenhoehe vyskaupati
- altezzapdp inaltimesubsol
- hauteurpdp
- bottomdistance: onderafstand bottomdistance
- abstandunten vzdalenostspodku
- distanzafondo distantajos
- distanceinf
- bottomheight: onderhoogte bottomheight
- hoeheunten vyskaspodku
- altezzafondo inaltimejos
- hauteurinf
- marginwidth: margebreedte marginwidth
- marginalbreite sirkamarginalie
- ampiezzamargine latimemargine
- largeurmarge
- leftmarginwidth: linkermargebreedte leftmarginwidth
- linkemarginalbreite sirkalevemarginalie
- ampiezzamarginesinistro latimemarginestanga
- largeurmargegauche
- rightmarginwidth: rechtermargebreedte rightmarginwidth
- rechtemarginalbreite sirkapravemarginalie
- ampiezzamarginedestro latimemarginedreapta
- largeurmargedroite
- margindistance: margeafstand margindistance
- marginalafstand vzdalenostmarginalie
- distanzamargine distantamargine
- distancemarge
- leftmargindistance: linkermargeafstand leftmargindistance
- linkemarginalafstand vzdalenostlevemarginalie
- distanzamarginesinistro distantamarginestanga
- distancemargegauche
- rightmargindistance: rechtermargeafstand rightmargindistance
- rechtemarginalafstand vzdalenostpravemarginalie
- distanzamarginedestro distantamarginedreapta
- distancemargedroite
- edgewidth: randbreedte edgewidth
- randbreite sirkaokraje
- ampiezzabordo latimecolturi
- largeurbord
- leftedgewidth: linkerrandbreedte leftedgewidth
- breitelinkerrand sirkalevehookraje
- ampiezzabordosinistro latimecoltstanga
- largeurbordgauche
- rightedgewidth: rechterrandbreedte rightedgewidth
- breiterechterrand sirkapravehookraje
- ampiezzabordodestro latimecoltdreapta
- largeurborddroit
- edgedistance: randafstand edgedistance
- randabstand vzdalenostokraje
- distanzabordo distantacolt
- distancebord
- leftedgedistance: linkerrandafstand leftedgedistance
- abstandlinkerrand vzdalenostlevehookraje
- distanzabordosinistro distantacoltstanga
- distancebordgauche
- rightedgedistance: rechterrandafstand rightedgedistance
- abstandrechterrand vzdalenostpravehookraje
- distanzabordodestro distantacoltdreapta
- distanceborddroit
- innermarginwidth: binnenmargebreedte innermarginwidth
- innermarginwidth innermarginwidth
- innermarginwidth innermarginwidth
- innermarginwidth
- outermarginwidth: buitenmargebreedte outermarginwidth
- outermarginwidth outermarginwidth
- outermarginwidth outermarginwidth
- outermarginwidth
- innermargindistance: binnenmargeafstand innermargindistance
- innermargindistance innermargindistance
- innermargindistance innermargindistance
- innermargindistance
- outermargindistance: buitenmargeafstand outermargindistance
- outermargindistance outermargindistance
- outermargindistance outermargindistance
- outermargindistance
- inneredgewidth: binnenrandbreedte inneredgewidth
- inneredgewidth inneredgewidth
- inneredgewidth inneredgewidth
- inneredgewidth
- outeredgewidth: buitenrandbreedte outeredgewidth
- outeredgewidth outeredgewidth
- outeredgewidth outeredgewidth
- outeredgewidth
- inneredgedistance: binnenrandafstand inneredgedistance
- inneredgedistance inneredgedistance
- inneredgedistance inneredgedistance
- inneredgedistance
- outeredgedistance: buitenrandafstand outeredgedistance
- outeredgedistance outeredgedistance
- outeredgedistance outeredgedistance
- outeredgedistance
- textwidth: tekstbreedte textwidth
- textbreite sirkatextu
- ampiezzatesto latimetext
- largeurtexte
- makeupwidth: zetbreedte makeupwidth
- satzbreite sirkasazby
- ampiezzamakeup latimemakeup
- largeurmakeup
- makeupheight: zethoogte makeupheight
- satzhoehe vyskasazby
- altezzamakeup inaltimemakeup
- hauteurmakeup
- topspace: kopwit topspace
- kopfweite odsazenishora
- spaziocima spatiusus
- espacesup
- bottomspace: bodemwit bottomspace
- bottomspace bottomspace
- spaziofondo spatiujos
- espaceinf
- backspace: rugwit backspace
- rumpfweite odsazenizleva
- spaziodietro spatiuspate
- retourarriere
- cutspace: snijwit cutspace
- cutspace cutspace
- cutspace cutspace
- cutspace
- paperwidth: papierbreedte paperwidth
- papierbreite sirkapapiru
- ampiezzacarta latimehartie
- largeurpapier
- paperheight: papierhoogte paperheight
- papierhoehe vyskapapiru
- altezzacarta inaltimehartie
- hauteurpapier
- printpaperwidth: printpapierbreedte printpaperwidth
- printpapierbreite sirkatiskpapiru
- ampiezzacartastampa latimehartieimprimanta
- largeureditionpapier
- printpaperheight: printpapierhoogte printpaperheight
- printpapierhoehe vyskatiskpapiru
- altezzacartastampa inaltimehartieimprimanta
- hauteureditionpapier
- pageoffset: paginaoffset pageoffset
- pageoffset pageoffset
- pageoffset pageoffset
- pageoffset
- pagedepth: paginadiepte pagedepth
- pagedepth pagedepth
- pagedepth pagedepth
- pagedepth
- headlevel: kopniveau headlevel
- kopfniveau hlavniuroven
- livellotesta niveltitlu
- niveautete
- linewidth: lijndikte linethickness
- liniendicke tloustkacary
- spessoreriga grosimelinie
- largeurligne
- totalnumberofpages: totaalaantalpaginas totalnumberofpages
- gesamtseitenanzahl celkovypocetstran
- numerototaledipagine numartotalpagini
- nombretotaldepages
- numberofsubpages: aantalsubpaginas numberofsubpages
- numberofsubpages numberofsubpages
- numberofsubpages numberofsubpages
- nombredesouspages
- useXMLfilter: gebruikXMLfilter useXMLfilter
- useXMLfilter useXMLfilter
- useXMLfilter useXMLfilter
- useXMLfilter
- definecolumnset: definieerkolomgroep definecolumnset
- definecolumnset definecolumnset
- definiscigruppocolonne definecolumnset
- definitjeucolonne
- setupcolumnset: stelkolomgroepin setupcolumnset
- setupcolumnset setupcolumnset
- impostagruppocolonne setupcolumnset
- reglejeucolonne
- startcolumnset: startkolomgroep startcolumnset
- startcolumnset startcolumnset
- iniziagruppocolonne startcolumnset
- demarrejeucolonne
- stopcolumnset: stopkolomgroep stopcolumnset
- stopcolumnset stopcolumnset
- terminagruppocolonne stopcolumnset
- stoppejeucolonne
- setupcolumnsetlines: stelkolomgroepregelsin setupcolumnsetlines
- setupcolumnsetlines setupcolumnsetlines
- setupcolumnsetlines setupcolumnsetlines
- setupcolumnsetlines
- setupcolumnsetstart: stelkolomgroepstartin setupcolumnsetstart
- setupcolumnsetstart setupcolumnsetstart
- setupcolumnsetstart setupcolumnsetstart
- setupcolumnsetstart
- startcolumnmakeup: startkolomopmaak startcolumnmakeup
- startcolumnmakeup startcolumnmakeup
- startcolumnmakeup startcolumnmakeup
- startcolumnmakeup
- stopcolumnmakeup: stopkolomopmaak stopcolumnmakeup
- stopcolumnmakeup stopcolumnmakeup
- stopcolumnmakeup stopcolumnmakeup
- stopcolumnmakeup
- usetypescript: gebruiktypescript usetypescript
- usetypescript usetypescript
- usetypescript usetypescript
- usetypescript
- usetypescriptfile: gebruiktypescriptfile usetypescriptfile
- usetypescriptfile usetypescriptfile
- usetypescriptfile usetypescriptfile
-
-\stopcommands
-
-%D \stopcompressdefinitions
-
-%D At \PRAGMA\ we use an extended version of \CONTEXT. The
-%D commands below are part of this. Beware of conflicts when
-%D defining your own.
-
-%D \startcompressdefinitions
-
-\startcommands dutch english
- german czech
- italian romanian
- french
-
- startdocument: startdocument startdocument
- startdokument startdokument
- iniziadocumento startdocument
- demarredocument
- stopdocument: stopdocument stopdocument
- stopdokument stopdokument
- terminadocumento stopdocument
- stoppedocument
- startoverzicht: startoverzicht startoverview
- startueberblick startprehled
- iniziaoverview startoverview
- demarrevuedensemble
- stopoverzicht: stopoverzicht stopoverview
- stopueberblick stopprehled
- terminaoverview stopoverview
- stoppevuedensemble
- label: label label
- label poppisek
- etichetta eticheta
- etiquette
- labels: labels labels
- labels popisky
- etichette etichete
- etiquettes
- domicile: woonplaats domicile
- wohnort bydliste
- domicilio domiciliu
- domicile
-
-\stopcommands
-
-%D \stopcompressdefinitions
-
-\stoplogginginterface
+%D This file has been replaced by \type {mult-def.lua} from which we
+%D generate separate interface definition files.
+
+% obsolete:
+%
+% \startcommands dutch english
+% german czech
+% italian romanian
+% french
+%
+% language: taal language
+% sprache jazyk
+% lingua limba
+% langue
+%
+% \stopcommands
\endinput
diff --git a/tex/context/base/mult-con.tex b/tex/context/base/mult-con.tex
index f58f0592d..62e97d567 100644
--- a/tex/context/base/mult-con.tex
+++ b/tex/context/base/mult-con.tex
@@ -11,3996 +11,43 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D In this rather large definition file we are going to tell
-%D \CONTEXT\ which constants, variables and elements we use.
+%D This file has been replaced by \type {mult-def.lua} from which we
+%D generate separate interface definition files.
-\writestatus{loading}{Context Multilingual Macros / Constants}
-
-\startlogginginterface context.con
-
-%D Todo:
-
-\startvariables all
- lesshyphenation: lesshyphenation
- morehyphenation: morehyphenation
-\stopvariables
-
-%D First come some variables. These are used as keywords and
-%D therefore need a different treatment.
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- one: een one
- eins jedna
- uno unu
- un
- two: twee two
- zwei dve
- due doi
- deux
- three: drie three
- drei tri
- tre trei
- trois
- four: vier four
- vier ctyri
- quattro patru
- quatre
- five: vijf five
- fuenf pet
- cinque cinci
- cinq
-\stopvariables
-
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- environment: omgeving environment
- umgebung prostredi
- ambiente mediu
- environement
- component: onderdeel component
- komponente komponenta
- componente componenta
- composant
- product: produkt product
- produkt produkt
- prodotto produs
- produit
- project: project project
- projekt projekt
- progetto proiect
- projet
-
-\stopvariables
-
-%D \stopcompressdefinitions
-
-%D Of course we need the names of the months.
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- sunday: zondag sunday
- sonntag nedele
- domenica duminica
- dimanche
- monday: maandag monday
- montag pondeli
- lunedi luni
- lundi
- tuesday: dinsdag tuesday
- dienstag utery
- martedi marti
- mardi
- wednesday: woensdag wednesday
- mittwoch streda
- mercoledi miercuri
- mercredi
- thursday: donderdag thursday
- donnerstag ctvrtek
- giovedi joi
- jeudi
- friday: vrijdag friday
- freitag patek
- venerdi vineri
- vendredi
- saturday: zaterdag saturday
- samstag sobota
- sabato sambata
- samedi
-\stopvariables
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- january: januari January
- Januar leden
- gennaio ianuarie
- janvier
- february: februari February
- Februar unor
- febbraio februarie
- fevrier
- march: maart March
- Maerz brezen
- marzo martie
- mars
- april: april April
- April duben
- aprile aprilie
- avril
- may: mei May
- Mai kveten
- maggio mai
- mai
- june: juni June
- Juni cerven
- giugno iunie
- juin
- july: juli July
- Juli cervenec
- luglio iulie
- juillet
- august: augustus August
- August srpen
- agosto august
- aout
- september: september September
- September zari
- settembre septembrie
- septembre
- october: oktober October
- Oktober rijen
- ottobre octombrie
- octobre
- november: november November
- November listopad
- novembre noiembrie
- novembre
- december: december December
- Dezember prosinec
- dicembre decembrie
- decembre
-\stopvariables
-
-%D Next we introduce some general label bound variables:
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- atpage: oppagina atpage
- aufseite nastrance
- apagina lapagina
- alapage
- hencefore: hierboven hencefore
- vorher vyse
- precedente precedent
- precedent
- hereafter: hieronder hereafter
- nachher nize
- seguente urmator
- suivant
-
-\stopvariables
-
-%D \stopcompressdefinitions
-
-%D User defined commands are language specific, so we have to
-%D use variables when defining them. First we define some
-%D general structuring variables:
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- part: deel part
- teil cast
- parte parte
- partie
- chapter: hoofdstuk chapter
- kapitel kapitola
- capitolo capitol
- chapitre
- subject: onderwerp subject
- thema tema
- argomento subiect
- sujet
- section: paragraaf section
- absatz sekce
- capoverso sectiune
- section
- title: titel title
- titel titul
- titolo titlu
- titre
- margintitle: margetitel margintitle
- marginaltitel titulmarginalie
- titoloinmargine titlumarginal
- titremarge
- content: inhoud content
- inhalt obsah
- indice cuprins
- contenu
- contents: inhouden contents
- inhalte obsah
- indici cuprinsuri
- contenus
- appendix: bijlage appendix
- anhang dodatek
- appendice apendix
- annexe
- appendices: bijlagen appendices
- anhaenge dodatky
- appendici apendixuri
- annexes
- bodypart: hoofdtekst bodypart
- haupttext hlavnicast
- testoprincipale principal
- corpsdetexte
- bodymatter: hoofdteksten bodymatter
- haupttexte hlavnicasti
- testiprincipali principalul
- texteprincipal
- frontpart: inleiding frontpart
- einleitung prednicast
- prefazione prolog
- preface
- frontmatter: inleidingen frontmatter
- einleitungen prednicasti
- preambolo prologul
- preambule
- backpart: uitleiding backpart
- epilog epilog
- postfazione epilog
- postface
- backmatter: uitleidingen backmatter
- epiloge epilogy
- postambolo epilogul
- epilogue
- footnote: voetnoot footnote
- fussnote poznamkapodcarou
- notapdp notasubsol
- notepdp
- endnote: eindnoot endnote
- endnote endnote
- endnote endnote
- notefin
- system: systeem system
- systeme system
- sistema sistem
- systeme
-
-\stopvariables
-
-%D For Taco:
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- subsection: subparagraaf subsection
- unterabsatz podsekce
- sottocapoverso subsectiune
- soussection
-
- subsubsection: subsubparagraaf subsubsection
- unterunterabsatz podpodsekce
- sottosottocapoverso subsubsectiune
- soussoussection
-
- subsubsubsection: subsubsubparagraaf subsubsubsection
- unterunterunterabsatz podpodpodsekce
- sottosottosottocapoverso subsubsubsectiune
- soussoussoussection
-
- subsubsubsubsection: subsubsubsubparagraaf subsubsubsubsection
- unterunterunterunterabsatz podpodpodpodsekce
- sottosottosottosottocapoverso subsubsubsubsectiune
- soussoussoussoussection
-
-subsubsubsubsubsection: subsubsubsubsubparagraaf subsubsubsubsubsection
- unterunterunterunterunterabsatz podpodpodpodpodsekce
- sottosottosottosottosottocapoverso subsubsubsubsubsectiune
- soussoussoussoussoussection
-
- subsubject: subonderwerp subsubject
- unterthema podtema
- sottoargomento subsubiect
- soussujet
-
- subsubsubject: subsubonderwerp subsubsubject
- unterunterthema podpodtema
- sottosottoargomento subsubsubiect
- soussoussujet
-
- subsubsubsubject: subsubsubonderwerp subsubsubsubject
- unterunterunterthema podpodpodtema
- sottosottosottoargomento subsubsubsubiect
- soussoussoussujet
-
- subsubsubsubsubject: subsubsubsubonderwerp subsubsubsubsubject
- unterunterunterunterthema podpodpodpodtema
- sottosottosottosottoargomento subsubsubsubsubiect
- soussoussoussoussujet
-
-subsubsubsubsubsubject: subsubsubsubsubonderwerp subsubsubsubsubsubject
- unterunterunterunterunterthema podpodpodpodpodtema
- sottosottosottosottosottoargomento subsubsubsubsubsubiect
- soussoussoussoussoussujet
-
-\stopvariables
-
-%D For the confused (to be translated):
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- flushleft: lijnlinks flushleft
- flushleft flushleft
- flushleft flushleft
- flushleft
- flushright: lijnrechts flushright
- flushright flushright
- flushright flushright
- flushright
- center: centreer center
- center center
- center center
- center
- flushouter: lijnbuiten flushouter
- flushouter flushouter
- flushouter flushouter
- flushouter
- flushinner: lijnbinnen flushinner
- flushinner flushinner
- flushinner flushinner
- flushinner
-
-\stopvariables
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- typing: typen typing
- tippen typing
- typing typing
- typing
- file: file file
- datei soubor
- file fisier
- fichier
-
-\stopvariables
-
-%D \stopcompressdefinitions
-
-%D As we can see below, there are some more variables needed,
-%D for instance for the definition of macro's for handling
-%D floating bodies.
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- formula: formule formula
- formel rovnice
- formula formula
- formule
- subformula: subformule subformula
- subformel subrovnice
- subformula subformula
- subformule
- formulae: formules formulae
- formeln rovnice
- formule formule
- formules
- figure: figuur figure
- abbildung obrazek
- figura figura
- figure
- figures: figuren figures
- abbildungen obrazky
- figure figure
- figures
- table: tabel table
- tabelle tabulka
- tabella tabelul
- tableau
- tables: tabellen tables
- tabellen tabulky
- tabelle tabelele
- tables
- graphic: grafiek graphic
- grafik graf
- grafico graficul
- graphique
- graphics: grafieken graphics
- grafiken grafy
- grafici graficele
- graphiques
- intermezzo: intermezzo intermezzo
- intermezzo intermezzo
- intermezzo intermezzo
- intermezzo
- intermezzi: intermezzos intermezzi
- intermezzi intermezzi
- intermezzi intermezzi
- intermezzi
- index: index index
- index rejstrik
- indiceanalitico index
- index
- indices: indices indices
- indizies rejstriky
- indicianalitici indexuri
- indices
- abbreviation: afkorting abbreviation
- abkuerzung zkratka
- abbreviazione abreviere
- abreviation
- abbreviations: afkortingen abbreviations
- abkuerzungen zkratky
- abbreviazioni abrevieri
- abreviations
- logo: logo logo
- logo logo
- logo logo
- logo
- logos: logos logos
- logos loga
- loghi logos
- logos
- unit: eenheid unit
- einheit jednotka
- unita unitate
- unite
- units: eenheden units
- einheiten jednotky
- unita unitati
- unites
- line: regel line
- zeile radek
- riga linia
- ligne
- lines: regels lines
- zeilen radky
- righe linii
- lignes
- framedtext: kadertekst framedtext
- umrahmtertext oramovanytext
- testoincorniciato textinconjurat
- texteencadre
- quotation: citaat quotation
- zitat citace
- citazione citat
- citation
- blockquote: blokcitaat blockquote
- blockquote blockquote
- blockquote blockquote
- blockquote
- quote: citeer quote
- zitieren citovat
- menzione minicitat
- citer
- speech: spraak speech
- speech speech
- speech speech
- discours
- itemize: opsomming itemize
- aufzaehlung vycet
- elenco enumerare
- lister
- mathalignment: wiskundeuitlijnen mathalignment
- mathalignment mathalignment
- mathalignment mathalignment
- mathalignment
- mathcases: mathcases mathcases
- mathcases mathcases
- mathcases mathcases
- mathcases
- mathmatrix: wiskundematrix mathmatrix
- mathmatrix mathmatrix
- mathmatrix mathmatrix
- mathmatrix
-
-\stopvariables
-
-%D \stopcompressdefinitions
-
-%D The setup commands can take a lot of different arguments,
-%D often in the form \type{variable=value}. Here we define the
-%D variable part. Keep in mind that for the system, user defined
-%D variables have a constant character.
-
-%D \startcompressdefinitions
-
-\startconstants all
- equalwidth: equalwidth
- equalheight: equalheight
-\stopconstants
-
-
-\startconstants dutch english
- german czech
- italian romanian
- french
-
- sorttype: sortering sorttype
- sorttype sorttype
- sorttype sorttype
- sorttype
- compress: comprimeren compress
- compress compress
- compress compress
- compress compress
- compress
- autohang: autohang autohang
- autohang autohang
- autohang autohang
- autohang
- suffix: suffix suffix
- suffix suffix
- suffix suffix
- suffix
- leftquotation: linkercitaat leftquotation
- linkerzitat citacevlevo
- citazionesinistra citatstanga
- citationgauche
- rightquotation: rechtercitaat rightquotation
- rechterzitat citacevpravo
- citazionedestra citatdreapta
- citationdroite
- leftquote: linkerciteer leftquote
- linkerzitieren citovatvlevo
- menzionesinistra minicitatstanga
- citergauche
- rightquote: rechterciteer rightquote
- rechterzitieren citovatvpravo
- menzionedestra minicitatdreapta
- citerdroite
- compoundhyphen: koppelteken compoundhyphen
- compoundhyphen compoundhyphen
- compoundhyphen compoundhyphen
- compoundhyphen
- leftcompoundhyphen: linkerkoppelteken leftcompoundhyphen
- leftcompoundhyphen leftcompoundhyphen
- leftcompoundhyphen leftcompoundhyphen
- leftcompoundhyphen
- rightcompoundhyphen: rechterkoppelteken rightcompoundhyphen
- rightcompoundhyphen rightcompoundhyphen
- rightcompoundhyphen rightcompoundhyphen
- rightcompoundhyphen
- midsentence: middenzin midsentence
- midsentence midsentence
- midsentence midsentence
- midsentence
- leftsentence: linkerzin leftsentence
- linkersatz vetavlevo
- frasesinistra propozitiestanga
- phrasegauche
- rightsentence: rechterzin rightsentence
- rechtersatz vetavpravo
- frasedestra propozitiedreapta
- phrasedroite
- leftsubsentence: linkersubzin leftsubsentence
- linkersubsatz podvetavlevo
- sottofrasesinistra subpropozitiestanga
- sousphrasegauche
- rightsubsentence: rechtersubzin rightsubsentence
- rechtersubsatz podvetavpravo
- sottofrasedestra subpropozitiedreapta
- sousphrasedroite
- leftspeech: linkeruitspraak leftspeech
- leftspeech leftspeech
- leftspeech leftspeech
- leftspeech
- middlespeech: middenuitspraak middlespeech
- middlespeech middlespeech
- middlespeech middlespeech
- middlespeech
- rightspeech: rechteruitspraak rightspeech
- rightspeech rightspeech
- rightspeech rightspeech
- rightspeech
- limittext: limiettekst limittext
- limittext limittext
- limittext limittext
- limittext
- date: datum date
- datum datum
- data data
- date
- spacebefore: voorwit spacebefore
- vorspatium mezerapred
- spazioprima spatiuinainte
- espaceavant
- spaceinbetween: tussenwit spaceinbetween
- spaceinbetween spaceinbetween
- spaceinbetween spaceinbetween
- spaceinbetween
- spaceafter: nawit spaceafter
- nachspatium mezeraza
- spaziodopo spatiudupa
- espaceapres
- sidespacebefore: zijvoorwit sidespacebefore
- nebenvorspatium bocnimezerapred
- spaziolateraleprima spatiulateralinainte
- espacelateralavant
- sidespaceafter: zijnawit sidespaceafter
- nebennachspatium bocnimezeraza
- spaziolateraledopo spatiulateraldupa
- espacelateralapres
- to: aan to
- zu na
- verso catre
- vers
- indicator: aanduiding indicator
- indikator indikator
- indicatore indicator
- indicateur
- background: achtergrond background
- hintergrund pozadi
- sfondo fundal
- arriereplan
- backgrounddepth: achtergronddiepte backgrounddepth
- hintergrundtiefe hloubkapozadi
- profonditasfondo adancimefundal
- profondeurarriereplan
- backgroundcorner: achtergrondhoek backgroundcorner
- hintergrundwinkel rohpozadi
- angolosfondo coltfundal
- coinarriereplan
- splitcolor: splitskleur splitcolor
- splitcolor splitcolor
- splitcolor splitcolor
- splitcolor
- backgroundcolor: achtergrondkleur backgroundcolor
- hintergrundfarbe barvapozadi
- coloresfondo culoarefundal
- couleurarriereplan
- foregroundcolor: voorgrondkleur foregroundcolor
- foregroundcolor foregroundcolor
- coloreprimopiano foregroundcolor
- couleurpremierplan
- foregroundstyle: voorgrondletter foregroundstyle
- foregroundstyle foregroundstyle
- foregroundstyle foregroundstyle
- stylepremierplan
- clipoffset: clipoffset clipoffset
- clipoffset clipoffset
- clipoffset clipoffset
- clipoffset
- backgroundoffset: achtergrondoffset backgroundoffset
- hintergrundoffset offsetpozadi
- offsetsfondo offsetfundal
- decalagearriereplan
- backgroundscreen: achtergrondraster backgroundscreen
- hintergrundraster rastrpozadi
- schermosfondo ecranfundal
- ecranarriereplan
- backgroundradius: achtergrondstraal backgroundradius
- hintergrundradius polomerpozadi
- raggiosfondo razafundal
- rayonarriereplan
- address: adres address
- adresse adresa
- indirizzo adresa
- adresse
- stopper: afsluiter stopper
- abschnitttrenner predel
- stopper stopper
- taquet
- distance: afstand distance
- abstand vzdalenost
- distanza distanta
- distance
- paragraph: alinea paragraph
- absatz odstavec
- capoverso paragraf
- paragraphe
- axis: assenstelsel axis
- achsen osa
- asse axa
- axe
- author: auteur author
- autor autor
- autore autor
- auteur
- auto: auto auto
- auto auto
- auto auto
- auto
- autofile: autofile autofile
- autofile autofile
- autofile autofile
- autofile % TB TH
- balance: balanceren balance
- ausgleichen rovnovaha
- bilanciamento balanta
- equilibre
- bookmark: bookmark bookmark
- bookmark zalozka
- segnalibro semncarte
- marquepage
- wfactor: bfactor wfactor
- bfaktor sfaktor
- wfactor factorw
- facteurlargeur
- inner: binnen inner
- innen vnitrni
- interno intern
- interieur
- blank: blanko blank
- blanko prazdny
- rigovuoto blanc
- vide
- obstruction: blokkade obstruction
- gesperrt prekazka
- ostruzione obstructie
- obstruction
- blockway: blokwijze blockway
- blockauf dobloku
- blockway blockway
- blockway
- bottomspace: bodemwit bottomspace
- bottomspace bottomspace
- spaziofondo spatiujos
- espaceinf
- top: boven top
- oben vrsek
- cima sus
- sup
- topdistance: bovenafstand topdistance
- obenabstand vzdalenostvrsku
- distanzacima distantasus
- distancesup
- topframe: bovenkader topframe
- obenrahmen rameceknahore
- cornicecima framesus
- cadresup
- topoffset: bovenoffset topoffset
- obenoffset offsetvrsku
- offsetcima offsetsus
- decalagesup
- topstate: bovenstatus topstate
- statusoben statusvrsku
- statocima staresus
- etatsup
- width: breedte width
- breite sirka
- ampiezza latime
- largeur
- autowidth: autobreedte autowidth
- autobreite autosirka
- autoampiezza autolatime
- autolargeur
- maxwidth: maxbreedte maxwidth
- maxbreite maxsirka
- ampiezzamax latimemaxima
- largeurmax
- minwidth: minbreedte minwidth
- minbreite minsirka
- ampiezzamin latimeminima
- largeurmin
- source: bron source
- quelle zdroj
- origine sursa
- origine
- command: commando command
- befehl prikaz
- comando comanda
- commande
- commands: commandos commands
- befehle prikazy
- comandi comenzi
- commandes
- component: component component
- component component
- component component
- composant
- contrastcolor: contrastkleur contrastcolor
- kontrastfarbe kontrastnibarva
- colorecontrasto culoarecontrast
- coleurcontraste
- conversion: conversie conversion
- konversion konverze
- conversione conversie
- conversion
- headconversion: kopconversie headconversion
- headconversion konverzehlavicky
- conversionetesta conversietitlu
- conversiontete % TB
- headlabel: koplabel headlabel
- headlabel popisekhlavicky
- etichettatesta etichetatitlu
- etiquettetete
- criterium: criterium criterium
- kriterium kriterium
- criterio criteriu
- critere
- date: datum date
- datum datum
- data data
- date
- default: default default
- default implicitni
- implicito implicit
- defaut
- depth: diepte depth
- tiefe hloubka
- profondita inaltime
- profondeur
- depthcorrection: dieptecorrectie depthcorrection
- tiefekorrektur korekcehloubky
- correzioneprofondita corectieadancime
- correctionprofondeur
- continue: doorgaan continue
- fortsetzen pokracovat
- continua continua
- continue
- doublesided: dubbelzijdig doublesided
- doppelseitig oboustranne
- doppiafaccia douafete
- rectoverso
- dummy: dummy dummy
- dummy dummy
- dummy dummy
- dummy
- unit: eenheid unit
- einheit jednotka
- unita unitate
- unite
- ownnumber: eigennummer ownnumber
- eigenenummer vlastnicislo
- numeroproprio numarpropriu
- numeroproprio
-% eigenschap: eigenschap property
-% property property
-% property property
-% property
- evenmargin: evenmarge evenmargin
- geraderand sudamarginalie
- marginepari marginepara
- margepaire
- expansion: expansie expansion
- expansion expanzen
- espansione expansiune
- expansion
- keyexpansion: sleutelexpansie keyexpansion
- keyexpansion keyexpansion
- keyexpansion keyexpansion
- keyexpansion
- factor: factor factor
- faktor faktor
- fattore factor
- facteur
- convertfile: converteerfile convertfile
- konvertieredatei konverzesouboru
- convertifile convertestefisier
- conversionfichier
- file: file file
- datei soubor
- file fisier
- fichier
- inputfile: inputfile inputfile
- inputfile inputfile
- inputfile inputfile
- fichierentree
- size: formaat size
- groesse velikost
- dimensione dimensiune
- dimension
- autofocus: autofocus autofocus
- autofocus autoostreni
- autofocus autofocus
- autofocus
- focus: focus focus
- focus zaostreni
- focus focus
- focus
- directory: gebied directory
- verzeichnis adresar
- directory director
- repertoire
- cache: cache cache
- cache cache
- cache cache
- cache
- grid: grid grid
- gritter mrizka
- griglia grid
- grille
- big: groot big
- gross velky
- grande mare
- grand
- get: haal get
- hole ziskat
- prendi adu
- obtient
- hang: hang hang
- haengend zaveseni
- sospendi suspenda
- suspend
- repeat: herhaal repeat
- wiederholen opakovat
- ripeti repeta
- repete
- hfactor: hfactor hfactor
- hfaktor vfaktor
- hfactor hfactor
- facteurhauteur
- corner: hoek corner
- winkel roh
- angolo colt
- coin
- hoffset: hoffset hoffset
- hoffset hoffset
- hoffset hoffset
- decalagehauteur
- frames: hokjes frames
- umrahmen ramecky
- cornici frames
- cadres
- header: hoofd header
- kopfzeile zahlavi
- intestazione antet
- entete
- headerdistance: hoofdafstand headerdistance
- kopfzeilenabstand vzdalenostzahlavi
- distanzaintestazione distantaantet
- distanceentete
- headerstate: hoofdstatus headerstate
- kopfzeilenstatus statuszahlavi
- statointestazione stareantet
- etatentete
- height: hoogte height
- hoehe vyska
- altezza inaltime
- hauteur
- maxheight: maxhoogte maxheight
- maxhoehe maxvyska
- altezzamax inaltimemaxima
- hauteurmax
- minheight: minhoogte minheight
- minhoehe minvyska
- altezzamin inaltimeminima
- hauteurmin
- mindepth: mindiepte mindepth
- mindepth mindepth
- mindeoth mindepth
- profondeurmin
- current: huidige current
- aktuell aktualni
- corrente curent
- courant
- in: in in
- in v
- in in
- in
- indenting: inspringen indenting
- einziehen odsazovani
- rientro aliniat
- composeenalinea
- interaction: interactie interaction
- interaktion interakce
- interazione interactiune
- interaction
- interlinespace: interlinie interlinespace
- zeilenabstande meziradkovamezera
- interlinea spatiereinterliniara
- espaceinterligne
- items: items items
- posten polozky
- elementi elemente
- elements
- fallback: terugval fallback
- fallback fallback
- fallback fallback
- fallback
- frame: kader frame
- rahmen ramecek
- cornice frame
- cadre
- framedepth: kaderdiepte framedepth
- rahmentiefe hloubkaramecku
- profonditacornice adancimeframe
- profondeurcadre
- framecorner: kaderhoek framecorner
- rahmenwinkel rohramecku
- angolocornice coltframe
- coincadre
- framecolor: kaderkleur framecolor
- rahmenfarbe barvaramecku
- colorecornice culoareframe
- couleurcadre
- frameoffset: kaderoffset frameoffset
- rahmenoffset offsetramecku
- offsetcornice offsetframe
- decalagecadre
- frameradius: kaderstraal frameradius
- rahmenradius polomerramecku
- raggiocornice razaframe
- rayoncadre
- marginedge: kantlijn marginedge
- marginalkante textovahrana
- bordomargine coltbordura
- bordmarge
- marginedgetext: kantlijntekst marginedgetext
- marginalkantetext textmarginalnihookraje
- testobordomargine textcoltbordura
- textebordmarge
- aligncharacter: karakteruitlijnen aligncharacter
- aligncharacter aligncharacter
- allineacarattere aliniazacaracter
- caracterealigne
- alignmentcharacter: uitlijnkarakter alignmentcharacter
- alignmentcharacter alignmentcharacter
- carattereallineamento alierecaracter
- alignementcaractere
- small: klein small
- klein male
- piccolo mic
- petit
- color: kleur color
- farbe barva
- colore culoare
- couleur
- column: kolom column
- spalte sloupec
- colonna coloana
- colonne
- columns: kolommen columns
- spalten sloupce
- colonne coloane
- colonnes
- columndistance: kolomafstand columndistance
- spaltenabstand vzdalenostsloupcu
- distanzacolonne distantacoloane
- distancecolonne
- headcommand: kopcommando headcommand
- headcommand headcommand
- headcommand headcommand
- commandetete
- headcolor: kopkleur headcolor
- kopffarbe barvahlavicky
- coloretesta culoaretitlu
- couleurtete
- headstyle: kopletter headstyle
- kopfstil stylhlavicky
- stiletesta stiltitlu
- styletete
- afterhead: kopna afterhead
- nachkopf pohlavicce
- dopotesta dupatitlu
- aprestete
- veroffset: kopoffset veroffset
- kopfoffset offsethlavicky
- veroffset veroffset
- veroffset
- coupling: koppeling coupling
- verknuepfung propojeni
- accoppiamento cuplare
- couplage
- couplingway: koppelwijze couplingway
- verkopplungsart zpusobpropojeni
- modoaccoppiamento modcuplare
- modecouplage
- beforehead: kopvoor beforehead
- vorkopf predhlavickou
- primaditesta inaintetitlu
- avanttete
- topspace: kopwit topspace
- kopfspatium svrchnimezera
- spaziocima spatiusus
- espacesup
- bodyfont: korps bodyfont
- fliesstext zakladnifont
- fonttesto fonttext
- policecorps
- label: label label
- label popisek
- etichetta eticheta
- etiquette
- empty: leeg empty
- leer prazdne
- vuoto gol
- vide
- style: letter style
- stil pismeno
- stile stil
- style
- rule: lijn rule
- linie linka
- linea rigla
- ligne
- rulethickness: lijndikte rulethickness
- liniendicke tloustkalinky
- spessorelinea grosimerigla
- epaisseurligne
- rulecolor: lijnkleur rulecolor
- linienfarbe barvalinky
- colorelinea culoarerigla
- couleurligne
- list: lijst list
- liste seznam
- elenco lista
- liste
- leftwidth: linkerbreedte leftwidth
- linkerbreite sirkavlevo
- ampiezzasinistra latimestanga
- largeurgauche
- leftframe: linkerkader leftframe
- linkerrahmen ramecekvlevo
- cornicesinistra framestanga
- cadregauche
- leftcolor: linkerkleur leftcolor
- linkerfarbe barvavlevo
- coloresinistra culoarestanga
- couleurgauche
- leftstyle: linkerletter leftstyle
- linkerstil stylvlevo
- stilesinistra stilstanga
- leftstyle
- leftmargin: linkermarge leftmargin
- linkerrand levyokraj
- marginesinistro marginestanga
- margegauche
- innermargin: binnenmarge innermargin
- innermargin innermargin
- margineinterno innermargin
- margeinterieure
- outermargin: buitenmarge outermargin
- outermargin outermargin
- margineesterno outermargin
- margeexterieure
- leftmargindistance: linkermargeafstand leftmargindistance
- linkerrandabstand vzdalenostlevehookraje
- distanzamarginesinistro distantamarginestanga
- distancemargegauche
- leftoffset: linkeroffset leftoffset
- linkeroffset levyoffset
- offsetsinistro offsetstanga
- decalagegauche
- leftedge: linkerrand leftedge
- linkekante levahrana
- bordosinistro bordurastanga
- bordgauche
- leftedgedistance: linkerrandafstand leftedgedistance
- linkerkantenabstand vzdalenostlevehrany
- distanzabordosinistro distantabordurastanga
- distancebordgauche
- lefttext: linkertekst lefttext
- linkertext textvlevo
- testosinistro textstanga
- textegauche
- left: links left
- links vlevo
- sinistra stanga
- gauche
- nleft: nlinks nleft
- nlinks nvlevo
- nsinistra nstanga
- ngauche
- logo: logo logo
- logo logo
- logo logo
- logo
- logos: logos logos
- logos loga
- loghi logos
- logos
- local: lokaal local
- lokal lokalne
- locale local
- local
- margin: marge margin
- marginalie marginalie
- margine margine
- marge
- margindistance: margeafstand margindistance
- marginalabstand vzdalenostokraje
- distanzamargine distantamargine
- distancemarge
- margintext: margetekst margintext
- marginaltext textmarginalie
- testomargine textmargine
- textemarge
- marking: markering marking
- beschriftung znaceni
- marcatura marcaje
- marquage
- marcolor: markleur marcolor
- beschrfarbe barvaznacky
- coloremarcatura culoaremarcaj
- couleurmarquage
- marstyle: marletter marstyle
- beschrstil stylsnacky
- stilemarcatura stilmarcaj
- stylemarquage
- menu: menu menu
- menue menu
- menu meniu
- menu
- splitmethod: splitsmethode splitmethod
- splitmethod splitmethod
- splitmethod splitmethod
- splitmethod
- textmethod: tekstmethode textmethod
- textmethod textmethod
- textmethod textmethod
- textmethod
- sidemethod: zijmethode sidemethod
- sidemethod sidemethod
- sidemethod sidemethod
- sidemethod
- method: methode method
- methode metoda
- metodo metoda
- methode
- middle: midden middle
- mittig stredni
- centro mijloc
- milieu
- middletext: middentekst middletext
- mittigertext strednitext
- testocentro textmijloc
- textecentre
- max: max max
- max max
- max max
- max
- min: min min
- min min
- min min
- min
- sample: monster sample
- muster vzor
- campione exemplu
- echantillon
- after: na after
- nach po
- dopo dupa
- apres
- name: naam name
- name jmeno
- nome nume
- nom
- commandafter: nacommando commandafter
- zumbefehl prikazpo
- comdandodopo comandadupa
- commandeapres
- ntop: nboven ntop
- noben nvrsek
- ncima nsus
- nsup
- level: niveau level
- niveau uroven
- livello nivel
- niveau
- levels: niveaus levels
- niveaus urovne
- livelli nivele
- niveaux
- nbottom: nonder nbottom
- nunten nspodek
- nfondo njos
- ninf
- norm: norm norm
- norm norm
- norma norm
- norme
- nlines: nregels nlines
- zzeile nradky
- nrighe nlinii
- nlignes
- number: nummer number
- nummer cislo
- numero numar
- numero
- numbercommand: nummercommando numbercommand
- nummerbefehl ciselnyprikaz
- comandonumero comandanumar
- commandenumero
- numbering: nummeren numbering
- nummerierung cislovani
- numerazione numerotare
- numerotation
- numbercolor: nummerkleur numbercolor
- nummernfarbe barvacisla
- colorenumero culoarenumar
- couleurnumero
- numberstyle: nummerletter numberstyle
- nummernstil stylcisla
- stilenumero stilnumar
- stylenumero
- numberseparator: nummerscheider numberseparator
- nummernseperator oddelovaccisla
- separatorenumero separatornumar
- separateurnumbero
- object: object object
- objekt objekt
- oggetto obiect
- objet
- offset: offset offset
- offset offset
- offset offset
- offset
- bottom: onder bottom
- unten spodek
- fondo jos
- inf
- bottomdistance: onderafstand bottomdistance
- abstandunten vzdalenostspodku
- distanzafondo distantajos
- distanceinf
- bottomframe: onderkader bottomframe
- untenrahmen ramecekdole
- cornicefondo framejos
- cadreinf
- bottomoffset: onderoffset bottomoffset
- untenoffset offsetspodku
- offsetfondo offsetjos
- decalageinf
- bottomstate: onderstatus bottomstate
- untenstatus statusspodku
- statofondo starejos
- etatinf
- oddmargin: onevenmarge oddmargin
- ungeraderand lichyokraj
- marginedispari margineimpara
- margepaire
- at: op at
- bei u
- ad la
- a
- option: optie option
- option volba
- opzione optiune
- option
- page: pagina page
- seite stranka
- pagina pagina
- page
- pagecommand: paginacommando pagecommand
- seitenbefehl strankovyprikaz
- comandopagina comandapagina
- commandepage
- pagecolor: paginakleur pagecolor
- seitenfarbe barvastranky
- colorepagina culoarepagina
- couleurpage
- pagestyle: paginaletter pagestyle
- seitenstil stylstranky
- stilepagina stilpagina
- stylepage
- pagenumber: paginanummer pagenumber
- seitennummer cislostranky
- numeropagina numarpagina
- numeropage
- headnumber: kopnummer headnumber
- kopfnummer cislonadpisu
- numerotesta numartitlu
- numerotete
- pageboundaries: paginaovergangen pageboundaries
- seitenbegrenzung hranicestranky
- limitipagina marginipagina
- limitespage
- pagestate: paginastatus pagestate
- pagestate pagestate
- statopagina pagestate
- etatpage
- palet: palet palet
- palette paleta
- tavolozza paleta
- palette
- paper: papier paper
- papier papir
- carta hartie
- papier
- location: plaats location
- platz misto
- luogo locatie
- emplacement
- placestopper: plaatsafsluiter placestopper
- setzetrenner predelmista
- mettistopper punestopper
- emplacementstopper
- place: plaatsen place
- platziere umistit
- metti pune
- place
- placehead: plaatskop placehead
- setzekopf umistihlavicku
- mettitesta punetitlu
- placetete
- position: positie position
- position position
- posizione pozitie
- position % TB TH
- prefix: prefix prefix
- prefix prefix
- prefisso prefix
- prefixe
- preset: preset preset
- voreinstellung prednastaveni
- preimpostato preset
- prereglage
- preview: preview preview
- vorschau nahled
- anteprima previzualizare
- previsualisation
- process: proces process
- process process
- process process
- process
- spot: spot spot
- spot spot
- spot spot
- spot
- dot: punt dot
- punkt tecka
- punto punct
- point
- arrow: pijl arrow
- pfeil sipka
- freccia sageata
- fleche
- edge: rand edge
- kante hrana
- bordo bordura
- bord
- edgedistance: randafstand edgedistance
- kantenabstand vzdalenosthrany
- distanzabordo distantabordura
- distancebord
- screen: raster screen
- raster rastr
- schermo ecran
- ecran
- rightwidth: rechterbreedte rightwidth
- rechterbreite sirkavpravo
- ampiezzadestra marginedreapta
- largeurdroite
- rightframe: rechterkader rightframe
- rechterrahmen ramecekvpravo
- cornicedestra framedreapta
- cadredroit
- rightcolor: rechterkleur rightcolor
- rechterfarbe barvavpravo
- coloredestra culoaredreapta
- couleurdroite
- rightstyle: rechterletter rightstyle
- rechterstil stylvpravo
- stiledestra stildreapta
- styledroit
- rightmargin: rechtermarge rightmargin
- rechterrand pravyokraj
- marginedestro marginedreapta
- margedroite
- rightmargindistance: rechtermargeafstand rightmargindistance
- rechterrandabstand vzdalenostpravehookraje
- distanzamarginedestro distantamarginedreapta
- distancemargedroite
- rightoffset: rechteroffset rightoffset
- rechterabstand pravyoffset
- offsetdestro offsetdreapta
- rightoffset
- rightedge: rechterrand rightedge
- rechtekante pravahrana
- bordodestro borduradreapta
- borddroit
- rightedgedistance: rechterrandafstand rightedgedistance
- rechterkantenabstand vzdalenostpravehrany
- distanzabordodestro distantacoltdreapta
- distanceborddroit
- righttext: rechtertekst righttext
- rechtertext textvpravo
- testodestro textdreapta
- textedroit
- right: rechts right
- rechts vpravo
- destra dreapta
- droite
- nright: nrechts nright
- nrechts nvpravo
- ndestra ndreapta
- ndroite
- reduction: reductie reduction
- reduktion redukce
- riduzione reducere
- reduction
- referencing: refereren referencing
- referieren odkazujici
- referencing referinta
- referencing
- line: regel line
- zeile radek
- riga linie
- ligne
- linecorrection: regelcorrectie linecorrection
- zeilekorrektur korekceradku
- correzioneriga corectielinie
- correctionligne
- lines: regels lines
- zeilen radky
- righe linii
- lignes
- stretch: rek stretch
- strecken natahnout
- dilata dilatat
- etire
- resolution: resolutie resolution
- aufloesung rozliseni
- risoluzione rezolutie
- resolution
- rotation: rotatie rotation
- rotation rotace
- rotazione rotatie
- rotation
- orientation: orientatie orientation
- orientation orientation
- orientation orientation
- orientation
- horoffset: rugoffset horoffset
- rumpfabstand horoffset
- horoffset offsetoriz
- horoffset
- backspace: rugwit backspace
- rumpfspatium zpetnamezera
- backspace spatiuspate
- retour
- direction: richting direction
- richtung smer
- direzione directie
- direction
- scale: schaal scale
- format meritko
- scala scala
- echelle
- separator: scheider separator
- seperator oddelovac
- separatore separator
- separateur
- display: scherm display
- bildschirm obrazovka
- display display
- affichage
- scope: scope scope
- bereich rozsah
- scope scop
- scope
- % beware: section is already used for 'paragraph'
- section: sectie section
- abschnitt oddil
- sezione sectiune
- section
- sectionnumber: sectienummer sectionnumber
- abschnittsnummer cislooddilu
- numerosezione numarsectiune
- numerosection
- setups: setups setups
- setups setups
- setups setups
- reglages
- cutspace: snijwit cutspace
- cutspace cutspace
- cutspace cutspace
- cutspace
- family: soort family
- familie rodina
- famiglia familie
- famille
- space: spatie space
- spatium mezera
- spazio spatiu
- espace
- spacing: spatiering spacing
- spatiumausgleich mezerovani
- spaziatura spatiere
- espacement
- split: splitsen split
- split split
- separa split
- split
- splitoffset: splitsoffset splitoffset
- splitoffset splitoffset
- splitoffset splitoffset
- splitoffset
- indentnext: springvolgendein indentnext
- ziehefolgendeein odsadpristi
- rientrasuccessivo aliniaturmator
- indentesuivant
- step: stap step
- schritt krok
- passo pas
- pas
- stack: stapel stack
- stack stack
- stack stack
- stack
- start: start start
- start start
- inizia start
- demarre
- state: status state
- status status
- stato stare
- etat
- stop: stop stop
- stop stop
- termina stop
- stoppe
- radius: straal radius
- radius polomer
- raggio raza
- rayon
- dash: streep dash
- strich pomlcka
- dash dash
- pointille
- sub: sub sub
- unter pod
- sotto sub
- sous
- subtitle: subtitel subtitle
- untertitel podtitulek
- sottotitolo subtitlu
- soustitre
- symbol: symbool symbol
- symbol symbol
- simbolo simbol
- symbole
-
- closesymbol: sluitsymbool closesymbol
- closesymbol closesymbol
- closesymbol closesymbol
- closesymbol
- closecommand: sluitcommando closecommand
- closecommand closecommand
- closecommand closecommand
- closecommand
-
- symbolset: symboolset symbolset
- symbolset sadasymbolu
- setsimboli setsimbol
- jeusymbole
- symcolor: symkleur symcolor
- symfarbe barvasymbolu
- coloresimbolo culoaresimbol
- couleursym
- symstyle: symletter symstyle
- symstil stylsymboly
- stilesimbolo stilsimbol
- stylesym
- synonym: synoniem synonym
- synonym synonymum
- sinonimo sinonim
- synonyme
- synonymcolor: synoniemkleur synonymcolor
- synonymfarbe barvasynonyma
- coloresinonimi culoaresinonim
- couleursynonyme
- synonymstyle: synoniemletter synonymstyle
- synonymstil stylsynonyma
- stilesinonimi stilsinonim
- stylesynonyme
- tab: tab tab
- tab tab
- tab tab
- tab
- sign: teken sign
- zeichen znak
- segno semn
- signe
- text: tekst text
- text text
- testo text
- texte
- listtext: lijsttekst listtext
- listtext listtext
- listtext listtext
- texteliste
- textwidth: tekstbreedte textwidth
- textbreite sirkatextu
- ampiezzatesto latimetext
- largeurtexte
-numberwidth: nummerbreedte numberwidth
- numberwidth numberwidth
- numberwidth numberwidth
- numberwidth
- textcommand: tekstcommando textcommand
- textbefehl textovyprikaz
- comandotesto comandatext
- commandetexte
- textsize: tekstformaat textsize
- textgroesse velikosttextu
- dimensionetesto dimensiunetext
- tailletexte
- textcolor: tekstkleur textcolor
- textfarbe barvatextu
- coloretesto culoaretext
- couleurtexte
- textstyle: tekstletter textstyle
- textstil styltextu
- stiletesto stiltext
- styletexte
- textseparator: tekstscheider textseparator
- textseparator oddelovactextu
- separatoretesto separatortext
- separateurtexte
- textstate: tekststatus textstate
- textstatus statustextu
- statotesto staretext
- etattexte
- title: titel title
- titel titul
- titolo titlu
- titre
- titlestyle: titelletter titlestyle
- titelstil styltitulek
- stiletitolo stiltitlu
- styletitre
- titlecolor: titelkleur titlecolor
- titelfarbe barvatitulek
- coloretitolo culoaretitlu
- couleurtitre
- titledistance: titelafstand titledistance
- titelabstand vzdalenosttitulek
- distanzatitolo distantatitlu
- distancetitre
-
- titleleft: titellinks titleleft % new
- titleleft titleleft
- titleleft titleleft
- titleleft
- titleright: titelrechts titleright % new
- titleright titleright
- titleright titleright
- titleright
- titlecommand: titelcommando titlecommand % new
- titlecommand titlecommand
- titlecommand titlecommand
- titlecommand
-
- aligntitle: titeluitlijnen aligntitle
- titelausrichten zarovnejtitul
- allineatitolo alinieretitlu
- alignementtitre
- tolerance: tolerantie tolerance
- toleranz tolerance
- tolleranza toleranta
- tolerance
- inbetween: tussen inbetween
- zwischen mezi
- tra intre
- entre
- type: type type
- typ typ
- type type
- type
- align: uitlijnen align
- ausrichtung zarovnani
- allinea aliniere
- alignement
- symalign: symuitlijnen symalign
- symausrichtung symzarovnani
- symallinea symaliniere
- symalignement
- urlspace: urlspatie urlspace
- urlspatium prostorurl
- spaziourl spatiuurl
- espaceurl
- urlalternative: urlvariant urlalternative
- urlalternative urlalternativa
- alternativaurl urlalternativ
- alternativeurl
- from: van from
- von z
- da dela
- de
- alternative: variant alternative
- alternative alternativa
- alternativa alternativ
- alternative
- increment: verhoog increment
- erhoehen zvysit
- incremento increment
- incremente
- incrementnumber: verhoognummer incrementnumber
- nummererhoehen zvysujicicislo
- incrementanumero numarincrement
- incrementenumero
- resetnumber: resetnummer resetnumber
- resetnumber resetnumber
- resetnumber resetnumber
- raznumero
- reference: verwijzing reference
- referenz odkaz
- riferimento referinta
- reference
- unknownreference: onbekendeverwijzing unknownreference
- unbekantereferenz neznamyodkaz
- riferimentoingoto referintanecunoscuta
- referenceinconnue
- footer: voet footer
- fusszeile upati
- piedipagina subsol
- pdp
- footerdistance: voetafstand footerdistance
- fusszeilenabstand vzdalenostupati
- distanzapdp distantasubsol
- dsitancepdp
- footerstate: voetstatus footerstate
- fusszeilenstatus statusupati
- statopdp staresubsol
- etatpdp
- voffset: voffset voffset
- voffset voffset
- voffset voffset
- voffset
- next: volgende next
- folgende dalsi
- successivo urmatorul
- suivant
- before: voor before
- vor pred
- prima inainte
- avant
- commandbefore: voorcommando commandbefore
- vorbefehl predchoziprikaz
- comandoprima comandainainte
- commandeavant
- previous: vorige previous
- vorige predchozi
- precedente precendent
- precedent
- previousnumber: vorigenummer previousnumber
- vorigenummer predchozicislo
- numeroprecedente numarprecedent
- numeroprecedent
- delay: wachttijd delay
- wartezeit prodleva
- attesa intarziere
- delai
- way: wijze way
- art zpusob
- modo mod
- mode
- random: willekeur random
- zufaellig nahodne
- casuale aleator
- aleatoire
- white: wit white
- weiss bily
- bianco alb
- blanc
- xfactor: xfactor xfactor
- xfaktor xfaktor
- xfactor xfactor
- xfactor
- xmax: xmax xmax
- xmax xmax
- xmax xmax
- xmax
- xoffset: xoffset xoffset
- xoffset xoffset
- xoffset xoffset
- xoffset
- xscale: xschaal xscale
- xformat xmeritko
- xscale xscala
- xscale
- xstep: xstap xstep
- xschritt xkrok
- xstep xstep
- xstep
- yfactor: yfactor yfactor
- yfaktor yfaktor
- yfactor yfactor
- yfactor
- ymax: ymax ymax
- ymax ymax
- ymax ymax
- ymax
- yoffset: yoffset yoffset
- yoffset yoffset
- yoffset yoffset
- yoffset
- yscale: yschaal yscale
- yformat ymeritko
- yscale yscala
- yscale
- ystep: ystap ystep
- yschritt ykrok
- ystep ystep
- ystep
- samepage: zelfdepagina samepage
- selbeseite stejnastranka
- stessapagina aceeasipagina
- memepage
-% new
-itemalign: itemuitlijnen itemalign
- itemalign itemalign
- itemalign itemalign
- itemalign
- sidealign: zijuitlijnen sidealign
- sidealign sidealign
- sidealign sidealign
- sidealign
- side: zij side
- objektabstand pocitat
- lato parte
- cote
- fieldlayer: veldlaag fieldlayer
- fieldlayer fieldlayer
- fieldlayer fieldlayer
- calquechamp
- textlayer: tekstlaag textlayer
- textlayer textlayer
- textlayer textlayer
- calquetexte
- fieldbackgroundcolor: veldachtergrondkleur fieldbackgroundcolor
- feldhintergrundfarbe barvapozadipole
- coloresfondocampo culoarefundalcamp
- couleurarrierreplanchamp
- fieldframecolor: veldkaderkleur fieldframecolor
- feldrahmenfarbe barvarameckupole
- colorecornicecampo culoareframecamp
- couleurcadrechamp
- fieldoffset: veldoffset fieldoffset
- feldoffset offsetpole
- offsetcampo offsetcamp
- offsetchamp
- action: actie action
- aktion akce
- azione actiune
- action
- openaction: openactie openaction
- oeffenaktion otevriakci
- azioneapri actiunedeschidere
- actionouverture
- closeaction: sluitactie closeaction
- schliessenaktion zavriakci
- azionechiudi actiuneinchidere
- actionfermeture
- openpageaction: openpaginaactie openpageaction
- openpageaction akceotevrenistranky
- azioneapripagina actiunedeschiderepagina
- actionouverturepage
- closepageaction: sluitpaginaactie closepageaction
- closepageaction akcezavrenistranky
- azionechiudipagina actiuneinchiderepagina
- actionfermeturepage
- clickin: klikin clickin
- klickin klikuvnitr
- clickdentro clickintru
- clicinterieur
- clickout: klikuit clickout
- klickaus klikvne
- clickfuori clickies
- clicexterieur
- regionin: gebiedin regionin
- regionin oblastuvnitr
- entraregione regiuneintrare
- entreregion
- regionout: gebieduit regionout
- regionaus oblastvne
- esciregione regiuneiesire
- regionexterieure
- focusin: focusin focusin
- focusin focusin
- focusin focusin
- focusin
- focusout: focusuit focusout
- focusout focusout
- focusout focusout
- focusout
- afterkey: natoets afterkey
- nachtaste klavesapo
- dopotasto dupatasta
- aprescle
- format: formatteer format
- formatieren formatovat
- format format
- formatter
- validate: valideer validate
- validieren validovat
- verifica verifica
- valider
- calculate: bereken calculate
- berechnen pocitat
- calcola calculeaza
- calculer
- click: klik click
- klick klik
- click click
- clic
- vcommand: vcommando vcommand
- vbefehl vprikaz
- vcomando comandav
- vcommande
- icommand: icommando icommand
- ibefehl iprikaz
- icomando comandai
- icommande
- ccommand: ccommando ccommand
- cbefehl cprikaz
- ccomando comandac
- ccommande
- textdistance: tekstafstand textdistance
- textdistance textdistance
- distanzatesto textdistance
- distancetexte
- numberdistance: nummerafstand numberdistance
- numberdistance numberdistance
- numberdistance numberdistance
- numberdistance
- textmargin: tekstmarge textmargin
- textmargin textmargin
- textmargin textmargin
- margetexte
- keyword: trefwoord keyword
- keyword keyword
- parolachiave keyword
- motcle
-
- deeptextcommand: dieptekstcommando deeptextcommand
- deeptextcommand deeptextcommand
- deeptextcommand deeptextcommand
- deeptextcommand
- deepnumbercommand: diepnummercommando deepnumbercommand
- deepnumbercommand deepnumbercommand
- deepnumbercommand deepnumbercommand
- deepnumbercommand
-
-\stopconstants
-
-%D This one is a private one, used for very dirty hooks.
-
-\startconstants dutch english
- german czech
- italian romanian
- french
-
- extras: extras extras
- extras extras
- extras extras
- extras
-
-\stopconstants
-
-%D \stopcompressdefinitions
-
-%D The keywords of values are very language specific and
-%D therefore variables for the systems. This list shows some
-%D overlap with the previous one.
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- on: aan on
- an zap
- attivo on
- actif
- test: test test
- test test
- test test
- test
- serried: aanelkaar serried
- kleinerabstand semknuto
- vicino serried
- serried
- joinedup: aansluitend joinedup
- keinabstand spojeno
- unito unit
- joinedup
- absolute: absoluut absolute
- absolut absolutni
- assoluto absolut
- absolute
- background: achtergrond background
- hintergrund pozadi
- sfondo fundal
- arriereplan
- backward: achteruit backward
- rueckwaerts zpet
- indietro inapoi
- retourarriere
- subbackward: subachteruit subbackward
- unterrueckwaerts podzpet
- sottoindietro subinapoi
- sousretourarriere
- action: actie action
- aktion akce
- azione actiune
- action
- stopper: afsluiter stopper
- trenner predel
- stopper stopper
- stopper
- paragraph: alinea paragraph
- absatz odstavec
- capoverso paragraf
- paragraphe
- all: alles all
- alles vse
- tutti tot
- tout
- always: altijd always
- immer vzdy
- sempre totdeauna
- toujours
- auto: auto auto
- auto auto
- auto auto
- auto
- autointro: autointro autointro
- autointro autouvod
- autointro autointro
- autointro
- both: beide both
- beide obe
- entrambi ambele
- lesdeux
- inner: binnen inner
- innen uvnitr
- interno intern
- interieur
- blank: blanko blank
- blanko prazdny
- rigovuoto blank
- vide
- disable: blokkeer disable
- sperren zablokovat
- disattiva dezactivat
- desactiver
- top: boven top
- oben vrsek
- cima sus
- sup
- wide: breed wide
- breit siroce
- ampio larg
- ample
- width: breedte width
- breite sirka
- ampiezza latime
- largeur
- minwidth: minbreedte minwidth
- minbreite minsirka
- ampiezzamin latimeminima
- largeurmin
- outer: buiten outer
- aussen vnejsi
- esterno extern
- exterieur
- numbers: cijfers numbers
- ziffern cisla
- numeri numere
- numeros
- Numbers: Cijfers Numbers
- Ziffern Cisla
- Numeri Numere
- Numeros
- command: commando command
- befehl prikaz
- comando comanda
- commande
- commands: commandos commands
- befehle prikazy
- comandi comenzi
- commandes
- concept: concept concept
- konzept koncept
- concetto concept
- concept
- day: dag day
- tag den
- giorno zi
- jour
- date: datum date
- datum datum
- data data
- date
- default: default default
- default implicitni
- implicito implicit
- defaut
- final: definitief final
- endfassung finalni
- finale final
- final
- float: blok float
- gleitobjekt plvouciobjekt
- oggettomobile obiectmobil
- flottant
- depth: diepte depth
- tiefe podlehloubky
- profondita adancime
- profondeur
- doublesided: dubbelzijdig doublesided
- doppelseitig dvoustranny
- doppiafaccia douafete
- rectoverso
- first: eerste first
- erste prvni
- primo primul
- premier
- each: elk each
- jede kazdy
- ogni fiecare
- chaque
- singlesided: enkelzijdig singlesided
- einzelseitig jednostranne
- facciasingola ofata
- recto
- somewhere: ergens somewhere
- irgendwo nekde
- daqualcheparte undeva
- qqpart
- nowhere: nergens nowhere
- nirgens nikde
- danessunaparte niciunde
- nulpart
- even: even even
- gerade sude
- pari par
- paire
- external: extern external
- extern externi
- esterno extern
- external
- file: file file
- datei soubor
- file fisier
- fichier
- flexible: flexibel flexible
- flexibel prizpusobive
- flessibile flexibil
- flexible
- force: forceer force
- zwinge sila
- forza fortat
- force
- used: gebruikt used
- verwende uzito
- usato folosit
- used
- none: geen none
- kein zadny
- nessuno niciunul
- rien
- nomarking: geenmarkering nomarking
- keinebeschriftung zadneznaceni
- nomarcature faramarcare
- sansmarquage
- nonumber: geennummer nonumber
- nonumber nonumber
- nonumber nonumber
- sansnumero
-% geentekst: geentekst notext
-% notext notext
-% notext notext
- nowhite: geenwit nowhite
- keinweiss zadnabila
- nobianco faraalb
- sansblanc
- rotated: geroteerd rotated
- gedreht otoceno
- ruotato rotat
- tourne
- mirrored: gespiegeld mirrored
- gespiegelt zrcadleno
- riflesso oglindit
- reflete
- global: globaal global
- global globalne
- globale global
- global
- grid: grid grid
- gritter mrizka
- griglia grila
- grille
- nogrid: geengrid nogrid
- nogrid nogrid
- nogrid nogrid
- nogrid
- big: groot big
- gross velke
- grande mare
- grand
- bigbodyfont: grootkorps bigbodyfont
- bigbodyfont bigbodyfont
- grossofontdeltesto bigbodyfont
- grandepolicecorp
- bigpreference: grotevoorkeur bigpreference
- grosszuegig vysokapriorita
- grandepreferenza preferintamare
- grandepreference
- gray: grijs gray
- grau seda
- grigio gri
- gris
- halfline: halveregel halfline
- halbezeile pulradku
- mezzariga jumatatelinie
- demiligne
- keep: handhaaf keep
- behalte drzet
- mantieni mentine
- maintient
- hanging: hangend hanging
- haengend visici
- sospeso suspendat
- suspend
- spacing: spatiering spacing
- spatiumausgleich mezerovani
- spaziatura spatiere
- espacement
- nospacing: geenspatiering nospacing
- nospacing nospacing
- nospacing nospacing
- sansespacement
- repeat: herhaal repeat
- wiederholen opakovat
- ripeti repetat
- repete
- fix: herstel fix
- stellewiederher fixuj
- fisso fix
- fixe
- here: hier here
- hier zde
- qui aici
- ici
- header: hoofd header
- kopfzeile zahlavi
- intestazione antet
- entete
- high: hoog high
- hoch vysoko
- alto inalt
- haut
- height: hoogte height
- hoehe vyska
- altezza inaltime
- hauteur
- minheight: minhoogte minheight
- minhoehe minvyska
- altezzamin inaltimeminima
- hauteurmin
- horizontal: horizontaal horizontal
- horizontal horizontalne
- orizzontale orizontal
- horizontale
- current: huidige current
- aktuell aktualni
- corrente curent
- courant
- hz: hz hz
- hz hz
- hz hz
- hz
- nohz: geenhz nohz
- nohz nohz
- nohz nohz
- nohz
- italic: italic italic
- italic kurziva
- corsivo italic
- italique
- inherit: erf inherit
- inherit inherit
- inherit inherit
- herite
- inleft: inlinker inleft
- imlinken vlevo
- insinistra instanga
- dansgauche
- inmargin: inmarge inmargin
- imrand naokraji
- inmargine inmargine
- dansmarge
- inright: inrechter inright
- imrechten vpravo
- indestra indreapta
- dansdroit
- interaction: interactie interaction
- interaktion interakce
- interazione interactiune
- interaction
- intext: intekst intext
- imtext dotextu
- intesto intext
- danstexte
- intro: intro intro
- intro uvod
- intro intro
- intro
- its: its its
- its pol
- its propriu
- its
- yes: ja yes
- ja ano
- si da
- oui
- year: jaar year
- jahr rok
- anno an
- annee
- frame: kader frame
- rahmen ramecek
- cornice incadrat
- cadre
- marginedge: kantlijn marginedge
- marginalkante textovahrana
- bordomargine marginebordura
- bordmarge
- cap: kap cap
- kap kap
- cap cap
- cap
- capital: kapitaal capital
- versalien kapitalky
- maiuscolo majuscula
- capitale
- referral: kenmerk referral
- merkmal znacka
- referral referinta
- referral
- small: klein small
- klein male
- piccolo mic
- petit
- smallnormal: kleinnormaal smallnormal
- kleinnormal malenormalni
- piccolonormale micnormal
- normalpetit
- smallslanted: kleinschuin smallslanted
- kleingeneigt malesklonene
- piccoloinclinato micinclinat
- inclinepetit
- smallslantedbold: kleinschuinvet smallslantedbold
- kleingeneigtfett malesklonenetucne
- piccoloinclinatograssetto micinclinataldin
- grasinclinepetit
- smallitalic: kleinitalic smallitalic
- kleinitalic malekurzivni
- piccolocorsivo micitalic
- italiquepetit
- smallitalicbold: kleinitalicvet smallitalicbold
- kleinitalicfett malekurzivnitucne
- piccolocorsivograssetto micitalicaldin
- grasitaliquepetit
- smalltype: kleintype smalltype
- kleintippen maletype
- piccolotype mictype
- petittype
- smallbold: kleinvet smallbold
- kleinfett maletucne
- piccolograssetto micaldin
- graspetit
- smallboldslanted: kleinvetschuin smallboldslanted
- kleinfettgeneigt maletucnesklonene
- piccolograssettoinclinato micaldininclinat
- inclinegraspetit
- smallbolditalic: kleinvetitalic smallbolditalic
- kleinfettitalic maletucnekurzivni
- piccolograssettocorsivo micaldininclinat
- italiquegraspetit
- smallbodyfont: kleinkorps smallbodyfont
- smallbodyfont smallbodyfont
- piccolofontdelcorpo smallbodyfont
- petitepolicecorps
- split: splitsen split
- split split
- separa split
- split
- toggle: toggle wissel
- toggle toggle
- toggle toggle
- toggle
- color: kleur color
- farbe barevne
- colore culoare
- couleur
- column: kolom column
- column column
- colonna coloana
- colonne
- columns: kolommen columns
- spalten sloupce
- colonne coloane
- colonnes
- head: kop head
- kopf hlavicka
- testa antet
- tete
- low: laag low
- tief nizko
- basso jos
- bas
- last: laatste last
- letzte posledni
- ultimo ultim
- dernier
- label: label label
- label popisek
- etichetta eticheta
- etiquette
- lohi: laho lohi
- hoti nivy
- pedap lohi
- baha
- tall: lang tall
- lang vysoko
- alto inalt
- long
- empty: leeg empty
- leer prazdne
- vuoto gol
- vide
- Character: Letter Character
- Buchstabe Pismeno
- Lettera Caracter
- Caratere
- character: letter character
- buchstabe pismeno
- lettera caracter
- caractere
- Characters: Letters Characters
- Buchstaben Pismena
- Lettere Caractere
- Caracteres
- characters: letters characters
- buchstaben pismena
- lettere caractere
- caracteres
- landscape: liggend landscape
- querformat nasirku
- orizzontale vedere
- paysage
- rule: lijn rule
- linie linka
- linea rigla
- regle
- list: lijst list
- liste seznam
- elenco lista
- liste
- leftmargin: linkermarge leftmargin
- linkerrand levyokraj
- marginesinistro marginestanga
- margegauche
- leftpage: linkerpagina leftpage
- linkerseite levastranka
- paginasinistra paginastanga
- pagegauche
- leftedge: linkerrand leftedge
- linkekante levahrana
- bordosinistro bordurastanga
- bordgauche
- left: links left
- links vlevo
- sinistra stanga
- gauche
- local: lokaal local
- lokal lokalne
- locale local
- local
- new: nieuw new
- neu novy
- nuovo nou
- nouveau
- old: oud old
- old old
- old old
- old
- MONTH: MAAND MONTH
- MONAT MESIC
- MESE LUNA
- MOIS
- month: maand month
- monat mesic
- mese luna
- mois
- mar: mar mar
- mar mar
- mar mar
- mar
- item: som item
- pos polozka
- elemento element
- element
- marking: markering marking
- beschriftung znaceni
- marcatura marcaje
- marquage
- margin: marge margin
- marginalie marginalie
- margine margine
- marge
- max: max max
- max max
- max max
- max
- min: min min
- min min
- min min
- min
- mediaeval: mediaeval mediaeval
- mittelalterlich stredoveky
- medievale medieval
- medieval
- medium: middel medium
- mittel stredni
- medio mediu
- moyen
- middle: midden middle
- mittig nastred
- centro centru
- milieu
- after: na after
- nach po
- dopo dupa
- apres
- name: naam name
- name jmeno
- nome nume
- nom
- opposite: naast opposite
- gegenueber naproti
- opposto opus
- opposition
- no: nee no
- nein ne
- no nu
- non
- negative: negatief negative
- negativ negativ
- negativo negativ
- negatif
- positive: positief positive
- positiv positiv
- positivo positiv
- positif
- not: niet not
- nicht ne
- non nu
- pas
- never: nooit never
- nie nikdy
- mai niciodata
- jamais
- normal: normaal normal
- normal normalni
- normale normal
- normal
- number: nummer number
- nummer cislo
- numero numar
- numero
- offset: offset offset
- offset offset
- offset offset
- offset
- unknown: onbekend unknown
- unbekannt neznamy
- ignoto necunoscut
- inconnu
- bottom: onder bottom
- unten spodek
- fondo subsol
- inf
- odd: oneven odd
- ungerade liche
- dispari impar
- impair
- packed: opelkaar packed
- gepackt zhustene
- impaccato impachetat
- groupe
- unpacked: vanelkaar unpacked
- ungepackt rozbalene
- unpacked despachetat
- degroupe
- makeup: opmaak makeup
- umbruch zlom
- makeup marcaj
- makeup
- atmargin: opmarge atmargin
- amrand naokraji
- almargine lamargine
- alamarge
- overlay: overlay overlay
- overlay prekryv
- sovrapponi overlay
- revetement
- page: pagina page
- seite stranka
- pagina pagina
- page
- pagenumber: paginanummer pagenumber
- seitennummer cislostranky
- numeropagina numarpagina
- numeropage
- paper: papier paper
- papier papir
- carta foaie
- papier
- display: scherm display
- bildschirm obrazovka
- schermo display
- affichage
- reverse: omgekeerd reverse
- reverse reverse
- invertito reverse
- inverse
- fit: passend fit
- passend prizpusobive
- adatta ajustat
- adapte
-nofit: nietpassend nofit
- nofit nofit
- nofit nofit
- nofit
- postscript: postscript postscript
- postscript postscript
- postscript postscript
- postscript
- preview: preview preview
- vorschau nahled
- anteprima previzualizare
- previsualisation
- program: programma program
- programm program
- programma program
- programme
- process: proces process
- process process
- process process
- process
- spot: spot spot
- spot spot
- spot spot
- spot
- dot: punt dot
- punkt tecka
- punto punct
- point
- ran: ran ran
- ran rozsah
- corse rulat
- cours
- edge: rand edge
- kante hrana
- bordo bordura
- bord
- screen: raster screen
- raster rastr
- schermo ecran
- ecran
- rectangular: recht rectangular
- rechteckig pravouhly
- rettangolare rectangular
- rectangulaire
- rightmargin: rechtermarge rightmargin
- rechterrand pravyokraj
- marginedestro marginedreapta
- margedroite
- rightpage: rechterpagina rightpage
- rechterseite pravastranka
- paginadestra paginadreapta
- pagedroite
- rightedge: rechterrand rightedge
- rechterkante pravahrana
- bordodestro borduradreapta
- borddroit
- right: rechts right
- rechts vpravo
- destra dreapta
- droite
- line: regel line
- zeile radek
- riga linie
- ligne
- hang: hang hang
- haengend zaveseni
- sospendi suspenda
- suspend
- register: register register
- register rejstrik
- registro registru
- registre
- relative: relatief relative
- relativ relativni
- relativo relativ
- relatif
- reset: reset reset
- zuruecksetzten reset
- reimposta reset
- raz
- Romannumerals: Romeins Romannumerals
- Roemischezahlen Rimskecislice
- Numeriromani Numereromane
- Chiffresromains
- romannumerals: romeins romannumerals
- roemischezahlen rimskecislice
- numeriromani numereromane
- chiffresromains
- greek: grieks greek
- griechisch recky
- greco grec
- grec
- Greek: Grieks Greek
- Griechisch Recky
- Greco Grec
- Grec
- round: rond round
- rund zaobleny
- rotondo rotund
- rond
- rotate: roteer rotate
- drehe otoc
- ruota rotit
- oriente
- stretch: rek stretch
- strecken natahnout
- dilata dilatat
- etire
- backspace: rugwit backspace
- rumpfspatium zpetnamezera
- backspace spatiuspate
- retourarriere
- broad: ruim broad
- breit siroky
- ampio broad
- large
- row: rij row
- row row
- row rand
- rang
- samepage: zelfdepagina samepage
- selbeseite stejnastranka
- stessapagina aceeasipagina
- memepage
- slanted: schuin slanted
- geneigt sklonene
- inclinato inclinat
- incline
- slantedbold: schuinvet slantedbold
- geneigtfett sklonenetucne
- inclinatograssetto inclinataldin
- grasincline
- synchronize: synchroniseer synchronize
- synchronize synchronize
- synchronize synchronize
- synchronize
- italicbold: italicvet italicbold
- italicfett kurzivnitucne
- corsivograssetto italicaldin
- grasitalique
- sectionnumber: sectienummer sectionnumber
- abschnittsnummer cislooddilu
- numerosezione numarsetiune
- numerosection
- narrow: smal narrow
- schmall uzky
- stretto ingust
- etroit
- cutspace: snijwit cutspace
- cutspace cutspace
- cutspace cutspace
- cutspace
- tolerant: soepel tolerant
- tolerant tolerantni
- tollerante tolerant
- tolerant
- space: spatie space
- spatium mezera
- spazio spatiu
- espace
- standard: standaard standard
- standard standardni
- standard standard
- standard
- start: start start
- start start
- inizia start
- demarre
- stop: stop stop
- stop stop
- termina stop
- stoppe
- strict: streng strict
- streng striktni
- rigido strict
- strict
- strut: strut strut
- strut strut
- strut strut
- strut
- sub: sub sub
- unter pod
- sotto sub
- sous
- sym: sym sym
- sym sym
- sim sym
- sym
- txt: txt txt
- txt txt
- txt txt
- txt
- symbol: symbool symbol
- symbol symbol
- simbolo simbol
- symbole
- text: tekst text
- text text
- testo text
- texte
- back: terug back
- zurueck zpet
- dietro inapot
- retour
- test: test test
- test test
- test test
- test
- inbetween: tussen inbetween
- zwischen mezi
- tra intre
- entre
- type: type type
- tippen type
- type type
- type
- off: uit off
- aus vyp
- disattivo dezactivat
- desactive
- url: url url
- url url
- url url
- url
- URL: URL URL
- URL URL
- URL URL
- URL
- fixed: vast fixed
- fest fixne
- fisso fixat
- fixe
- loose: los loose
- lose uvolnene
- lento larg
- perte
- continue: verder continue
- fortsetzten pokracovat
- continua continuu
- continue
- vertical: vertikaal vertical
- vertikal vertikalne
- verticale vertical
- verticale
- bold: vet bold
- fett tucne
- grassetto aldin
- gras
- sansbold: sansvet sansbold
- sansfett sanstucne
- sansgrassetto sansaldin
- sansgras
- boldslanted: vetschuin boldslanted
- fettgeneigt tucnesklonene
- grassettoinclinato aldininclinat
- inclinegras
- bolditalic: vetitalic bolditalic
- fettitalic tucnekurzivni
- grassettocorsivo aldinitalic
- italiquegras
- quadruple: viertal quadruple
- viertel ctyrnasobny
- quadruplo cvadrupul
- quadruple
- footer: voet footer
- fusszeile upati
- piedipagina subsol
- pdp
- next: volgende next
- folgende dalsi
- successivo urmatorul
- prochain
- before: voor before
- vor pred
- prima inainte
- avant
- foreground: voorgrond foreground
- vordergrund popredi
- foreground primplan
- premierplan
- preference: voorkeur preference
- einstellung nastaveni
- preferenza preferinta
- preference
- temporary: voorlopig temporary
- temporaer docasne
- temporaneo temporar
- temporaire
- forward: vooruit forward
- vorwaerts vpred
- avanti avans
- avance
- subforward: subvooruit subforward
- untervorwaerts podvpred
- sottoavanti subavans
- sousavance
- previous: vorige previous
- vorig predchozi
- precedente precedent
- precedent
- value: waarde value
- wert hodnota
- valore valoare
- valeur
- week: week week
- woche tyden
- settimana saptamana
- semaine
- weekday: weekdag weekday
- wochentag vsedniden
- giornosettimana zisaptamana
- joursemaine
- WEEKDAY: WEEKDAG WEEKDAY
- WOCHENTAG VSEDNIDEN
- GIORNOSETTIMANA ZISAPTAMANA
- JOURSEMAINE
- random: willekeurig random
- zufaellig nahodny
- casuale aleator
- aleatoire
- white: wit white
- weiss bily
- bianco alb
- blanc
- very: zeer very
- sehr velmi
- molto foarte
- tres
- verytolerant: zeersoepel verytolerant
- sehrtolerant velmitolerantni
- moltotollerante foartetolerant
- trestolerant
- verystrict: zeerstreng verystrict
- sehrstreng velmistriktni
- moltorigido foartestrict
- tresstrict
- see: zie see
- sieh viz
- vedi vezi
- voit
- smallcaps: smallcaps smallcaps
- smallcaps kapitalky
- maiuscoletto majusculemici
- petitescapitales
- WORD: WOORD WORD
- WORT SLOVO
- PAROLA CUVANT
- MOT
- firstpage: eerstepagina firstpage
- ersteseite prvnistranka
- primapagina primapagina
- premierepage
- firstcolumn: eerstekolom firstcolumn
- firstcolumn firstcolumn
- firstcolumn firstcolumn
- premierecolonne
- previouspage: vorigepagina previouspage
- vorigeseite predchozistranka
- paginaprecedente paginaanterioara
- pageprecedente
- nextpage: volgendepagina nextpage
- folgendeseite dalsistranka
- paginasuccessiva paginaurmatoare
- pagesuivante
- lastpage: laatstepagina lastpage
- letzteseite poslednistrana
- ultimapagina ultimapagina
- dernierepage
- lastcolumn: laatstekolom lastcolumn
- lastcolumn lastcolumn
- lastcolumn lastcolumn
- dernierecolonne
- lastpagenumber: laatstepaginanummer lastpagenumber
- lastpagenumber lastpagenumber
- lastpagenumber lastpagenumber
- derniernumeropage
- subpage: subpagina subpage
- unterseite podstranka
- sottopagina subpagina
- souspage
- firstsubpage: eerstesubpagina firstsubpage
- ersteunterseite prvnipodstranka
- primasottopagina primasubpagina
- premieresouspage
- previoussubpage: vorigesubpagina previoussubpage
- vorigeunterseite predchozipodstranka
- sottopaginaprecedente subpaginaanterioara
- souspageprecedente
- nextsubpage: volgendesubpagina nextsubpage
- folgendeunterseite dalsipodstranka
- sottopaginasuccessiva urmatoareasubpagina
- souspagesuivante
- lastsubpage: laatstesubpagina lastsubpage
- letzteunterseite poslaednipodstranka
- ultimasottopagina ultimasubpagina
- dernieresouspage
- nextevenpage: volgendeevenpagina nextevenpage
- naechstegeradeseite dalsisudastranka
- paginaparisuccessiva paginaparaurmatoarea
- pagepairesuivante
- nextoddpage: volgendeonevenpagina nextoddpage
- naechsteungeradeseite dalsilichastranka
- paginadisparisuccessiva paginaimparaurmatoarea
- pageimpairesuivante
- previousevenpage: vorigeevenpagina previousevenpage
- vorigegeradeseite predchozisudastranka
- paginapariprecedente paginaparaprecedenta
- pagepaireprecedente
- previousoddpage: vorigeonevenpagina previousoddpage
- vorigeungeradeseite predchozilichastranka
- paginadispariprecedente paginaimparaprecedenta
- pageimpaireprecedente
- readonly: alleenleesbaar readonly
- nurlesbar pouzeprocteni
- solalettura readonly
- lectureseule
- required: verplicht required
- obligatorisch pozadovane
- richiestp obligatoriu
- recquis
- protected: beschermd protected
- geschuetzt chranene
- protetto protejat
- protege
- sorted: gesorteerd sorted
- sortiert tridene
- ordinato sortat
- trie
- unavailable: nietbeschikbaar unavailable
- nichtverfuegbar nedostupne
- nondisponibile nedisponibil
- indisponible
- hidden: verborgen hidden
- versteckt skryte
- nascosto ascuns
- cache
- printable: printbaar printable
- druckbar tisknutelne
- stampabile tiparibil
- editable
- bookmark: bookmark bookmark
- bookmark zalozka
- segnalibro semncarte
- marquepage
- nocheck: geencontrole nocheck
- nocheck nocheck
- nocheck nocheck
- nonverifie
- innermargin: binnenmarge innermargin
- innermargin innermargin
- margineinterno innermargin
- margeinterieure
- outermargin: buitenmarge outermargin
- outermargin outermargin
- margineesterno outermargin
- margeexterieure
- inneredge: binnenrand inneredge
- inneredge inneredge
- bordointerno inneredge
- bordinterieur
- outeredge: buitenrand outeredge
- outeredge outeredge
- bordoesterno outeredge
- bordexterieur
- controls: sturing controls
- controls controls
- controlli controale
- controles
- nothanging: niethangend nothanging
- nothanging nothanging
- nonsospeso nothanging
- nonsuspendu
- hyphenated: afgebroken hyphenated
- hyphenate hyphenated
- sillabato despsilabe
- hyphenated
- nothyphenated: nietafgebroken nothyphenated
- nothyphenated nothyphenated
- nonsillabato nedespsilabe
- nothyphenated
- overprint: overprint overprint
- overprint overprint
- overprint overprint
- overprint
- knockout: knockout knockout
- knockout knockout
- knockout knockout
- knockout
- xml: xml xml
- xml xml
- xml xml
- xml
- enumeration: doornummering enumeration
- nummerierung vycet
- enumerazione enumerare
- enumeration
- description: doordefinitie description
- beschreibung popis
- descrizione descriere
- description
-
- lefthanging: linkshangend lefthanging
- lefthanging lefthanging
- lefthanging lefthanging
- lefthanging
- righthanging: rechtshangend righthanging
- righthanging righthanging
- righthanging righthanging
- righthanging
-
- weak: weak zwak
- weak weak
- weak weak
- weak
- strong: strong sterk
- strong strong
- strong strong
- strong
-
-\stopvariables
-
-\startconstants dutch english
- german czech
- italian romanian
- french
-
- controls: sturing controls
- controls controls
- controlli controale
- controles
- global: globaal global
- global globalne
- globale global
- global
- overprint: overprint overprint
- overprint overprint
- overprint overprint
- overprint
-
-\stopconstants
-
-% so far
-
-%D \stopcompressdefinitions
-
-%D Maybe it's better to make the next few variables into
-%D elements as well.
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- conversion: conversie conversion
- konversion konverze
- coversione conversie
- conversion
- by: per by
- pro skrz
- da de
- par
-
-\stopvariables
-
-%D \stopcompressdefinitions
-
-%D The next setup shows the use of the keyword \type{all}.
-%D These constants are the same for all languages.
-
-%D \startcompressdefinitions
-
-\startconstants all
-
- dx: dx
- dy: dy
- nx: nx
- ny: ny
- nr: nr
- nl: nl
- nc: nc
- sx: sx
- sy: sy
- n: n
- vfil: vfil
- hfil: hfil
- strut: strut
- autostrut: autostrut
- reset: reset
- set: set
- escape: escape
- apa: apa
-
-\stopconstants
-
-%D \stopcompressdefinitions
-
-%D We need some font family switching names both as constant
-%D and as variable.
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- calligraphic: calligrafie calligraphic
- kalligraphie kaligraficke
- calligrafico caligrafic
- calligraphique
- handwritten: handschrift handwritten
- handschrift rukopisne
- grafiamanuale scrismanual
- manuscript
- sansserif: schreefloos sansserif
- grotesk bezserifu
- sansserif sansserif
- sansserif
- roman: romaan roman
- antiqua antikva
- roman roman
- roman
- teletype: teletype teletype
- fernschreiber strojopis
- teletype teletype
- teletype
- type: type type
- tippen opis
- type type
- type
- serif: serif serif
- serif serif
- serif serif
- serif
- regular: regular regular
- regular pravidelne
- regolare regular
- regulier
- support: support support
- support podpora
- supporto suport
- support
- sans: sans sans
- sans sans
- sans sans
- sans
- mono: mono mono
- mono mono
- mono mono
- mono
-
-\stopvariables
-
-%D \stopcompressdefinitions
-
-% %D All relevent commands of \CONTEXT\ are specified in a
-% %D structured way that enables the generation of reference
-% %D cards. This specification is setup in a language independant
-% %D way. The next category of variables is only used in this
-% %D context.
-
-% %D \startcompressdefinitions
+% obsolete:
%
-% \startsetupvariables dutch english
+%
+% \startvariables dutch english
% german czech
% italian romanian
% french
%
-% enumeration: doornummering enumeration
-% nummerierung vycet
-% enumerazione enumerare
-% enumeration
-% description: doordefinitie description
-% beschreibung popis
-% descrizione descriere
-% description
-% indentation: doorsprong indentation
-% einzug odsazeni
-% rientro indentare
-% indentation
-% labeling: doorlabel labeling
-% beschriften oznacovani
-% etichettatura etichetare
-% etiquettage
-% combinedlist: samengesteldelijst combinedlist
-% kombiniereliste kombinovanyseznam
-% elencocombinato listacombinata
-% listeimbriquee
-% % beware: section clashes with sectionlevel
-% section: sectie section
-% abschnitt oddil
-% sezione sectiune
-% section
-% register: register register
-% register rejstrik
-% registro registru
-% registre
-% interaction: interactie interaction
-% interaktion interakce
-% interazione interactiune
-% interaction
-% synonym: synoniem synonym
-% synonym synonymum
-% sinonimo sinonim
-% synonyme
-% synonyms: synoniemen synonyms
-% synonyme synonyma
-% sinonimi sinonime
-% synonymes
-% sort: sorteer sort
-% sortiere trid
-% sort sortare
-% tri
-% sorts: sorteren sorts
-% sortieren tridit
-% sorts sortari
-% tris
-% name: naam name
-% name jmeno
-% nome nume
-% name
-% float: blok float
-% gleitobjekt plvouciobjekt
-% oggettomobile obiectmobil
-% flottant
-% floats: blokken floats
-% gleitobjekte plvouciobjekty
-% oggettimobili obiectemobile
-% flottants
-% paragraph: alinea paragraph
-% absatz odstavec
-% capoverso paragraf
-% paragraphe
-% framedtext: kadertekst framedtext
-% umrahmtertext oramovanytext
-% testoincorniciato textinconjurat
-% texteencadre
-% itemgroup: itemgroup itemgroup
-% itemgroup itemgroup
-% itemgroup itemgroup
-% itemgroup
-% typing: typen typing
-% tippen typing
-% typing typing
-% typing
-% buffer: buffer buffer
-% puffer buffer
-% buffer buffer
-% buffer
-% formula: formule formula
-% formel rovnice
-% formula formula
-% formule
-% subformula: subformule subformula
-% unterformel podrovnice
-% sottoformula subformula
-% sousformule
-% tabulate: tabulatie tabulate
-% tabulator tabelator
-% tabulato tabulate
-% tabule
+% one: een one
+% eins jedna
+% uno unu
+% un
+% \stopvariables
%
-% \stopsetupvariables
-
-% %D \stopcompressdefinitions
-
-%D The number of elements used for composing user defined
-%D commands is rather small. We use a \type{-} for empty
-%D elements.
-
-%D \startcompressdefinitions
-
-\startelements dutch english
- german czech
- italian romanian
- french
-
- begin: beginvan begin
- anfang zacatek
- inizio inceput
- debut
- end: eindvan end
- ende konec
- fine sfarsit
- fin
- coupled: gekoppelde coupled
- verknuepft propojene
- accoppiato cuplat
- couple
- get: haal get
- get ziskat
- prendi get
- obtient
- currentlocal: huidigelokale currentlocal
- aktuelllokal aktualnelokalni
- correntelocale localcurent
- localcourant
- endsetup: in -
- ein -
- - -
- -
- load: laad load
- laden nacist
- carica incarca
- charge
- emptyone: leeg empty
- vuoto leer
- prazdne gol
- vide
- emptytwo: lege empty
- leer prazdne
- vuoti gol
- vide
- list: lijst list
- auflisten seznam
- elenco lista
- liste
- listof: lijstmet listof
- auflistenvon seznam
- elencodi listade
- listede
- local: lokale local
- lokal lokalne
- locale local
- local
- place: plaats place
- platziere umisti
- metti pune
- place
- reserve: reserveer reserve
- reservieren rezervovat
- riserva rezervat
- reserver
- start: start start
- start start
- inizia start
- demarre
- setup: stel setup
- stelle nastaveni
- imposta setare
- regle
- stop: stop stop
- stop stop
- termina stop
- stoppe
- increment: verhoog increment
- erhoehen zvysit
- incrementa increment
- incremente
- next: volgende next
- folgende dalsi
- successivo urmatorul
- suivant
- complete: volledige complete
- vollende uplny
- completo complet
- complete
- previous: vorige previous
- vorige predchozi
- precedente precedent
- precedent
- previouslocal: vorigelokale previouslocal
- voriglokal predchozilokalni
- precedentelocale precedentlocal
- localprecedent
- see: zie see
- sieh viz
- vedi vezi
- voit
- type: type type
- type opis
- type type
- type
- makeup: opmaak makeup
- umbruch zlom
- makeup makeup
- makeup
- text: tekst text
- text text
- testo text
- texte
-
-\stopelements
-
-%D These are predefined instances. To be cleaned up.
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- buffer: buffer buffer
- puffer buffer
- buffer buffer
- buffer
- linenote: regelnoot linenote
- linenote linenote
- linenote linenote
- noteligne
- comment: commentaar comment
- kommentar komentar
- commento comentariu
- commentaire
- interactionmenu: interactiemenu interactionmenu
- interaktionsmenue interaktivnimenu
- menuinterattivo meniuinteractiune
- menuinteraction
- postponing: uitstellen postponing
- verschieben odlozit
- posporre postponing
- postponing
- hiding: verbergen hiding
- verbergen skryt
- nascondere ascundere
- cache
- tabulate: tabulatie tabulate
- tabulator tabelator
- tabulato tabulate
- tabule
- tabulatehead: tabulatiekop tabulatehead
- tabulatehead tabulatehead
- testatabulato tabulatehead
- tetetabule
- tabulatetail: tabulatiestaart tabulatetail
- tabulatetail tabulatetail
- codatabulato tabulatetail
- queuetabule
- fact: gegeven fact
- gegeben fakt
- fatto fapt
- fait
- legend: legenda legend
- legende legenda
- legenda legenda
- legende
- formula: formule formula
- formel rovnice
- formula formula
- formule
- tablehead: tabelkop tablehead
- tabellenueberschrift zahlavitabulky
- testatabella antettabel
- tetetableau
- tabletail: tabelstaart tabletail
- tabellenende konectabulky
- codatabella subsoltabel
- queuetableau
- setups: instellingen setups
- impostazioni einstellungen
- nastaveni setari
- reglages
- helptext: helptekst helptext
- hilfetext textnapovedy
- testoaiuto textajutator
- texteaide
- localenvironment: deelomgeving localenvironment
- lokaleumgebung lokalnihoprostredi
- ambientelocale mediulocal
- environementlocal
- sectionblockenvironment: sectieblokomgeving sectionblockenvironment
- sectionblockenvironment sectionblockenvironment
- ambientebloccosezione blocsectiuneambient
- environementblocsection
- pagecomment: paginacommentaar pagecomment
- pagecomment komentarstranky
- commentopagina comentariupagina
- commentairepage
-
-\stopvariables
-
-%D \stopcompressdefinitions
-
-%D The next set of definitions is used when accessing viewer
-%D capabilities. Their foreign nature is reflected by using
-%D Capitals.
-
-%D \startcompressdefinitions
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- FirstPage: EerstePagina FirstPage
- ErsteSeite PrvniStrana
- PrimaPagina PrimaPagina
- PremierePage
- PreviousPage: VorigePagina PreviousPage
- VorigeSeite PredchoziStrana
- PaginaPrecedente PaginaPrecedenta
- PagePrecedente
- NextPage: VolgendePagina NextPage
- FolgendeSeite DalsiStrana
- PaginaSuccessiva PaginaUrmatoare
- PageSuivante
- LastPage: LaatstePagina LastPage
- LetzteSeite PosledniStrana
- UltimaPagina UltimaPagina
- DernierePage
- PreviousJump: VorigeSprong PreviousJump
- VorigerSprung PredchoziSkok
- SaltoPrecedente SaltPrecedent
- SautPrecedent
- NextJump: VolgendeSprong NextJump
- NaechsterSprung NasledujiciSkok
- SaltoSuccessivo SaltUrmator
- SautSuivant
- ToggleViewer: WisselViewer ToggleViewer
- WechseleViewer ZmenitProhlizec
- ScambiaVisualizzatore SchimbaVizualizator
- ChangeVisualisateur
- ExitViewer: VerlaatViewer ExitViewer
- BeendeViewer UkoncitProhlizec
- EsciVisualizzatore IesireVizualizator
- SortVisualisateur
- CloseDocument: SluitDocument CloseDocument
- SchliesseDokument ZavritDokument
- ChiudiDocumento InchideDocument
- FermeDocument
- SaveDocument: BewaarDocument SaveDocument
- SpeichereDokument UlozitDokument
- SalvaDocumento SalvareDocument
- SauvegardeDocument
- SaveNamedDocument: BewaarDocumentOpNaam SaveNamedDocument
- SaveNamedDocument SaveNamedDocument
- SaveNamedDocument SaveNamedDocument
- SauvegardeDocumentNomme
- OpenNamedDocument: OpenDocumentOpNaam OpenNamedDocument
- OpenNamedDocument OpenNamedDocument
- OpenNamedDocument OpenNamedDocument
- OuvreDocumentNomme
- ViewerHelp: ViewerHelp ViewerHelp
- ViewerHilfe NapovedaProhlizece
- AiutoVisualizzatore AjutorVizualizator
- AideVisualisateur
- PrintDocument: PrintDocument PrintDocument
- DruckeDokument VytisknoutDokument
- StampaDocumento TiparesteDocument
- ImprimeDocument
- SearchDocument: DoorzoekDocument SearchDocument
- DokumentDurchsuchen ProhledatDokument
- CercaDocumento CautaDocument
- RechercheDocument
- SearchAgain: HerhaalZoeken SearchAgain
- WeiterSuchen HledatZnovu
- CercaAncora CautaDinNou
- RechercheSuivant
- Query: RaadpleegDocument Query
- Query Query
- Richiesta Query
- Query
- QueryAgain: HerhaalRaadplegen QueryAgain
- QueryAgain QueryAgain
- RinnovaRichiesta QueryAgain
- QueryAgain
- GotoPage: GaNaarPagina GotoPage
- GotoPage JdiNaStranku
- VaiAPagina LaPagina
- VaalaPage
- StartMovie: StartFilm StartMovie
- StartFilm SpustitFilm
- IniziaFilm StartFilm
- DemarreFilm
- StopMovie: StopFilm StopMovie
- StopFilm ZastavitFilm
- FermaFilm StopFilm
- StoppeFilm
- PauseMovie: PauzeerFilm PauseMovie
- PauseFilm PozastavitFilm
- PausaFilm PauzaFilm
- PauseFilm
- ResumeMovie: HervatFilm ResumeMovie
- FortsetzenFilm PokracovatFilm
- RiprendiFilm RepornesteFilm
- ReprendFilm
- StartSound: StartGeluid StartSound
- StartSound StartZvuk
- IniziaSuono StartSunet
- DemarreSon
- StopSound: StopGeluid StopSound
- StopSound StopZvuk
- FermaSuono StopSunet
- StoppeSon
- PauseSound: PauzeerGeluid PauseSound
- PauseSound PozastavitZvuk
- PausaSuono PauzaSunet
- PauseSon
- ResumeSound: HervatGeluid ResumeSound
- ResumeSound PokracovatZvuk
- RiprendiSuono RepornesteSunet
- ReprendSon
- StartRendering: StartRendering StartRendering
- StartRendering StartRendering
- StartRendering StartRendering
- StartRendering
- StopRendering: StopRendering StopRendering
- StopRendering StopRendering
- StopRendering StopRendering
- StopRendering
- PauseRendering: PauzeerRendering PauseRendering
- PauseRendering PauseRendering
- PauseRendering PauseRendering
- PauseRendering
- ResumeRendering: HervatRendering ResumeRendering
- ResumeRendering ResumeRendering
- ResumeRendering ResumeRendering
- ResumeRendering
- SaveForm: BewaarFormulier SaveForm
- SpeicheFormular UlozitFormular
- SalvaForm SalveazaFormular
- SauvegardeForm
- LoadForm: LaadFormulier LoadForm
- LadeFormular NacistFormular
- CaricaForm IncarcaFormular
- ChargeForm
- ResetForm: ResetFormulier ResetForm
- ZuruecksetzenFormular ResetFormulare
- ReimpostaForm ResetareFormular
- RazForm
- SubmitForm: VerzendFormulier SubmitForm
- VersendeFormular PoslatFormular
- MandaForm TrimiteFormular
- SoumettreForm
- HideField: VerbergVeld HideField
- VerbergeFeld SkryjPole
- NascondiCampo AscundeCamp
- CacheChamp
- ShowField: ToonVeld ShowField
- ZeigeFeld UkazPole
- MostraCampo AfiseazaCamp
- MontreChamp
- FitWidth: BreedtePassend FitWidth
- BreitePassend FitWidth
- FitWidth AjustatLatime
- AjusteLargeur
- FitHeight: HoogtePassend FitHeight
- HoehePassend FitHeight
- FitHeight AjustatInaltime
- AjusteHauteur
- HideLayer: VerbergLaag HideLayer
- HideLayer HideLayer
- HideLayer HideLayer
- CacheCalque
- VideLayer: ToonLaag VideLayer
- VideLayer VideLayer
- VideLayer VideLayer
- VideLayer
- ToggleLayer: WisselLaag ToggleLayer
- ToggleLayer ToggleLayer
- ToggleLayer ToggleLayer
- ToggleLayer
-
- ShowThumbs: ShowThumbs ShowThumbs
- ShowThumbs UkazNahledy
- MostraThumbs ShowThumbs
- ShowThumbs
- ShowBookmarks: ShowBookmarks ShowBookmarks
- ShowBookmarks UkazZalozky
- MostraSegnalibro ShowBookmarks
- ShowBookmarks
-
-\stopvariables
-
-%D Here are some symbol names. We capitalize them because they are
-%D viewer specific.
-
-\startvariables dutch english
- german czech
- italian romanian
- french
-
- New: Nieuw New
- Neu Novy
- Nuovo Nou
- Nouveau
- Balloon: Ballon Balloon
- Ballon Bublinka
- Pallone Balon
- Ballon
- Addition: Toevoeging Addition
- Zusatz Pridavek
- Aggiunta Adaugare
- Ajout
- Help: Help Help
- Hilfe Napoveda
- Aiuto Ajutor
- Aide
- Paragraph: Paragraaf Paragraph
- Absatz Odstavec
- Capoverso Paragraf
- Paragraphe
- Key: Sleutel Key
- Schluessel Klavesa
- Tasto Cheie
- Cle
-\stopvariables
-
-%D \stopcompressdefinitions
-
-%D Last we define some constants and variables that are used
-%D in the \PRAGMA\ extensions of \CONTEXT.
-
-%D \startcompressdefinitions
-
-\startconstants all
-
- bet: bet
- dat: dat
- ken: ken
- ref: ref
-
-\stopconstants
-
-\startvariables all
-
- formeel: formeel
- informeel: informeel
- rekening: rekening
- sticker: sticker
- sheet: sheet
- brief: brief
- ls: ls
-
-\stopvariables
-
-\stoplogginginterface
+% \startconstants dutch english
+% german czech
+% italian romanian
+% french
+%
+% sorttype: sortering sorttype
+% sorttype sorttype
+% sorttype sorttype
+% sorttype
+% \stopconstants
+%
+% \startelements dutch english
+% german czech
+% italian romanian
+% french
+%
+% begin: beginvan begin
+% anfang zacatek
+% inizio inceput
+% debut
+% \stopelements
\endinput
diff --git a/tex/context/base/mult-de.tex b/tex/context/base/mult-de.tex
new file mode 100644
index 000000000..b408dad2f
--- /dev/null
+++ b/tex/context/base/mult-de.tex
@@ -0,0 +1,1576 @@
+% this file is auto-generated, don't edit this file
+%
+% definitions for interface variables for language de
+%
+\setinterfacevariable{Addition}{Zusatz}
+\setinterfacevariable{Balloon}{Ballon}
+\setinterfacevariable{Character}{Buchstabe}
+\setinterfacevariable{Characters}{Buchstaben}
+\setinterfacevariable{CloseDocument}{SchliesseDokument}
+\setinterfacevariable{ExitViewer}{BeendeViewer}
+\setinterfacevariable{FirstPage}{ErsteSeite}
+\setinterfacevariable{FitHeight}{HoehePassend}
+\setinterfacevariable{FitWidth}{BreitePassend}
+\setinterfacevariable{GotoPage}{GotoPage}
+\setinterfacevariable{Greek}{Griechisch}
+\setinterfacevariable{Help}{Hilfe}
+\setinterfacevariable{HideField}{VerbergeFeld}
+\setinterfacevariable{HideLayer}{HideLayer}
+\setinterfacevariable{Key}{Schluessel}
+\setinterfacevariable{LastPage}{LetzteSeite}
+\setinterfacevariable{LoadForm}{LadeFormular}
+\setinterfacevariable{MONTH}{MONAT}
+\setinterfacevariable{New}{Neu}
+\setinterfacevariable{NextJump}{NaechsterSprung}
+\setinterfacevariable{NextPage}{FolgendeSeite}
+\setinterfacevariable{Numbers}{Ziffern}
+\setinterfacevariable{OpenNamedDocument}{OpenNamedDocument}
+\setinterfacevariable{Paragraph}{Absatz}
+\setinterfacevariable{PauseMovie}{PauseFilm}
+\setinterfacevariable{PauseRendering}{PauseRendering}
+\setinterfacevariable{PauseSound}{PauseSound}
+\setinterfacevariable{PreviousJump}{VorigerSprung}
+\setinterfacevariable{PreviousPage}{VorigeSeite}
+\setinterfacevariable{PrintDocument}{DruckeDokument}
+\setinterfacevariable{Query}{Query}
+\setinterfacevariable{QueryAgain}{QueryAgain}
+\setinterfacevariable{ResetForm}{ZuruecksetzenFormular}
+\setinterfacevariable{ResumeMovie}{FortsetzenFilm}
+\setinterfacevariable{ResumeRendering}{ResumeRendering}
+\setinterfacevariable{ResumeSound}{ResumeSound}
+\setinterfacevariable{Romannumerals}{Roemischezahlen}
+\setinterfacevariable{SaveDocument}{SpeichereDokument}
+\setinterfacevariable{SaveForm}{SpeicheFormular}
+\setinterfacevariable{SaveNamedDocument}{SaveNamedDocument}
+\setinterfacevariable{SearchAgain}{WeiterSuchen}
+\setinterfacevariable{SearchDocument}{DokumentDurchsuchen}
+\setinterfacevariable{ShowBookmarks}{ShowBookmarks}
+\setinterfacevariable{ShowField}{ZeigeFeld}
+\setinterfacevariable{ShowThumbs}{ShowThumbs}
+\setinterfacevariable{StartMovie}{StartFilm}
+\setinterfacevariable{StartRendering}{StartRendering}
+\setinterfacevariable{StartSound}{StartSound}
+\setinterfacevariable{StopMovie}{StopFilm}
+\setinterfacevariable{StopRendering}{StopRendering}
+\setinterfacevariable{StopSound}{StopSound}
+\setinterfacevariable{SubmitForm}{VersendeFormular}
+\setinterfacevariable{ToggleLayer}{ToggleLayer}
+\setinterfacevariable{ToggleViewer}{WechseleViewer}
+\setinterfacevariable{URL}{URL}
+\setinterfacevariable{VideLayer}{VideLayer}
+\setinterfacevariable{ViewerHelp}{ViewerHilfe}
+\setinterfacevariable{WEEKDAY}{WOCHENTAG}
+\setinterfacevariable{WORD}{WORT}
+\setinterfacevariable{abbreviation}{abkuerzung}
+\setinterfacevariable{abbreviations}{abkuerzungen}
+\setinterfacevariable{absolute}{absolut}
+\setinterfacevariable{action}{aktion}
+\setinterfacevariable{after}{nach}
+\setinterfacevariable{all}{alles}
+\setinterfacevariable{always}{immer}
+\setinterfacevariable{appendices}{anhaenge}
+\setinterfacevariable{appendix}{anhang}
+\setinterfacevariable{april}{April}
+\setinterfacevariable{atmargin}{amrand}
+\setinterfacevariable{atpage}{aufseite}
+\setinterfacevariable{august}{August}
+\setinterfacevariable{auto}{auto}
+\setinterfacevariable{autointro}{autointro}
+\setinterfacevariable{back}{zurueck}
+\setinterfacevariable{background}{hintergrund}
+\setinterfacevariable{backmatter}{epiloge}
+\setinterfacevariable{backpart}{epilog}
+\setinterfacevariable{backspace}{rumpfspatium}
+\setinterfacevariable{backward}{rueckwaerts}
+\setinterfacevariable{before}{vor}
+\setinterfacevariable{big}{gross}
+\setinterfacevariable{bigbodyfont}{bigbodyfont}
+\setinterfacevariable{bigpreference}{grosszuegig}
+\setinterfacevariable{blank}{blanko}
+\setinterfacevariable{blockquote}{blockquote}
+\setinterfacevariable{bodymatter}{haupttexte}
+\setinterfacevariable{bodypart}{haupttext}
+\setinterfacevariable{bold}{fett}
+\setinterfacevariable{bolditalic}{fettitalic}
+\setinterfacevariable{boldslanted}{fettgeneigt}
+\setinterfacevariable{bookmark}{bookmark}
+\setinterfacevariable{both}{beide}
+\setinterfacevariable{bottom}{unten}
+\setinterfacevariable{brief}{brief}
+\setinterfacevariable{broad}{breit}
+\setinterfacevariable{buffer}{puffer}
+\setinterfacevariable{by}{pro}
+\setinterfacevariable{calligraphic}{kalligraphie}
+\setinterfacevariable{cap}{kap}
+\setinterfacevariable{capital}{versalien}
+\setinterfacevariable{center}{center}
+\setinterfacevariable{chapter}{kapitel}
+\setinterfacevariable{character}{buchstabe}
+\setinterfacevariable{characters}{buchstaben}
+\setinterfacevariable{color}{farbe}
+\setinterfacevariable{column}{column}
+\setinterfacevariable{columns}{spalten}
+\setinterfacevariable{command}{befehl}
+\setinterfacevariable{commands}{befehle}
+\setinterfacevariable{comment}{kommentar}
+\setinterfacevariable{component}{komponente}
+\setinterfacevariable{concept}{konzept}
+\setinterfacevariable{content}{inhalt}
+\setinterfacevariable{contents}{inhalte}
+\setinterfacevariable{continue}{fortsetzten}
+\setinterfacevariable{controls}{controls}
+\setinterfacevariable{conversion}{konversion}
+\setinterfacevariable{current}{aktuell}
+\setinterfacevariable{cutspace}{cutspace}
+\setinterfacevariable{date}{datum}
+\setinterfacevariable{day}{tag}
+\setinterfacevariable{december}{Dezember}
+\setinterfacevariable{default}{default}
+\setinterfacevariable{depth}{tiefe}
+\setinterfacevariable{description}{beschreibung}
+\setinterfacevariable{disable}{sperren}
+\setinterfacevariable{display}{bildschirm}
+\setinterfacevariable{dot}{punkt}
+\setinterfacevariable{doublesided}{doppelseitig}
+\setinterfacevariable{each}{jede}
+\setinterfacevariable{edge}{kante}
+\setinterfacevariable{empty}{leer}
+\setinterfacevariable{endnote}{endnote}
+\setinterfacevariable{enumeration}{nummerierung}
+\setinterfacevariable{environment}{umgebung}
+\setinterfacevariable{even}{gerade}
+\setinterfacevariable{external}{extern}
+\setinterfacevariable{fact}{gegeben}
+\setinterfacevariable{february}{Februar}
+\setinterfacevariable{figure}{abbildung}
+\setinterfacevariable{figures}{abbildungen}
+\setinterfacevariable{file}{datei}
+\setinterfacevariable{final}{endfassung}
+\setinterfacevariable{first}{erste}
+\setinterfacevariable{firstcolumn}{firstcolumn}
+\setinterfacevariable{firstpage}{ersteseite}
+\setinterfacevariable{firstsubpage}{ersteunterseite}
+\setinterfacevariable{fit}{passend}
+\setinterfacevariable{five}{fuenf}
+\setinterfacevariable{fix}{stellewiederher}
+\setinterfacevariable{fixed}{fest}
+\setinterfacevariable{flexible}{flexibel}
+\setinterfacevariable{float}{gleitobjekt}
+\setinterfacevariable{flushinner}{flushinner}
+\setinterfacevariable{flushleft}{flushleft}
+\setinterfacevariable{flushouter}{flushouter}
+\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{footer}{fusszeile}
+\setinterfacevariable{footnote}{fussnote}
+\setinterfacevariable{force}{zwinge}
+\setinterfacevariable{foreground}{vordergrund}
+\setinterfacevariable{formeel}{formeel}
+\setinterfacevariable{formula}{formel}
+\setinterfacevariable{formulae}{formeln}
+\setinterfacevariable{forward}{vorwaerts}
+\setinterfacevariable{four}{vier}
+\setinterfacevariable{frame}{rahmen}
+\setinterfacevariable{framedtext}{umrahmtertext}
+\setinterfacevariable{friday}{freitag}
+\setinterfacevariable{frontmatter}{einleitungen}
+\setinterfacevariable{frontpart}{einleitung}
+\setinterfacevariable{global}{global}
+\setinterfacevariable{graphic}{grafik}
+\setinterfacevariable{graphics}{grafiken}
+\setinterfacevariable{gray}{grau}
+\setinterfacevariable{greek}{griechisch}
+\setinterfacevariable{grid}{gritter}
+\setinterfacevariable{halfline}{halbezeile}
+\setinterfacevariable{handwritten}{handschrift}
+\setinterfacevariable{hang}{haengend}
+\setinterfacevariable{hanging}{haengend}
+\setinterfacevariable{head}{kopf}
+\setinterfacevariable{header}{kopfzeile}
+\setinterfacevariable{height}{hoehe}
+\setinterfacevariable{helptext}{hilfetext}
+\setinterfacevariable{hencefore}{vorher}
+\setinterfacevariable{here}{hier}
+\setinterfacevariable{hereafter}{nachher}
+\setinterfacevariable{hidden}{versteckt}
+\setinterfacevariable{hiding}{verbergen}
+\setinterfacevariable{high}{hoch}
+\setinterfacevariable{horizontal}{horizontal}
+\setinterfacevariable{hyphenated}{hyphenate}
+\setinterfacevariable{hz}{hz}
+\setinterfacevariable{inbetween}{zwischen}
+\setinterfacevariable{index}{index}
+\setinterfacevariable{indices}{indizies}
+\setinterfacevariable{informeel}{informeel}
+\setinterfacevariable{inherit}{inherit}
+\setinterfacevariable{inleft}{imlinken}
+\setinterfacevariable{inmargin}{imrand}
+\setinterfacevariable{inner}{innen}
+\setinterfacevariable{inneredge}{inneredge}
+\setinterfacevariable{innermargin}{innermargin}
+\setinterfacevariable{inright}{imrechten}
+\setinterfacevariable{interaction}{interaktion}
+\setinterfacevariable{interactionmenu}{interaktionsmenue}
+\setinterfacevariable{intermezzi}{intermezzi}
+\setinterfacevariable{intermezzo}{intermezzo}
+\setinterfacevariable{intext}{imtext}
+\setinterfacevariable{intro}{intro}
+\setinterfacevariable{italic}{italic}
+\setinterfacevariable{italicbold}{italicfett}
+\setinterfacevariable{item}{pos}
+\setinterfacevariable{itemize}{aufzaehlung}
+\setinterfacevariable{its}{its}
+\setinterfacevariable{january}{Januar}
+\setinterfacevariable{joinedup}{keinabstand}
+\setinterfacevariable{july}{Juli}
+\setinterfacevariable{june}{Juni}
+\setinterfacevariable{keep}{behalte}
+\setinterfacevariable{knockout}{knockout}
+\setinterfacevariable{label}{label}
+\setinterfacevariable{landscape}{querformat}
+\setinterfacevariable{last}{letzte}
+\setinterfacevariable{lastcolumn}{lastcolumn}
+\setinterfacevariable{lastpage}{letzteseite}
+\setinterfacevariable{lastpagenumber}{lastpagenumber}
+\setinterfacevariable{lastsubpage}{letzteunterseite}
+\setinterfacevariable{left}{links}
+\setinterfacevariable{leftedge}{linkekante}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{linkerrand}
+\setinterfacevariable{leftpage}{linkerseite}
+\setinterfacevariable{legend}{legende}
+\setinterfacevariable{lesshyphenation}{lesshyphenation}
+\setinterfacevariable{line}{zeile}
+\setinterfacevariable{linenote}{linenote}
+\setinterfacevariable{lines}{zeilen}
+\setinterfacevariable{list}{liste}
+\setinterfacevariable{local}{lokal}
+\setinterfacevariable{localenvironment}{lokaleumgebung}
+\setinterfacevariable{logo}{logo}
+\setinterfacevariable{logos}{logos}
+\setinterfacevariable{lohi}{hoti}
+\setinterfacevariable{loose}{lose}
+\setinterfacevariable{low}{tief}
+\setinterfacevariable{ls}{ls}
+\setinterfacevariable{makeup}{umbruch}
+\setinterfacevariable{mar}{mar}
+\setinterfacevariable{march}{Maerz}
+\setinterfacevariable{margin}{marginalie}
+\setinterfacevariable{marginedge}{marginalkante}
+\setinterfacevariable{margintitle}{marginaltitel}
+\setinterfacevariable{marking}{beschriftung}
+\setinterfacevariable{mathalignment}{mathalignment}
+\setinterfacevariable{mathcases}{mathcases}
+\setinterfacevariable{mathmatrix}{mathmatrix}
+\setinterfacevariable{max}{max}
+\setinterfacevariable{may}{Mai}
+\setinterfacevariable{mediaeval}{mittelalterlich}
+\setinterfacevariable{medium}{mittel}
+\setinterfacevariable{middle}{mittig}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{minheight}{minhoehe}
+\setinterfacevariable{minwidth}{minbreite}
+\setinterfacevariable{mirrored}{gespiegelt}
+\setinterfacevariable{monday}{montag}
+\setinterfacevariable{mono}{mono}
+\setinterfacevariable{month}{monat}
+\setinterfacevariable{morehyphenation}{morehyphenation}
+\setinterfacevariable{name}{name}
+\setinterfacevariable{narrow}{schmall}
+\setinterfacevariable{negative}{negativ}
+\setinterfacevariable{never}{nie}
+\setinterfacevariable{new}{neu}
+\setinterfacevariable{next}{folgende}
+\setinterfacevariable{nextevenpage}{naechstegeradeseite}
+\setinterfacevariable{nextoddpage}{naechsteungeradeseite}
+\setinterfacevariable{nextpage}{folgendeseite}
+\setinterfacevariable{nextsubpage}{folgendeunterseite}
+\setinterfacevariable{no}{nein}
+\setinterfacevariable{nocheck}{nocheck}
+\setinterfacevariable{nofit}{nofit}
+\setinterfacevariable{nogrid}{nogrid}
+\setinterfacevariable{nohz}{nohz}
+\setinterfacevariable{nomarking}{keinebeschriftung}
+\setinterfacevariable{none}{kein}
+\setinterfacevariable{nonumber}{nonumber}
+\setinterfacevariable{normal}{normal}
+\setinterfacevariable{nospacing}{nospacing}
+\setinterfacevariable{not}{nicht}
+\setinterfacevariable{nothanging}{nothanging}
+\setinterfacevariable{nothyphenated}{nothyphenated}
+\setinterfacevariable{november}{November}
+\setinterfacevariable{nowhere}{nirgens}
+\setinterfacevariable{nowhite}{keinweiss}
+\setinterfacevariable{number}{nummer}
+\setinterfacevariable{numbers}{ziffern}
+\setinterfacevariable{october}{Oktober}
+\setinterfacevariable{odd}{ungerade}
+\setinterfacevariable{off}{aus}
+\setinterfacevariable{offset}{offset}
+\setinterfacevariable{old}{old}
+\setinterfacevariable{on}{an}
+\setinterfacevariable{one}{eins}
+\setinterfacevariable{opposite}{gegenueber}
+\setinterfacevariable{outer}{aussen}
+\setinterfacevariable{outeredge}{outeredge}
+\setinterfacevariable{outermargin}{outermargin}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{packed}{gepackt}
+\setinterfacevariable{page}{seite}
+\setinterfacevariable{pagecomment}{pagecomment}
+\setinterfacevariable{pagenumber}{seitennummer}
+\setinterfacevariable{paper}{papier}
+\setinterfacevariable{paragraph}{absatz}
+\setinterfacevariable{part}{teil}
+\setinterfacevariable{positive}{positiv}
+\setinterfacevariable{postponing}{verschieben}
+\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{preference}{einstellung}
+\setinterfacevariable{preview}{vorschau}
+\setinterfacevariable{previous}{vorig}
+\setinterfacevariable{previousevenpage}{vorigegeradeseite}
+\setinterfacevariable{previousoddpage}{vorigeungeradeseite}
+\setinterfacevariable{previouspage}{vorigeseite}
+\setinterfacevariable{previoussubpage}{vorigeunterseite}
+\setinterfacevariable{printable}{druckbar}
+\setinterfacevariable{process}{process}
+\setinterfacevariable{product}{produkt}
+\setinterfacevariable{program}{programm}
+\setinterfacevariable{project}{projekt}
+\setinterfacevariable{protected}{geschuetzt}
+\setinterfacevariable{quadruple}{viertel}
+\setinterfacevariable{quotation}{zitat}
+\setinterfacevariable{quote}{zitieren}
+\setinterfacevariable{ran}{ran}
+\setinterfacevariable{random}{zufaellig}
+\setinterfacevariable{readonly}{nurlesbar}
+\setinterfacevariable{rectangular}{rechteckig}
+\setinterfacevariable{referral}{merkmal}
+\setinterfacevariable{register}{register}
+\setinterfacevariable{regular}{regular}
+\setinterfacevariable{rekening}{rekening}
+\setinterfacevariable{relative}{relativ}
+\setinterfacevariable{repeat}{wiederholen}
+\setinterfacevariable{required}{obligatorisch}
+\setinterfacevariable{reset}{zuruecksetzten}
+\setinterfacevariable{reverse}{reverse}
+\setinterfacevariable{right}{rechts}
+\setinterfacevariable{rightedge}{rechterkante}
+\setinterfacevariable{righthanging}{righthanging}
+\setinterfacevariable{rightmargin}{rechterrand}
+\setinterfacevariable{rightpage}{rechterseite}
+\setinterfacevariable{roman}{antiqua}
+\setinterfacevariable{romannumerals}{roemischezahlen}
+\setinterfacevariable{rotate}{drehe}
+\setinterfacevariable{rotated}{gedreht}
+\setinterfacevariable{round}{rund}
+\setinterfacevariable{row}{row}
+\setinterfacevariable{rule}{linie}
+\setinterfacevariable{samepage}{selbeseite}
+\setinterfacevariable{sans}{sans}
+\setinterfacevariable{sansbold}{sansfett}
+\setinterfacevariable{sansserif}{grotesk}
+\setinterfacevariable{saturday}{samstag}
+\setinterfacevariable{screen}{raster}
+\setinterfacevariable{section}{absatz}
+\setinterfacevariable{sectionblockenvironment}{sectionblockenvironment}
+\setinterfacevariable{sectionnumber}{abschnittsnummer}
+\setinterfacevariable{see}{sieh}
+\setinterfacevariable{september}{September}
+\setinterfacevariable{serif}{serif}
+\setinterfacevariable{serried}{kleinerabstand}
+\setinterfacevariable{setups}{impostazioni}
+\setinterfacevariable{sheet}{sheet}
+\setinterfacevariable{singlesided}{einzelseitig}
+\setinterfacevariable{slanted}{geneigt}
+\setinterfacevariable{slantedbold}{geneigtfett}
+\setinterfacevariable{small}{klein}
+\setinterfacevariable{smallbodyfont}{smallbodyfont}
+\setinterfacevariable{smallbold}{kleinfett}
+\setinterfacevariable{smallbolditalic}{kleinfettitalic}
+\setinterfacevariable{smallboldslanted}{kleinfettgeneigt}
+\setinterfacevariable{smallcaps}{smallcaps}
+\setinterfacevariable{smallitalic}{kleinitalic}
+\setinterfacevariable{smallitalicbold}{kleinitalicfett}
+\setinterfacevariable{smallnormal}{kleinnormal}
+\setinterfacevariable{smallslanted}{kleingeneigt}
+\setinterfacevariable{smallslantedbold}{kleingeneigtfett}
+\setinterfacevariable{smalltype}{kleintippen}
+\setinterfacevariable{somewhere}{irgendwo}
+\setinterfacevariable{sorted}{sortiert}
+\setinterfacevariable{space}{spatium}
+\setinterfacevariable{spacing}{spatiumausgleich}
+\setinterfacevariable{speech}{speech}
+\setinterfacevariable{split}{split}
+\setinterfacevariable{spot}{spot}
+\setinterfacevariable{standard}{standard}
+\setinterfacevariable{start}{start}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{stop}
+\setinterfacevariable{stopper}{trenner}
+\setinterfacevariable{stretch}{strecken}
+\setinterfacevariable{strict}{streng}
+\setinterfacevariable{strong}{strong}
+\setinterfacevariable{strut}{strut}
+\setinterfacevariable{sub}{unter}
+\setinterfacevariable{subbackward}{unterrueckwaerts}
+\setinterfacevariable{subformula}{subformel}
+\setinterfacevariable{subforward}{untervorwaerts}
+\setinterfacevariable{subject}{thema}
+\setinterfacevariable{subpage}{unterseite}
+\setinterfacevariable{subsection}{unterabsatz}
+\setinterfacevariable{subsubject}{unterthema}
+\setinterfacevariable{subsubsection}{unterunterabsatz}
+\setinterfacevariable{subsubsubject}{unterunterthema}
+\setinterfacevariable{subsubsubsection}{unterunterunterabsatz}
+\setinterfacevariable{subsubsubsubject}{unterunterunterthema}
+\setinterfacevariable{subsubsubsubsection}{unterunterunterunterabsatz}
+\setinterfacevariable{subsubsubsubsubject}{unterunterunterunterthema}
+\setinterfacevariable{subsubsubsubsubsection}{unterunterunterunterunterabsatz}
+\setinterfacevariable{subsubsubsubsubsubject}{unterunterunterunterunterthema}
+\setinterfacevariable{sunday}{sonntag}
+\setinterfacevariable{support}{support}
+\setinterfacevariable{sym}{sym}
+\setinterfacevariable{symbol}{symbol}
+\setinterfacevariable{synchronize}{synchronize}
+\setinterfacevariable{system}{systeme}
+\setinterfacevariable{table}{tabelle}
+\setinterfacevariable{tablehead}{tabellenueberschrift}
+\setinterfacevariable{tables}{tabellen}
+\setinterfacevariable{tabletail}{tabellenende}
+\setinterfacevariable{tabulate}{tabulator}
+\setinterfacevariable{tabulatehead}{tabulatehead}
+\setinterfacevariable{tabulatetail}{tabulatetail}
+\setinterfacevariable{tall}{lang}
+\setinterfacevariable{teletype}{fernschreiber}
+\setinterfacevariable{temporary}{temporaer}
+\setinterfacevariable{test}{test}
+\setinterfacevariable{text}{text}
+\setinterfacevariable{three}{drei}
+\setinterfacevariable{thursday}{donnerstag}
+\setinterfacevariable{title}{titel}
+\setinterfacevariable{toggle}{toggle}
+\setinterfacevariable{tolerant}{tolerant}
+\setinterfacevariable{top}{oben}
+\setinterfacevariable{tuesday}{dienstag}
+\setinterfacevariable{two}{zwei}
+\setinterfacevariable{txt}{txt}
+\setinterfacevariable{type}{tippen}
+\setinterfacevariable{typing}{tippen}
+\setinterfacevariable{unavailable}{nichtverfuegbar}
+\setinterfacevariable{unit}{einheit}
+\setinterfacevariable{units}{einheiten}
+\setinterfacevariable{unknown}{unbekannt}
+\setinterfacevariable{unpacked}{ungepackt}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{verwende}
+\setinterfacevariable{value}{wert}
+\setinterfacevariable{vertical}{vertikal}
+\setinterfacevariable{very}{sehr}
+\setinterfacevariable{verystrict}{sehrstreng}
+\setinterfacevariable{verytolerant}{sehrtolerant}
+\setinterfacevariable{weak}{weak}
+\setinterfacevariable{wednesday}{mittwoch}
+\setinterfacevariable{week}{woche}
+\setinterfacevariable{weekday}{wochentag}
+\setinterfacevariable{white}{weiss}
+\setinterfacevariable{wide}{breit}
+\setinterfacevariable{width}{breite}
+\setinterfacevariable{xml}{xml}
+\setinterfacevariable{year}{jahr}
+\setinterfacevariable{yes}{ja}
+% definitions for interface constants for language de
+%
+\setinterfaceconstant{action}{aktion}
+\setinterfaceconstant{address}{adresse}
+\setinterfaceconstant{after}{nach}
+\setinterfaceconstant{afterhead}{nachkopf}
+\setinterfaceconstant{afterkey}{nachtaste}
+\setinterfaceconstant{align}{ausrichtung}
+\setinterfaceconstant{aligncharacter}{aligncharacter}
+\setinterfaceconstant{alignmentcharacter}{alignmentcharacter}
+\setinterfaceconstant{aligntitle}{titelausrichten}
+\setinterfaceconstant{alternative}{alternative}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{pfeil}
+\setinterfaceconstant{at}{bei}
+\setinterfaceconstant{author}{autor}
+\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autofile}{autofile}
+\setinterfaceconstant{autofocus}{autofocus}
+\setinterfaceconstant{autohang}{autohang}
+\setinterfaceconstant{autostrut}{autostrut}
+\setinterfaceconstant{autowidth}{autobreite}
+\setinterfaceconstant{axis}{achsen}
+\setinterfaceconstant{background}{hintergrund}
+\setinterfaceconstant{backgroundcolor}{hintergrundfarbe}
+\setinterfaceconstant{backgroundcorner}{hintergrundwinkel}
+\setinterfaceconstant{backgrounddepth}{hintergrundtiefe}
+\setinterfaceconstant{backgroundoffset}{hintergrundoffset}
+\setinterfaceconstant{backgroundradius}{hintergrundradius}
+\setinterfaceconstant{backgroundscreen}{hintergrundraster}
+\setinterfaceconstant{backspace}{rumpfspatium}
+\setinterfaceconstant{balance}{ausgleichen}
+\setinterfaceconstant{before}{vor}
+\setinterfaceconstant{beforehead}{vorkopf}
+\setinterfaceconstant{bet}{bet}
+\setinterfaceconstant{big}{gross}
+\setinterfaceconstant{blank}{blanko}
+\setinterfaceconstant{blockway}{blockauf}
+\setinterfaceconstant{bodyfont}{fliesstext}
+\setinterfaceconstant{bookmark}{bookmark}
+\setinterfaceconstant{bottom}{unten}
+\setinterfaceconstant{bottomdistance}{abstandunten}
+\setinterfaceconstant{bottomframe}{untenrahmen}
+\setinterfaceconstant{bottomoffset}{untenoffset}
+\setinterfaceconstant{bottomspace}{bottomspace}
+\setinterfaceconstant{bottomstate}{untenstatus}
+\setinterfaceconstant{cache}{cache}
+\setinterfaceconstant{calculate}{berechnen}
+\setinterfaceconstant{ccommand}{cbefehl}
+\setinterfaceconstant{click}{klick}
+\setinterfaceconstant{clickin}{klickin}
+\setinterfaceconstant{clickout}{klickaus}
+\setinterfaceconstant{clipoffset}{clipoffset}
+\setinterfaceconstant{closeaction}{schliessenaktion}
+\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepageaction}{closepageaction}
+\setinterfaceconstant{closesymbol}{closesymbol}
+\setinterfaceconstant{color}{farbe}
+\setinterfaceconstant{column}{spalte}
+\setinterfaceconstant{columndistance}{spaltenabstand}
+\setinterfaceconstant{columns}{spalten}
+\setinterfaceconstant{command}{befehl}
+\setinterfaceconstant{commandafter}{zumbefehl}
+\setinterfaceconstant{commandbefore}{vorbefehl}
+\setinterfaceconstant{commands}{befehle}
+\setinterfaceconstant{component}{component}
+\setinterfaceconstant{compoundhyphen}{compoundhyphen}
+\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{continue}{fortsetzen}
+\setinterfaceconstant{contrastcolor}{kontrastfarbe}
+\setinterfaceconstant{controls}{controls}
+\setinterfaceconstant{conversion}{konversion}
+\setinterfaceconstant{convertfile}{konvertieredatei}
+\setinterfaceconstant{corner}{winkel}
+\setinterfaceconstant{coupling}{verknuepfung}
+\setinterfaceconstant{couplingway}{verkopplungsart}
+\setinterfaceconstant{criterium}{kriterium}
+\setinterfaceconstant{current}{aktuell}
+\setinterfaceconstant{cutspace}{cutspace}
+\setinterfaceconstant{dash}{strich}
+\setinterfaceconstant{dat}{dat}
+\setinterfaceconstant{date}{datum}
+\setinterfaceconstant{deepnumbercommand}{deepnumbercommand}
+\setinterfaceconstant{deeptextcommand}{deeptextcommand}
+\setinterfaceconstant{default}{default}
+\setinterfaceconstant{delay}{wartezeit}
+\setinterfaceconstant{depth}{tiefe}
+\setinterfaceconstant{depthcorrection}{tiefekorrektur}
+\setinterfaceconstant{direction}{richtung}
+\setinterfaceconstant{directory}{verzeichnis}
+\setinterfaceconstant{display}{bildschirm}
+\setinterfaceconstant{distance}{abstand}
+\setinterfaceconstant{dot}{punkt}
+\setinterfaceconstant{doublesided}{doppelseitig}
+\setinterfaceconstant{dummy}{dummy}
+\setinterfaceconstant{dx}{dx}
+\setinterfaceconstant{dy}{dy}
+\setinterfaceconstant{edge}{kante}
+\setinterfaceconstant{edgedistance}{kantenabstand}
+\setinterfaceconstant{empty}{leer}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{geraderand}
+\setinterfaceconstant{expansion}{expansion}
+\setinterfaceconstant{extras}{extras}
+\setinterfaceconstant{factor}{faktor}
+\setinterfaceconstant{fallback}{fallback}
+\setinterfaceconstant{family}{familie}
+\setinterfaceconstant{fieldbackgroundcolor}{feldhintergrundfarbe}
+\setinterfaceconstant{fieldframecolor}{feldrahmenfarbe}
+\setinterfaceconstant{fieldlayer}{fieldlayer}
+\setinterfaceconstant{fieldoffset}{feldoffset}
+\setinterfaceconstant{file}{datei}
+\setinterfaceconstant{focus}{focus}
+\setinterfaceconstant{focusin}{focusin}
+\setinterfaceconstant{focusout}{focusout}
+\setinterfaceconstant{footer}{fusszeile}
+\setinterfaceconstant{footerdistance}{fusszeilenabstand}
+\setinterfaceconstant{footerstate}{fusszeilenstatus}
+\setinterfaceconstant{foregroundcolor}{foregroundcolor}
+\setinterfaceconstant{foregroundstyle}{foregroundstyle}
+\setinterfaceconstant{format}{formatieren}
+\setinterfaceconstant{frame}{rahmen}
+\setinterfaceconstant{framecolor}{rahmenfarbe}
+\setinterfaceconstant{framecorner}{rahmenwinkel}
+\setinterfaceconstant{framedepth}{rahmentiefe}
+\setinterfaceconstant{frameoffset}{rahmenoffset}
+\setinterfaceconstant{frameradius}{rahmenradius}
+\setinterfaceconstant{frames}{umrahmen}
+\setinterfaceconstant{from}{von}
+\setinterfaceconstant{get}{hole}
+\setinterfaceconstant{global}{global}
+\setinterfaceconstant{grid}{gritter}
+\setinterfaceconstant{hang}{haengend}
+\setinterfaceconstant{headcolor}{kopffarbe}
+\setinterfaceconstant{headcommand}{headcommand}
+\setinterfaceconstant{headconversion}{headconversion}
+\setinterfaceconstant{header}{kopfzeile}
+\setinterfaceconstant{headerdistance}{kopfzeilenabstand}
+\setinterfaceconstant{headerstate}{kopfzeilenstatus}
+\setinterfaceconstant{headlabel}{headlabel}
+\setinterfaceconstant{headnumber}{kopfnummer}
+\setinterfaceconstant{headstyle}{kopfstil}
+\setinterfaceconstant{height}{hoehe}
+\setinterfaceconstant{hfactor}{hfaktor}
+\setinterfaceconstant{hfil}{hfil}
+\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horoffset}{rumpfabstand}
+\setinterfaceconstant{hyphen}{hyphen}
+\setinterfaceconstant{icommand}{ibefehl}
+\setinterfaceconstant{in}{in}
+\setinterfaceconstant{inbetween}{zwischen}
+\setinterfaceconstant{increment}{erhoehen}
+\setinterfaceconstant{incrementnumber}{nummererhoehen}
+\setinterfaceconstant{indenting}{einziehen}
+\setinterfaceconstant{indentnext}{ziehefolgendeein}
+\setinterfaceconstant{indicator}{indikator}
+\setinterfaceconstant{inner}{innen}
+\setinterfaceconstant{innermargin}{innermargin}
+\setinterfaceconstant{inputfile}{inputfile}
+\setinterfaceconstant{interaction}{interaktion}
+\setinterfaceconstant{interlinespace}{zeilenabstande}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{posten}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{keyword}
+\setinterfaceconstant{label}{label}
+\setinterfaceconstant{left}{links}
+\setinterfaceconstant{leftcolor}{linkerfarbe}
+\setinterfaceconstant{leftcompoundhyphen}{leftcompoundhyphen}
+\setinterfaceconstant{leftedge}{linkekante}
+\setinterfaceconstant{leftedgedistance}{linkerkantenabstand}
+\setinterfaceconstant{leftframe}{linkerrahmen}
+\setinterfaceconstant{lefthyphen}{lefthyphen}
+\setinterfaceconstant{leftmargin}{linkerrand}
+\setinterfaceconstant{leftmargindistance}{linkerrandabstand}
+\setinterfaceconstant{leftoffset}{linkeroffset}
+\setinterfaceconstant{leftquotation}{linkerzitat}
+\setinterfaceconstant{leftquote}{linkerzitieren}
+\setinterfaceconstant{leftsentence}{linkersatz}
+\setinterfaceconstant{leftspeech}{leftspeech}
+\setinterfaceconstant{leftstyle}{linkerstil}
+\setinterfaceconstant{leftsubsentence}{linkersubsatz}
+\setinterfaceconstant{lefttext}{linkertext}
+\setinterfaceconstant{leftwidth}{linkerbreite}
+\setinterfaceconstant{level}{niveau}
+\setinterfaceconstant{levels}{niveaus}
+\setinterfaceconstant{limittext}{limittext}
+\setinterfaceconstant{line}{zeile}
+\setinterfaceconstant{linecorrection}{zeilekorrektur}
+\setinterfaceconstant{lines}{zeilen}
+\setinterfaceconstant{list}{liste}
+\setinterfaceconstant{listtext}{listtext}
+\setinterfaceconstant{local}{lokal}
+\setinterfaceconstant{location}{platz}
+\setinterfaceconstant{logo}{logo}
+\setinterfaceconstant{logos}{logos}
+\setinterfaceconstant{marcolor}{beschrfarbe}
+\setinterfaceconstant{margin}{marginalie}
+\setinterfaceconstant{margindistance}{marginalabstand}
+\setinterfaceconstant{marginedge}{marginalkante}
+\setinterfaceconstant{marginedgetext}{marginalkantetext}
+\setinterfaceconstant{margintext}{marginaltext}
+\setinterfaceconstant{marking}{beschriftung}
+\setinterfaceconstant{marstyle}{beschrstil}
+\setinterfaceconstant{max}{max}
+\setinterfaceconstant{maxheight}{maxhoehe}
+\setinterfaceconstant{maxwidth}{maxbreite}
+\setinterfaceconstant{menu}{menue}
+\setinterfaceconstant{method}{methode}
+\setinterfaceconstant{middle}{mittig}
+\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middletext}{mittigertext}
+\setinterfaceconstant{midsentence}{midsentence}
+\setinterfaceconstant{min}{min}
+\setinterfaceconstant{mindepth}{mindepth}
+\setinterfaceconstant{minheight}{minhoehe}
+\setinterfaceconstant{minwidth}{minbreite}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{name}
+\setinterfaceconstant{nbottom}{nunten}
+\setinterfaceconstant{nc}{nc}
+\setinterfaceconstant{next}{folgende}
+\setinterfaceconstant{nl}{nl}
+\setinterfaceconstant{nleft}{nlinks}
+\setinterfaceconstant{nlines}{zzeile}
+\setinterfaceconstant{norm}{norm}
+\setinterfaceconstant{nr}{nr}
+\setinterfaceconstant{nright}{nrechts}
+\setinterfaceconstant{ntop}{noben}
+\setinterfaceconstant{number}{nummer}
+\setinterfaceconstant{numbercolor}{nummernfarbe}
+\setinterfaceconstant{numbercommand}{nummerbefehl}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{nummerierung}
+\setinterfaceconstant{numberseparator}{nummernseperator}
+\setinterfaceconstant{numberstyle}{nummernstil}
+\setinterfaceconstant{numberwidth}{numberwidth}
+\setinterfaceconstant{nx}{nx}
+\setinterfaceconstant{ny}{ny}
+\setinterfaceconstant{object}{objekt}
+\setinterfaceconstant{obstruction}{gesperrt}
+\setinterfaceconstant{oddmargin}{ungeraderand}
+\setinterfaceconstant{offset}{offset}
+\setinterfaceconstant{openaction}{oeffenaktion}
+\setinterfaceconstant{openpageaction}{openpageaction}
+\setinterfaceconstant{option}{option}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{outermargin}{outermargin}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{eigenenummer}
+\setinterfaceconstant{page}{seite}
+\setinterfaceconstant{pageboundaries}{seitenbegrenzung}
+\setinterfaceconstant{pagecolor}{seitenfarbe}
+\setinterfaceconstant{pagecommand}{seitenbefehl}
+\setinterfaceconstant{pagenumber}{seitennummer}
+\setinterfaceconstant{pagestate}{pagestate}
+\setinterfaceconstant{pagestyle}{seitenstil}
+\setinterfaceconstant{palet}{palette}
+\setinterfaceconstant{paper}{papier}
+\setinterfaceconstant{paragraph}{absatz}
+\setinterfaceconstant{place}{platziere}
+\setinterfaceconstant{placehead}{setzekopf}
+\setinterfaceconstant{placestopper}{setzetrenner}
+\setinterfaceconstant{position}{position}
+\setinterfaceconstant{prefix}{prefix}
+\setinterfaceconstant{preset}{voreinstellung}
+\setinterfaceconstant{preview}{vorschau}
+\setinterfaceconstant{previous}{vorige}
+\setinterfaceconstant{previousnumber}{vorigenummer}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{radius}{radius}
+\setinterfaceconstant{random}{zufaellig}
+\setinterfaceconstant{reduction}{reduktion}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{reference}{referenz}
+\setinterfaceconstant{referencing}{referieren}
+\setinterfaceconstant{regionin}{regionin}
+\setinterfaceconstant{regionout}{regionaus}
+\setinterfaceconstant{repeat}{wiederholen}
+\setinterfaceconstant{reset}{reset}
+\setinterfaceconstant{resetnumber}{resetnumber}
+\setinterfaceconstant{resolution}{aufloesung}
+\setinterfaceconstant{right}{rechts}
+\setinterfaceconstant{rightcolor}{rechterfarbe}
+\setinterfaceconstant{rightcompoundhyphen}{rightcompoundhyphen}
+\setinterfaceconstant{rightedge}{rechtekante}
+\setinterfaceconstant{rightedgedistance}{rechterkantenabstand}
+\setinterfaceconstant{rightframe}{rechterrahmen}
+\setinterfaceconstant{righthyphen}{righthyphen}
+\setinterfaceconstant{rightmargin}{rechterrand}
+\setinterfaceconstant{rightmargindistance}{rechterrandabstand}
+\setinterfaceconstant{rightoffset}{rechterabstand}
+\setinterfaceconstant{rightquotation}{rechterzitat}
+\setinterfaceconstant{rightquote}{rechterzitieren}
+\setinterfaceconstant{rightsentence}{rechtersatz}
+\setinterfaceconstant{rightspeech}{rightspeech}
+\setinterfaceconstant{rightstyle}{rechterstil}
+\setinterfaceconstant{rightsubsentence}{rechtersubsatz}
+\setinterfaceconstant{righttext}{rechtertext}
+\setinterfaceconstant{rightwidth}{rechterbreite}
+\setinterfaceconstant{rotation}{rotation}
+\setinterfaceconstant{rule}{linie}
+\setinterfaceconstant{rulecolor}{linienfarbe}
+\setinterfaceconstant{rulethickness}{liniendicke}
+\setinterfaceconstant{samepage}{selbeseite}
+\setinterfaceconstant{sample}{muster}
+\setinterfaceconstant{scale}{format}
+\setinterfaceconstant{scope}{bereich}
+\setinterfaceconstant{screen}{raster}
+\setinterfaceconstant{section}{abschnitt}
+\setinterfaceconstant{sectionnumber}{abschnittsnummer}
+\setinterfaceconstant{separator}{seperator}
+\setinterfaceconstant{set}{set}
+\setinterfaceconstant{setups}{setups}
+\setinterfaceconstant{side}{objektabstand}
+\setinterfaceconstant{sidealign}{sidealign}
+\setinterfaceconstant{sidemethod}{sidemethod}
+\setinterfaceconstant{sidespaceafter}{nebennachspatium}
+\setinterfaceconstant{sidespacebefore}{nebenvorspatium}
+\setinterfaceconstant{sign}{zeichen}
+\setinterfaceconstant{size}{groesse}
+\setinterfaceconstant{small}{klein}
+\setinterfaceconstant{sorttype}{sorttype}
+\setinterfaceconstant{source}{quelle}
+\setinterfaceconstant{space}{spatium}
+\setinterfaceconstant{spaceafter}{nachspatium}
+\setinterfaceconstant{spacebefore}{vorspatium}
+\setinterfaceconstant{spaceinbetween}{spaceinbetween}
+\setinterfaceconstant{spacing}{spatiumausgleich}
+\setinterfaceconstant{split}{split}
+\setinterfaceconstant{splitcolor}{splitcolor}
+\setinterfaceconstant{splitmethod}{splitmethod}
+\setinterfaceconstant{splitoffset}{splitoffset}
+\setinterfaceconstant{spot}{spot}
+\setinterfaceconstant{stack}{stack}
+\setinterfaceconstant{start}{start}
+\setinterfaceconstant{state}{status}
+\setinterfaceconstant{step}{schritt}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{abschnitttrenner}
+\setinterfaceconstant{stretch}{strecken}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{stil}
+\setinterfaceconstant{sub}{unter}
+\setinterfaceconstant{subtitle}{untertitel}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{sx}{sx}
+\setinterfaceconstant{sy}{sy}
+\setinterfaceconstant{symalign}{symausrichtung}
+\setinterfaceconstant{symbol}{symbol}
+\setinterfaceconstant{symbolset}{symbolset}
+\setinterfaceconstant{symcolor}{symfarbe}
+\setinterfaceconstant{symstyle}{symstil}
+\setinterfaceconstant{synonym}{synonym}
+\setinterfaceconstant{synonymcolor}{synonymfarbe}
+\setinterfaceconstant{synonymstyle}{synonymstil}
+\setinterfaceconstant{tab}{tab}
+\setinterfaceconstant{text}{text}
+\setinterfaceconstant{textcolor}{textfarbe}
+\setinterfaceconstant{textcommand}{textbefehl}
+\setinterfaceconstant{textdistance}{textdistance}
+\setinterfaceconstant{textlayer}{textlayer}
+\setinterfaceconstant{textmargin}{textmargin}
+\setinterfaceconstant{textmethod}{textmethod}
+\setinterfaceconstant{textseparator}{textseparator}
+\setinterfaceconstant{textsize}{textgroesse}
+\setinterfaceconstant{textstate}{textstatus}
+\setinterfaceconstant{textstyle}{textstil}
+\setinterfaceconstant{textwidth}{textbreite}
+\setinterfaceconstant{title}{titel}
+\setinterfaceconstant{titlecolor}{titelfarbe}
+\setinterfaceconstant{titlecommand}{titlecommand}
+\setinterfaceconstant{titledistance}{titelabstand}
+\setinterfaceconstant{titleleft}{titleleft}
+\setinterfaceconstant{titleright}{titleright}
+\setinterfaceconstant{titlestyle}{titelstil}
+\setinterfaceconstant{to}{zu}
+\setinterfaceconstant{tolerance}{toleranz}
+\setinterfaceconstant{top}{oben}
+\setinterfaceconstant{topdistance}{obenabstand}
+\setinterfaceconstant{topframe}{obenrahmen}
+\setinterfaceconstant{topoffset}{obenoffset}
+\setinterfaceconstant{topspace}{kopfspatium}
+\setinterfaceconstant{topstate}{statusoben}
+\setinterfaceconstant{type}{typ}
+\setinterfaceconstant{unit}{einheit}
+\setinterfaceconstant{unknownreference}{unbekantereferenz}
+\setinterfaceconstant{urlalternative}{urlalternative}
+\setinterfaceconstant{urlspace}{urlspatium}
+\setinterfaceconstant{validate}{validieren}
+\setinterfaceconstant{vcommand}{vbefehl}
+\setinterfaceconstant{veroffset}{kopfoffset}
+\setinterfaceconstant{vfil}{vfil}
+\setinterfaceconstant{voffset}{voffset}
+\setinterfaceconstant{way}{art}
+\setinterfaceconstant{wfactor}{bfaktor}
+\setinterfaceconstant{white}{weiss}
+\setinterfaceconstant{width}{breite}
+\setinterfaceconstant{xfactor}{xfaktor}
+\setinterfaceconstant{xmax}{xmax}
+\setinterfaceconstant{xoffset}{xoffset}
+\setinterfaceconstant{xscale}{xformat}
+\setinterfaceconstant{xstep}{xschritt}
+\setinterfaceconstant{yfactor}{yfaktor}
+\setinterfaceconstant{ymax}{ymax}
+\setinterfaceconstant{yoffset}{yoffset}
+\setinterfaceconstant{yscale}{yformat}
+\setinterfaceconstant{ystep}{yschritt}
+% definitions for interface elements for language de
+%
+\setinterfaceelement{begin}{anfang}
+\setinterfaceelement{complete}{vollende}
+\setinterfaceelement{coupled}{verknuepft}
+\setinterfaceelement{currentlocal}{aktuelllokal}
+\setinterfaceelement{emptyone}{vuoto}
+\setinterfaceelement{emptytwo}{leer}
+\setinterfaceelement{end}{ende}
+\setinterfaceelement{endsetup}{ein}
+\setinterfaceelement{get}{get}
+\setinterfaceelement{increment}{erhoehen}
+\setinterfaceelement{list}{auflisten}
+\setinterfaceelement{listof}{auflistenvon}
+\setinterfaceelement{load}{laden}
+\setinterfaceelement{local}{lokal}
+\setinterfaceelement{makeup}{umbruch}
+\setinterfaceelement{next}{folgende}
+\setinterfaceelement{place}{platziere}
+\setinterfaceelement{previous}{vorige}
+\setinterfaceelement{previouslocal}{voriglokal}
+\setinterfaceelement{reserve}{reservieren}
+\setinterfaceelement{see}{sieh}
+\setinterfaceelement{setup}{stelle}
+\setinterfaceelement{start}{start}
+\setinterfaceelement{stop}{stop}
+\setinterfaceelement{text}{text}
+\setinterfaceelement{type}{type}
+% definitions for interface commands for language de
+%
+\setinterfacecommand{CAPPED}{KAP}
+\setinterfacecommand{Character}{Buchstabe}
+\setinterfacecommand{Characters}{Buchstaben}
+\setinterfacecommand{LABELTEXT}{LABELTEXT}
+\setinterfacecommand{MONTH}{MONAT}
+\setinterfacecommand{Numbers}{Ziffern}
+\setinterfacecommand{Romannumerals}{Roemischezahlen}
+\setinterfacecommand{SmallCapped}{Kap}
+\setinterfacecommand{SmallCaps}{Kaps}
+\setinterfacecommand{WEEKDAY}{WOCHENTAG}
+\setinterfacecommand{WORD}{WORT}
+\setinterfacecommand{WORDS}{WOERTER}
+\setinterfacecommand{Word}{Wort}
+\setinterfacecommand{Words}{Woerter}
+\setinterfacecommand{about}{ueber}
+\setinterfacecommand{adaptlayout}{passelayoutan}
+\setinterfacecommand{arg}{arg}
+\setinterfacecommand{at}{bei}
+\setinterfacecommand{atleftmargin}{atleftmargin}
+\setinterfacecommand{atpage}{aufseite}
+\setinterfacecommand{atrightmargin}{atrightmargin}
+\setinterfacecommand{background}{hintergrund}
+\setinterfacecommand{backspace}{rumpfweite}
+\setinterfacecommand{blackrule}{rechteck}
+\setinterfacecommand{blackrules}{rechtecke}
+\setinterfacecommand{blank}{blanko}
+\setinterfacecommand{bookmark}{bookmark}
+\setinterfacecommand{bottomdistance}{abstandunten}
+\setinterfacecommand{bottomheight}{hoeheunten}
+\setinterfacecommand{bottomspace}{bottomspace}
+\setinterfacecommand{but}{but}
+\setinterfacecommand{button}{knopf}
+\setinterfacecommand{bypassblocks}{bypassblocks}
+\setinterfacecommand{character}{buchstabe}
+\setinterfacecommand{characters}{buchstaben}
+\setinterfacecommand{chem}{chem}
+\setinterfacecommand{clip}{ausschnitt}
+\setinterfacecommand{clonefield}{klonierefeld}
+\setinterfacecommand{color}{farbe}
+\setinterfacecommand{colorbar}{farbbalken}
+\setinterfacecommand{colorvalue}{farbewert}
+\setinterfacecommand{column}{spalte}
+\setinterfacecommand{comment}{kommentar}
+\setinterfacecommand{comparecolorgroup}{vergleichefarbengruppe}
+\setinterfacecommand{comparepalet}{vergleichepalette}
+\setinterfacecommand{completepagenumber}{completepagenumber}
+\setinterfacecommand{completeregister}{completeregister}
+\setinterfacecommand{component}{komponente}
+\setinterfacecommand{convertnumber}{konvertierezahl}
+\setinterfacecommand{copyfield}{kopierefeld}
+\setinterfacecommand{correctwhitespace}{korrigierezwischenraum}
+\setinterfacecommand{coupledocument}{verknuepfedokument}
+\setinterfacecommand{couplemarking}{verknuepfebeschriftung}
+\setinterfacecommand{couplepage}{doppelseite}
+\setinterfacecommand{couplepaper}{doppelseitigespapier}
+\setinterfacecommand{coupleregister}{verknuepfregister}
+\setinterfacecommand{crlf}{crlf}
+\setinterfacecommand{currentdate}{heutigesdatum}
+\setinterfacecommand{currentheadnumber}{heutigeskopfnummer}
+\setinterfacecommand{cutspace}{cutspace}
+\setinterfacecommand{date}{datum}
+\setinterfacecommand{decouplemarking}{entknuepfebeschriftung}
+\setinterfacecommand{decrementnumber}{decrementnumber}
+\setinterfacecommand{define}{definieren}
+\setinterfacecommand{defineaccent}{definiereakzent}
+\setinterfacecommand{defineblank}{definiereblanko}
+\setinterfacecommand{defineblock}{definiereblock}
+\setinterfacecommand{definebodyfont}{definierefliesstext}
+\setinterfacecommand{definebodyfontenvironment}{definierefliesstextumgebung}
+\setinterfacecommand{definebuffer}{definierepuffer}
+\setinterfacecommand{definecharacter}{definierezeichen}
+\setinterfacecommand{definecolor}{definierefarbe}
+\setinterfacecommand{definecolorgroup}{definierefarbengruppe}
+\setinterfacecommand{definecolumnbreak}{definecolumnbreak}
+\setinterfacecommand{definecolumnset}{definecolumnset}
+\setinterfacecommand{definecombination}{definecombination}
+\setinterfacecommand{definecombinedlist}{definierezusammengestellteliste}
+\setinterfacecommand{definecommand}{definierebefehl}
+\setinterfacecommand{defineconversion}{definierekonversion}
+\setinterfacecommand{definedescription}{definierebeschreibung}
+\setinterfacecommand{defineenumeration}{definierenummerierung}
+\setinterfacecommand{definefield}{definierefeld}
+\setinterfacecommand{definefieldstack}{definierefeldstapel}
+\setinterfacecommand{definefiguresymbol}{definiereabbsymbol}
+\setinterfacecommand{definefloat}{definieregleitobjekt}
+\setinterfacecommand{definefont}{definiereschrift}
+\setinterfacecommand{definefontstyle}{definiereschriftstil}
+\setinterfacecommand{definefontsynonym}{defineschriftsynonym}
+\setinterfacecommand{defineframed}{definiereumrahmt}
+\setinterfacecommand{defineframedtext}{definiereumrahmtertext}
+\setinterfacecommand{definehbox}{definierehbox}
+\setinterfacecommand{definehead}{definiereueberschrift}
+\setinterfacecommand{defineindenting}{definiereeinzug}
+\setinterfacecommand{defineinmargin}{defineinmargin}
+\setinterfacecommand{defineinteractionmenu}{definiereinteraktionsmenue}
+\setinterfacecommand{defineitemgroup}{defineitemgroup}
+\setinterfacecommand{definelabel}{definierelabel}
+\setinterfacecommand{definelayer}{definelayer}
+\setinterfacecommand{definelayout}{definelayout}
+\setinterfacecommand{definelist}{definiereliste}
+\setinterfacecommand{definelogo}{definierelogo}
+\setinterfacecommand{definemainfield}{definierehauptfeld}
+\setinterfacecommand{definemakeup}{definiereumbruch}
+\setinterfacecommand{definemarking}{definierebeschriftung}
+\setinterfacecommand{definemathalignment}{definemathalignment}
+\setinterfacecommand{defineoutput}{defineoutput}
+\setinterfacecommand{defineoverlay}{definiereoverlay}
+\setinterfacecommand{definepagebreak}{definepagebreak}
+\setinterfacecommand{definepalet}{definierepalette}
+\setinterfacecommand{definepapersize}{definierepapierformat}
+\setinterfacecommand{defineparagraphs}{definiereabsaetze}
+\setinterfacecommand{defineplacement}{defineplacement}
+\setinterfacecommand{defineprofile}{definiereprofil}
+\setinterfacecommand{defineprogram}{definiereprogramme}
+\setinterfacecommand{definerawfont}{definerawfont}
+\setinterfacecommand{definereference}{definierereferenz}
+\setinterfacecommand{definereferenceformat}{definierereferenzformat}
+\setinterfacecommand{definereferencelist}{definierereferenzliste}
+\setinterfacecommand{defineregister}{definiereregister}
+\setinterfacecommand{definerule}{definerule}
+\setinterfacecommand{definesection}{definiereabschnitt}
+\setinterfacecommand{definesectionblock}{definiereabschnittsblock}
+\setinterfacecommand{definesorting}{definieresortieren}
+\setinterfacecommand{definestartstop}{definierestartstop}
+\setinterfacecommand{definestyle}{definierestil}
+\setinterfacecommand{definesubfield}{definieresubfeld}
+\setinterfacecommand{definesymbol}{definieresymbol}
+\setinterfacecommand{definesynonyms}{definieresynonyme}
+\setinterfacecommand{definetabletemplate}{definieretabellenvorlage}
+\setinterfacecommand{definetabulate}{definieretabulator}
+\setinterfacecommand{definetext}{definieretext}
+\setinterfacecommand{definetextposition}{definetextposition}
+\setinterfacecommand{definetextvariable}{definetextvariable}
+\setinterfacecommand{definetype}{definetype}
+\setinterfacecommand{definetyping}{definieretippen}
+\setinterfacecommand{defineversion}{definiereversion}
+\setinterfacecommand{determineheadnumber}{bestimmekopfnummer}
+\setinterfacecommand{determinelistcharacteristics}{bestimmelistencharakeristika}
+\setinterfacecommand{determineregistercharacteristics}{bestimmeregistercharakteristika}
+\setinterfacecommand{dimension}{dimension}
+\setinterfacecommand{disableinteractionmenu}{inaktiviereinteraktionsmenue}
+\setinterfacecommand{domicile}{wohnort}
+\setinterfacecommand{donttest}{keintest}
+\setinterfacecommand{edgedistance}{randabstand}
+\setinterfacecommand{edgewidth}{randbreite}
+\setinterfacecommand{emptylines}{emptylines}
+\setinterfacecommand{environment}{umgebung}
+\setinterfacecommand{externalfigure}{externeabbildung}
+\setinterfacecommand{fact}{geg}
+\setinterfacecommand{field}{feld}
+\setinterfacecommand{fieldstack}{feldstapel}
+\setinterfacecommand{fillinfield}{ausfuellfeld}
+\setinterfacecommand{fillinline}{gefuelltezeile}
+\setinterfacecommand{fillinrules}{gefuelltesrechteck}
+\setinterfacecommand{fillintext}{ausfuelltext}
+\setinterfacecommand{fitfield}{passendfeld}
+\setinterfacecommand{fixedspace}{festesspatium}
+\setinterfacecommand{fixedspaces}{festesspatium}
+\setinterfacecommand{followprofile}{folgeprofil}
+\setinterfacecommand{followprofileversion}{folgeprofilversion}
+\setinterfacecommand{followversion}{folgeversion}
+\setinterfacecommand{footerdistance}{fusszeileabstand}
+\setinterfacecommand{footerheight}{fusszeilenhoehe}
+\setinterfacecommand{footnote}{fussnote}
+\setinterfacecommand{footnotetext}{footnotetext}
+\setinterfacecommand{forceblocks}{forceblocks}
+\setinterfacecommand{formulanumber}{formelnummer}
+\setinterfacecommand{fraction}{bruch}
+\setinterfacecommand{framed}{umrahmt}
+\setinterfacecommand{from}{von}
+\setinterfacecommand{getbuffer}{holepuffer}
+\setinterfacecommand{getmarking}{holebeschriftung}
+\setinterfacecommand{getnumber}{getnumber}
+\setinterfacecommand{godown}{nachunten}
+\setinterfacecommand{goto}{zu}
+\setinterfacecommand{gotobox}{zurbox}
+\setinterfacecommand{gotopage}{zurseite}
+\setinterfacecommand{graycolor}{graufarbe}
+\setinterfacecommand{greyvalue}{grauwert}
+\setinterfacecommand{grid}{gitter}
+\setinterfacecommand{hairline}{haarlinie}
+\setinterfacecommand{head}{kopf}
+\setinterfacecommand{headerdistance}{kopfzeilenabstand}
+\setinterfacecommand{headerheight}{kopfzeilenhoehe}
+\setinterfacecommand{headlevel}{kopfniveau}
+\setinterfacecommand{headnumber}{kopfnummer}
+\setinterfacecommand{headsym}{headsym}
+\setinterfacecommand{headtext}{ueberschrifttext}
+\setinterfacecommand{hideblocks}{verbergebloecke}
+\setinterfacecommand{high}{hoch}
+\setinterfacecommand{hl}{hl}
+\setinterfacecommand{immediatebetweenlist}{immediatebetweenlist}
+\setinterfacecommand{immediatetolist}{immediatetolist}
+\setinterfacecommand{in}{in}
+\setinterfacecommand{incrementnumber}{nummererhoehen}
+\setinterfacecommand{indenting}{einziehen}
+\setinterfacecommand{inframed}{imumriss}
+\setinterfacecommand{infull}{volleswort}
+\setinterfacecommand{ininner}{ininner}
+\setinterfacecommand{inleft}{imlinken}
+\setinterfacecommand{inleftedge}{imlinkenrand}
+\setinterfacecommand{inleftmargin}{inlinkermarginale}
+\setinterfacecommand{inline}{inzeile}
+\setinterfacecommand{inmargin}{inmarginalie}
+\setinterfacecommand{inmframed}{immaumrise}
+\setinterfacecommand{inneredgedistance}{inneredgedistance}
+\setinterfacecommand{inneredgewidth}{inneredgewidth}
+\setinterfacecommand{innermargindistance}{innermargindistance}
+\setinterfacecommand{innermarginwidth}{innermarginwidth}
+\setinterfacecommand{inothermargin}{inanderermarginale}
+\setinterfacecommand{inouter}{inouter}
+\setinterfacecommand{inright}{imrechten}
+\setinterfacecommand{inrightedge}{imrechtenrand}
+\setinterfacecommand{inrightmargin}{inrechtermarginale}
+\setinterfacecommand{installlanguage}{installieresprache}
+\setinterfacecommand{interactionbar}{interaktionsbalken}
+\setinterfacecommand{interactionbuttons}{interaktionsknopfe}
+\setinterfacecommand{interactionmenu}{interaktionsmenue}
+\setinterfacecommand{item}{pos}
+\setinterfacecommand{items}{posten}
+\setinterfacecommand{its}{its}
+\setinterfacecommand{keepblocks}{behaltebloecke}
+\setinterfacecommand{label}{label}
+\setinterfacecommand{labels}{labels}
+\setinterfacecommand{labeltext}{labeltext}
+\setinterfacecommand{language}{sprache}
+\setinterfacecommand{leftaligned}{linksbuendig}
+\setinterfacecommand{leftedgedistance}{abstandlinkerrand}
+\setinterfacecommand{leftedgewidth}{breitelinkerrand}
+\setinterfacecommand{leftmargindistance}{linkemarginalafstand}
+\setinterfacecommand{leftmarginwidth}{linkemarginalbreite}
+\setinterfacecommand{leg}{leg}
+\setinterfacecommand{linewidth}{liniendicke}
+\setinterfacecommand{listheight}{listenhoehe}
+\setinterfacecommand{listlength}{listenlaenge}
+\setinterfacecommand{listsymbol}{listsymbol}
+\setinterfacecommand{listwidth}{listenbreite}
+\setinterfacecommand{logfields}{registrierefelder}
+\setinterfacecommand{lohi}{tiho}
+\setinterfacecommand{low}{tief}
+\setinterfacecommand{macroname}{name}
+\setinterfacecommand{mainlanguage}{hauptsprache}
+\setinterfacecommand{makeupheight}{satzhoehe}
+\setinterfacecommand{makeupwidth}{satzbreite}
+\setinterfacecommand{mar}{mar}
+\setinterfacecommand{margindistance}{marginalafstand}
+\setinterfacecommand{marginrule}{marginallinie}
+\setinterfacecommand{margintext}{marginaltext}
+\setinterfacecommand{margintitle}{marginaltitel}
+\setinterfacecommand{marginwidth}{marginalbreite}
+\setinterfacecommand{marginword}{marginalwort}
+\setinterfacecommand{marking}{beschriftung}
+\setinterfacecommand{markversion}{beschrifteversion}
+\setinterfacecommand{mathematics}{mathematik}
+\setinterfacecommand{menubutton}{menueknopf}
+\setinterfacecommand{mframed}{maumrise}
+\setinterfacecommand{midaligned}{zentriert}
+\setinterfacecommand{mirror}{spiegeln}
+\setinterfacecommand{month}{monat}
+\setinterfacecommand{moveformula}{moveformula}
+\setinterfacecommand{moveongrid}{amgitterneuausrichten}
+\setinterfacecommand{movesidefloat}{movesidefloat}
+\setinterfacecommand{navigating}{navigating}
+\setinterfacecommand{nodimension}{keindimension}
+\setinterfacecommand{noheaderandfooterlines}{keinekopfundfusszeilen}
+\setinterfacecommand{noindenting}{nichteinziehen}
+\setinterfacecommand{nolist}{keineliste}
+\setinterfacecommand{nomarking}{keinebeschriftung}
+\setinterfacecommand{nomoreblocks}{keinebloeckemehr}
+\setinterfacecommand{nomorefiles}{keinedateienmehr}
+\setinterfacecommand{nop}{nop}
+\setinterfacecommand{nospace}{keinspatium}
+\setinterfacecommand{note}{notiz}
+\setinterfacecommand{notopandbottomlines}{keinzeilenobenundunten}
+\setinterfacecommand{notsmallcapped}{nokap}
+\setinterfacecommand{nowhitespace}{keinzwischenraum}
+\setinterfacecommand{numberofsubpages}{numberofsubpages}
+\setinterfacecommand{numbers}{ziffern}
+\setinterfacecommand{outeredgedistance}{outeredgedistance}
+\setinterfacecommand{outeredgewidth}{outeredgewidth}
+\setinterfacecommand{outermargindistance}{outermargindistance}
+\setinterfacecommand{outermarginwidth}{outermarginwidth}
+\setinterfacecommand{overbar}{ueberstrichen}
+\setinterfacecommand{overbars}{ueberstreichen}
+\setinterfacecommand{overstrike}{durchgestrichen}
+\setinterfacecommand{overstrikes}{durchstreichen}
+\setinterfacecommand{packed}{kleinerdurchschuss}
+\setinterfacecommand{page}{seite}
+\setinterfacecommand{pagedepth}{pagedepth}
+\setinterfacecommand{pagenumber}{seitenummer}
+\setinterfacecommand{pageoffset}{pageoffset}
+\setinterfacecommand{pagereference}{seitenreferenz}
+\setinterfacecommand{pagetype}{seitentyp}
+\setinterfacecommand{paperheight}{papierhoehe}
+\setinterfacecommand{paperwidth}{papierbreite}
+\setinterfacecommand{periods}{punkt}
+\setinterfacecommand{plaatsruwelijst}{placerawlist}
+\setinterfacecommand{placebookmarks}{platzierebookmarks}
+\setinterfacecommand{placecombinedlist}{platzierezusammengestellteliste}
+\setinterfacecommand{placefloat}{placefloat}
+\setinterfacecommand{placefootnotes}{platzierefussnoten}
+\setinterfacecommand{placeformula}{platziereformel}
+\setinterfacecommand{placeheadnumber}{placeheadnumber}
+\setinterfacecommand{placeheadtext}{placeheadtext}
+\setinterfacecommand{placelegend}{platzierelegende}
+\setinterfacecommand{placelist}{platziereliste}
+\setinterfacecommand{placelocalfootnotes}{platzierelokalefussnoten}
+\setinterfacecommand{placelogos}{platzierelogo}
+\setinterfacecommand{placeongrid}{amgitterausrichten}
+\setinterfacecommand{placeontopofeachother}{platziereuntereinander}
+\setinterfacecommand{placepagenumber}{placepagenumber}
+\setinterfacecommand{placereferencelist}{placereferencelist}
+\setinterfacecommand{placeregister}{platziereregister}
+\setinterfacecommand{placerule}{placerule}
+\setinterfacecommand{placesidebyside}{platzierenebeneinander}
+\setinterfacecommand{placesubformula}{platziereunterformel}
+\setinterfacecommand{placetextvariable}{placetextvariable}
+\setinterfacecommand{position}{position}
+\setinterfacecommand{positiontext}{positiontext}
+\setinterfacecommand{printpaperheight}{printpapierhoehe}
+\setinterfacecommand{printpaperwidth}{printpapierbreite}
+\setinterfacecommand{processblocks}{bearbeitebloecke}
+\setinterfacecommand{processpage}{bearbeiteseite}
+\setinterfacecommand{product}{produkt}
+\setinterfacecommand{program}{programm}
+\setinterfacecommand{project}{projekt}
+\setinterfacecommand{publication}{publikation}
+\setinterfacecommand{quotation}{zitat}
+\setinterfacecommand{quote}{zitieren}
+\setinterfacecommand{ran}{ran}
+\setinterfacecommand{redo}{wiederholen}
+\setinterfacecommand{ref}{ref}
+\setinterfacecommand{reference}{referenz}
+\setinterfacecommand{referral}{verweis}
+\setinterfacecommand{referraldate}{verweisdatum}
+\setinterfacecommand{referring}{referieren}
+\setinterfacecommand{remark}{bemerkung}
+\setinterfacecommand{reset}{ruecksetzten}
+\setinterfacecommand{resetmarking}{ruecksetztenbeschriftung}
+\setinterfacecommand{resetnumber}{resetnumber}
+\setinterfacecommand{resettext}{resettextcontent}
+\setinterfacecommand{rightaligned}{rechtsbuendig}
+\setinterfacecommand{rightedgedistance}{abstandrechterrand}
+\setinterfacecommand{rightedgewidth}{breiterechterrand}
+\setinterfacecommand{rightmargindistance}{rechtemarginalafstand}
+\setinterfacecommand{rightmarginwidth}{rechtemarginalbreite}
+\setinterfacecommand{romannumerals}{roemischezahlen}
+\setinterfacecommand{rotate}{drehen}
+\setinterfacecommand{scale}{format}
+\setinterfacecommand{screen}{bildschirm}
+\setinterfacecommand{selectblocks}{waehlebloeckeaus}
+\setinterfacecommand{selectpaper}{waehlepapieraus}
+\setinterfacecommand{selectversion}{waehleversionaus}
+\setinterfacecommand{setnumber}{setnumber}
+\setinterfacecommand{settextcontent}{settext}
+\setinterfacecommand{settextvariable}{settextvariable}
+\setinterfacecommand{setupalign}{stelleausrichtungein}
+\setinterfacecommand{setuparranging}{stelleanordnenein}
+\setinterfacecommand{setupbackground}{stellehintergrundein}
+\setinterfacecommand{setupbackgrounds}{stellehintergruendeein}
+\setinterfacecommand{setupblackrules}{stellerechteckein}
+\setinterfacecommand{setupblank}{stelleblankoein}
+\setinterfacecommand{setupblock}{stelleblockein}
+\setinterfacecommand{setupbodyfont}{stellefliesstextein}
+\setinterfacecommand{setupbodyfontenvironment}{stellefliesstextumgebungein}
+\setinterfacecommand{setupbottom}{stelleuntenein}
+\setinterfacecommand{setupbottomtexts}{stelletextuntenein}
+\setinterfacecommand{setupbuffer}{stellepufferein}
+\setinterfacecommand{setupbuttons}{stelleknopfein}
+\setinterfacecommand{setupcapitals}{stelleversalienein}
+\setinterfacecommand{setupcaption}{stellebildunterschriftein}
+\setinterfacecommand{setupcaptions}{stellebilderunterschriftein}
+\setinterfacecommand{setupclipping}{stelleausschnittein}
+\setinterfacecommand{setupcolor}{stellefarbeein}
+\setinterfacecommand{setupcolors}{stellefarbenein}
+\setinterfacecommand{setupcolumns}{stellespaltenein}
+\setinterfacecommand{setupcolumnset}{setupcolumnset}
+\setinterfacecommand{setupcolumnsetlines}{setupcolumnsetlines}
+\setinterfacecommand{setupcolumnsetstart}{setupcolumnsetstart}
+\setinterfacecommand{setupcombinations}{stellekombinationein}
+\setinterfacecommand{setupcombinedlist}{stellezusammengestelltelisteein}
+\setinterfacecommand{setupcomment}{stellekommentarein}
+\setinterfacecommand{setupdescriptions}{definierebeschreibungen}
+\setinterfacecommand{setupenumerations}{stellebeschreibungein}
+\setinterfacecommand{setupexternalfigures}{stelleexterneabbildungenein}
+\setinterfacecommand{setupfield}{stellefeldein}
+\setinterfacecommand{setupfields}{stellefelderin}
+\setinterfacecommand{setupfillinlines}{stellegefuelltezeileein}
+\setinterfacecommand{setupfillinrules}{stellegefuelltesrechteckein}
+\setinterfacecommand{setupfloat}{stellegleitobjektein}
+\setinterfacecommand{setupfloats}{stellegleitobjekteein}
+\setinterfacecommand{setupfloatsplitting}{stelleplatziegeteiltegleitobjekt}
+\setinterfacecommand{setupfooter}{stellefusszeileein}
+\setinterfacecommand{setupfootertexts}{stellefusszeilentextein}
+\setinterfacecommand{setupfootnotedefinition}{stellefussnotendefinitionein}
+\setinterfacecommand{setupfootnotes}{stellefussnotenein}
+\setinterfacecommand{setupforms}{setupforms}
+\setinterfacecommand{setupformulas}{stelleformelnein}
+\setinterfacecommand{setupframed}{stelleumrahmtein}
+\setinterfacecommand{setupframedtexts}{stelleumrahmtetexteein}
+\setinterfacecommand{setuphead}{stelleueberschriftein}
+\setinterfacecommand{setupheader}{stellekopfzeileein}
+\setinterfacecommand{setupheadertexts}{stellekopfzeilentextein}
+\setinterfacecommand{setupheadnumber}{stellekopfzahlein}
+\setinterfacecommand{setupheads}{stelleueberschriftenein}
+\setinterfacecommand{setupheadtext}{stelleueberschrifttextein}
+\setinterfacecommand{setuphyphenmark}{stellebindestrichein}
+\setinterfacecommand{setupindentations}{stelleeinzuegein}
+\setinterfacecommand{setupindenting}{stelleeinziehenein}
+\setinterfacecommand{setupinmargin}{stelleinmarginalieein}
+\setinterfacecommand{setupinteraction}{stelleinteraktionein}
+\setinterfacecommand{setupinteractionbar}{stelleinteraktionsbalkenein}
+\setinterfacecommand{setupinteractionmenu}{stelleinteraktionsmenueein}
+\setinterfacecommand{setupinteractionscreen}{stelleinteraktionsbildschirmein}
+\setinterfacecommand{setupinterlinespace}{stellezeilenabstandein}
+\setinterfacecommand{setupitemgroup}{setupitemgroup}
+\setinterfacecommand{setupitemgroups}{stelleaufzaehlungenein}
+\setinterfacecommand{setupitems}{stellepostenein}
+\setinterfacecommand{setuplabeltext}{stellelabeltextein}
+\setinterfacecommand{setuplanguage}{stellespracheein}
+\setinterfacecommand{setuplayout}{stellelayoutein}
+\setinterfacecommand{setuplegend}{stellelegendeein}
+\setinterfacecommand{setuplinenumbering}{stellezeilennumerierungein}
+\setinterfacecommand{setuplines}{stellezeilenein}
+\setinterfacecommand{setuplinewidth}{stellelinienbreiteein}
+\setinterfacecommand{setuplist}{stellelisteein}
+\setinterfacecommand{setupmakeup}{stelleumbruchein}
+\setinterfacecommand{setupmarginblocks}{stellemarginalblockein}
+\setinterfacecommand{setupmarginrules}{stellemarginallinieein}
+\setinterfacecommand{setupmarking}{stellebeschriftungein}
+\setinterfacecommand{setupmathalignment}{setupmathalignment}
+\setinterfacecommand{setupnarrower}{stelleengerein}
+\setinterfacecommand{setupnumber}{setupnumber}
+\setinterfacecommand{setupnumbering}{stellenummerierungein}
+\setinterfacecommand{setupoppositeplacing}{stellegegenueberplatzierenein}
+\setinterfacecommand{setupoutput}{stelleausgabeein}
+\setinterfacecommand{setuppagecomment}{stelleseitenkommentarein}
+\setinterfacecommand{setuppagenumber}{stelleseitennummerein}
+\setinterfacecommand{setuppagenumbering}{stelleseitennummeriernungein}
+\setinterfacecommand{setuppagetransitions}{stelleseitenuebergangein}
+\setinterfacecommand{setuppalet}{stellepaletteein}
+\setinterfacecommand{setuppaper}{setuppaper}
+\setinterfacecommand{setuppapersize}{stellepapierformatein}
+\setinterfacecommand{setupparagraphnumbering}{stelleabsatznummerierungein}
+\setinterfacecommand{setupparagraphs}{stelleabsaetzeein}
+\setinterfacecommand{setupplacement}{setupplacement}
+\setinterfacecommand{setuppositioning}{stellepositionierenein}
+\setinterfacecommand{setupprofiles}{stelleprofilein}
+\setinterfacecommand{setupprograms}{stelleprogrammein}
+\setinterfacecommand{setuppublications}{stellepublikationein}
+\setinterfacecommand{setupquote}{stellezitierenein}
+\setinterfacecommand{setupreferencelist}{stellereferenzlisteein}
+\setinterfacecommand{setupreferencing}{stellereferenzierenein}
+\setinterfacecommand{setupregister}{stelleregisterein}
+\setinterfacecommand{setuprotate}{stelledrehenein}
+\setinterfacecommand{setuprule}{setuprule}
+\setinterfacecommand{setups}{einstellungen}
+\setinterfacecommand{setupscreens}{stellerasterein}
+\setinterfacecommand{setupsection}{stelleabschnittein}
+\setinterfacecommand{setupsectionblock}{stelleabschnittsblockein}
+\setinterfacecommand{setupsorting}{stellesortierenein}
+\setinterfacecommand{setupspacing}{stellespatiumein}
+\setinterfacecommand{setupstartstop}{setupstartstop}
+\setinterfacecommand{setupstrut}{setupstrut}
+\setinterfacecommand{setupsubpagenumber}{stelleunterseitennummerein}
+\setinterfacecommand{setupsymbolset}{stellesymbolsetein}
+\setinterfacecommand{setupsynchronization}{stellesynchronisationein}
+\setinterfacecommand{setupsynchronizationbar}{stellesynchronisationsbalkenein}
+\setinterfacecommand{setupsynonyms}{stellesynonymein}
+\setinterfacecommand{setupsystem}{stellesystemein}
+\setinterfacecommand{setuptab}{stelletabein}
+\setinterfacecommand{setuptables}{stelletabellenein}
+\setinterfacecommand{setuptabulate}{stelletabulatorein}
+\setinterfacecommand{setuptext}{stelletextein}
+\setinterfacecommand{setuptextposition}{setuptextposition}
+\setinterfacecommand{setuptextrules}{stelletextumrissein}
+\setinterfacecommand{setuptexttexts}{stelletexttexteein}
+\setinterfacecommand{setuptextvariable}{setuptextvariable}
+\setinterfacecommand{setupthinrules}{stelleduennerumrissein}
+\setinterfacecommand{setuptolerance}{stelletoleranzein}
+\setinterfacecommand{setuptop}{stellenobenein}
+\setinterfacecommand{setuptoptexts}{stelletextobenein}
+\setinterfacecommand{setuptype}{stelletipein}
+\setinterfacecommand{setuptyping}{stelletippenein}
+\setinterfacecommand{setupunderbar}{stelleunterstreichenein}
+\setinterfacecommand{setupurl}{stelleurlein}
+\setinterfacecommand{setupversions}{stelleversionein}
+\setinterfacecommand{setupwhitespace}{stellezwischenraumein}
+\setinterfacecommand{showbodyfont}{zeigefliesstext}
+\setinterfacecommand{showbodyfontenvironment}{zeigefliesstextumgebung}
+\setinterfacecommand{showcolor}{zeigefarbe}
+\setinterfacecommand{showcolorgroup}{zeigefarbengruppe}
+\setinterfacecommand{showexternalfigures}{zeigeexterneabbildungen}
+\setinterfacecommand{showfields}{zeigefelder}
+\setinterfacecommand{showframe}{zeigerahmen}
+\setinterfacecommand{showgrid}{zeigegitter}
+\setinterfacecommand{showlayout}{zeigelayout}
+\setinterfacecommand{showmakeup}{zeigeumbruch}
+\setinterfacecommand{showpalet}{zeigepalette}
+\setinterfacecommand{showprint}{zeigedruck}
+\setinterfacecommand{showsetups}{zeigeeinstellungen}
+\setinterfacecommand{showstruts}{zeigestruts}
+\setinterfacecommand{showsymbolset}{showsymbolset}
+\setinterfacecommand{smallcapped}{kap}
+\setinterfacecommand{someline}{einezeile}
+\setinterfacecommand{somewhere}{irgendwo}
+\setinterfacecommand{space}{spatium}
+\setinterfacecommand{splitfloat}{teilegleitobjekt}
+\setinterfacecommand{startalignment}{startausrichtung}
+\setinterfacecommand{startbackground}{starthintergrund}
+\setinterfacecommand{startcoding}{startkodierung}
+\setinterfacecommand{startcolor}{startfarbe}
+\setinterfacecommand{startcolumnmakeup}{startcolumnmakeup}
+\setinterfacecommand{startcolumns}{startspalten}
+\setinterfacecommand{startcolumnset}{startcolumnset}
+\setinterfacecommand{startcombination}{startkombination}
+\setinterfacecommand{startcomponent}{startkomponente}
+\setinterfacecommand{startdocument}{startdokument}
+\setinterfacecommand{startenvironment}{startumgebung}
+\setinterfacecommand{startfigure}{startabbildung}
+\setinterfacecommand{startglobal}{startglobal}
+\setinterfacecommand{startline}{startzeile}
+\setinterfacecommand{startlinecorrection}{startzeilenkorrektur}
+\setinterfacecommand{startlinenumbering}{startzeilennumerierung}
+\setinterfacecommand{startlines}{startzeilen}
+\setinterfacecommand{startlocal}{startlokal}
+\setinterfacecommand{startlocalfootnotes}{startlokalefussnoten}
+\setinterfacecommand{startmakeup}{startumbruch}
+\setinterfacecommand{startmarginblock}{startmarginalblock}
+\setinterfacecommand{startmarginrule}{startmarginallinie}
+\setinterfacecommand{startnarrower}{startenger}
+\setinterfacecommand{startopposite}{startgegenueber}
+\setinterfacecommand{startoverlay}{startoverlay}
+\setinterfacecommand{startoverzicht}{startueberblick}
+\setinterfacecommand{startpacked}{startkleinerdurchschuss}
+\setinterfacecommand{startpositioning}{startpositionieren}
+\setinterfacecommand{startproduct}{startprodukt}
+\setinterfacecommand{startprofile}{startprofil}
+\setinterfacecommand{startproject}{startprojekt}
+\setinterfacecommand{startquotation}{startzitat}
+\setinterfacecommand{startraster}{startraster}
+\setinterfacecommand{startsymbolset}{startsymbolset}
+\setinterfacecommand{startsynchronization}{startsynchronisation}
+\setinterfacecommand{starttable}{starttabelle}
+\setinterfacecommand{starttables}{starttabellen}
+\setinterfacecommand{starttext}{starttext}
+\setinterfacecommand{starttextrule}{starttextlinie}
+\setinterfacecommand{startunpacked}{startgrosserdurchschuss}
+\setinterfacecommand{startversion}{startversion}
+\setinterfacecommand{stopalignment}{stopausrichtung}
+\setinterfacecommand{stopbackground}{stophintergrund}
+\setinterfacecommand{stopcoding}{stopkodierung}
+\setinterfacecommand{stopcolor}{stopfarbe}
+\setinterfacecommand{stopcolumnmakeup}{stopcolumnmakeup}
+\setinterfacecommand{stopcolumns}{stopspalten}
+\setinterfacecommand{stopcolumnset}{stopcolumnset}
+\setinterfacecommand{stopcombination}{stopkombination}
+\setinterfacecommand{stopcomponent}{stopkomponente}
+\setinterfacecommand{stopdocument}{stopdokument}
+\setinterfacecommand{stopenvironment}{stopumgebung}
+\setinterfacecommand{stopglobal}{stopglobal}
+\setinterfacecommand{stopline}{stopzeile}
+\setinterfacecommand{stoplinecorrection}{stopzeilenkorrektur}
+\setinterfacecommand{stoplinenumbering}{stopzeilennumerierung}
+\setinterfacecommand{stoplines}{stopzeilen}
+\setinterfacecommand{stoplocal}{stoplokal}
+\setinterfacecommand{stoplocalfootnotes}{stoplokalefussnoten}
+\setinterfacecommand{stopmakeup}{stopumbruch}
+\setinterfacecommand{stopmarginblock}{stopmarginalblock}
+\setinterfacecommand{stopmarginrule}{stopmarginallinie}
+\setinterfacecommand{stopnarrower}{stopenger}
+\setinterfacecommand{stopopposite}{stopgegenueber}
+\setinterfacecommand{stopoverlay}{stopoverlay}
+\setinterfacecommand{stopoverzicht}{stopueberblick}
+\setinterfacecommand{stoppacked}{stopkleinerdurchschuss}
+\setinterfacecommand{stoppositioning}{stoppositionieren}
+\setinterfacecommand{stopproduct}{stopprodukt}
+\setinterfacecommand{stopprofile}{stopprofil}
+\setinterfacecommand{stopproject}{stopprojekt}
+\setinterfacecommand{stopquotation}{stopzitat}
+\setinterfacecommand{stopraster}{stopraster}
+\setinterfacecommand{stopsynchronization}{stopsynchronisation}
+\setinterfacecommand{stoptable}{stoptabelle}
+\setinterfacecommand{stoptables}{stoptabellen}
+\setinterfacecommand{stoptext}{stoptext}
+\setinterfacecommand{stoptextrule}{stoptextlinie}
+\setinterfacecommand{stopunpacked}{stopgrosserdurchschuss}
+\setinterfacecommand{stopversion}{stopversion}
+\setinterfacecommand{stretched}{gestreckt}
+\setinterfacecommand{subformulanumber}{unterformelnummer}
+\setinterfacecommand{subpagenumber}{subpagenumber}
+\setinterfacecommand{switchtobodyfont}{wechselezumfliesstext}
+\setinterfacecommand{switchtorawfont}{switchtorawfont}
+\setinterfacecommand{sym}{sym}
+\setinterfacecommand{symbol}{symbol}
+\setinterfacecommand{synchronizationbar}{synchronisationsbalken}
+\setinterfacecommand{synchronize}{synchronisieren}
+\setinterfacecommand{tab}{tab}
+\setinterfacecommand{testcolumn}{testcolumn}
+\setinterfacecommand{testpage}{testpage}
+\setinterfacecommand{tex}{tex}
+\setinterfacecommand{textheight}{texthoehe}
+\setinterfacecommand{textreference}{textreferenz}
+\setinterfacecommand{textrule}{textlinie}
+\setinterfacecommand{textvariable}{textvariable}
+\setinterfacecommand{textwidth}{textbreite}
+\setinterfacecommand{thinrule}{duennelinie}
+\setinterfacecommand{thinrules}{duennerumriss}
+\setinterfacecommand{tooltip}{tooltip}
+\setinterfacecommand{topdistance}{abstandoben}
+\setinterfacecommand{topheight}{hoeheoben}
+\setinterfacecommand{topspace}{kopfweite}
+\setinterfacecommand{totalnumberofpages}{gesamtseitenanzahl}
+\setinterfacecommand{translate}{uebersetzten}
+\setinterfacecommand{txt}{txt}
+\setinterfacecommand{typ}{tip}
+\setinterfacecommand{type}{tippen}
+\setinterfacecommand{typebuffer}{tippepuffer}
+\setinterfacecommand{typefile}{tippedatei}
+\setinterfacecommand{underbar}{unterstrichen}
+\setinterfacecommand{underbars}{unterstreichen}
+\setinterfacecommand{unitmeaning}{bedeutung}
+\setinterfacecommand{unknown}{unbekant}
+\setinterfacecommand{useJSscripts}{verwendeJSscript}
+\setinterfacecommand{useURL}{verwendeURL}
+\setinterfacecommand{useXMLfilter}{useXMLfilter}
+\setinterfacecommand{useblocks}{verwendebloecke}
+\setinterfacecommand{usecommands}{verwendebefehl}
+\setinterfacecommand{useencoding}{benutzekodierung}
+\setinterfacecommand{useexternaldocument}{verwendeexteresdokument}
+\setinterfacecommand{useexternalfigure}{verwendeexterneabbildung}
+\setinterfacecommand{useexternalfile}{verwendeexternedatei}
+\setinterfacecommand{useexternalfiles}{verwendeexternedateien}
+\setinterfacecommand{useexternalsoundtrack}{verwendeexternestonstueck}
+\setinterfacecommand{usemodule}{verwendemodul}
+\setinterfacecommand{usemodules}{verwendemodule}
+\setinterfacecommand{usepath}{benutzeverzeichnis}
+\setinterfacecommand{usereferences}{verwendereferenzen}
+\setinterfacecommand{usespecials}{benutzespezielles}
+\setinterfacecommand{usesymbols}{verwendesymbole}
+\setinterfacecommand{usetypescript}{usetypescript}
+\setinterfacecommand{usetypescriptfile}{usetypescriptfile}
+\setinterfacecommand{useurl}{verwendeurl}
+\setinterfacecommand{version}{version}
+\setinterfacecommand{vl}{vl}
+\setinterfacecommand{weekday}{wochentag}
+\setinterfacecommand{whitespace}{zwischenraum}
+\setinterfacecommand{wordright}{wortrechts}
+\setinterfacecommand{writebetweenlist}{schreibezwischenliste}
+\setinterfacecommand{writetolist}{schreibezurliste}
+\setinterfacecommand{writetoreferencelist}{schreibezurreferenzliste}
+\setinterfacecommand{writetoregister}{schreibezumregister}
+%
+\endinput
\ No newline at end of file
diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua
new file mode 100644
index 000000000..b0999fd2e
--- /dev/null
+++ b/tex/context/base/mult-def.lua
@@ -0,0 +1,15651 @@
+return {
+ ["commands"]={
+ ["CAPPED"]={
+ ["cs"]="KAP",
+ ["de"]="KAP",
+ ["en"]="CAP",
+ ["fr"]="CAP",
+ ["it"]="CAP",
+ ["nl"]="KAP",
+ ["pe"]="CAP",
+ ["ro"]="KAP",
+ },
+ ["Character"]={
+ ["cs"]="Znak",
+ ["de"]="Buchstabe",
+ ["en"]="Character",
+ ["fr"]="Caractere",
+ ["it"]="Lettera",
+ ["nl"]="Letter",
+ ["pe"]="Character",
+ ["ro"]="Litera",
+ },
+ ["Characters"]={
+ ["cs"]="Znaky",
+ ["de"]="Buchstaben",
+ ["en"]="Characters",
+ ["fr"]="Caracteres",
+ ["it"]="Lettere",
+ ["nl"]="Letters",
+ ["pe"]="Characters",
+ ["ro"]="Litere",
+ },
+ ["LABELTEXT"]={
+ ["cs"]="TEXTPOPISKU",
+ ["de"]="LABELTEXT",
+ ["en"]="LABELTEXT",
+ ["fr"]="LABELTEXTE",
+ ["it"]="TESTOETICHETTA",
+ ["nl"]="LABELTEKST",
+ ["pe"]="LABELTEXT",
+ ["ro"]="TEXTETICHETA",
+ },
+ ["MONTH"]={
+ ["cs"]="MESIC",
+ ["de"]="MONAT",
+ ["en"]="MONTH",
+ ["fr"]="MOIS",
+ ["it"]="MESE",
+ ["nl"]="MAAND",
+ ["pe"]="MONTH",
+ ["ro"]="LUNA",
+ },
+ ["Numbers"]={
+ ["cs"]="Cisla",
+ ["de"]="Ziffern",
+ ["en"]="Numbers",
+ ["fr"]="Numeros",
+ ["it"]="Numeri",
+ ["nl"]="Cijfers",
+ ["pe"]="Numbers",
+ ["ro"]="Numere",
+ },
+ ["Romannumerals"]={
+ ["cs"]="Rimskecislice",
+ ["de"]="Roemischezahlen",
+ ["en"]="Romannumerals",
+ ["fr"]="Chiffresromains",
+ ["it"]="Numeriromani",
+ ["nl"]="Romeins",
+ ["pe"]="Romannumerals",
+ ["ro"]="Numereromane",
+ },
+ ["SmallCapped"]={
+ ["cs"]="Kap",
+ ["de"]="Kap",
+ ["en"]="Cap",
+ ["fr"]="Cap",
+ ["it"]="Cap",
+ ["nl"]="Kap",
+ ["pe"]="Cap",
+ ["ro"]="Kap",
+ },
+ ["SmallCaps"]={
+ ["cs"]="Kaps",
+ ["de"]="Kaps",
+ ["en"]="Caps",
+ ["fr"]="Caps",
+ ["it"]="Caps",
+ ["nl"]="Kaps",
+ ["pe"]="Caps",
+ ["ro"]="Kaps",
+ },
+ ["WEEKDAY"]={
+ ["cs"]="VSEDNIDEN",
+ ["de"]="WOCHENTAG",
+ ["en"]="WEEKDAY",
+ ["fr"]="JOURSEMAINE",
+ ["it"]="GIORNOSETTIMANA",
+ ["nl"]="WEEKDAG",
+ ["pe"]="WEEKDAY",
+ ["ro"]="ZIDINSAPTAMANA",
+ },
+ ["WORD"]={
+ ["cs"]="SLOVO",
+ ["de"]="WORT",
+ ["en"]="WORD",
+ ["fr"]="MOT",
+ ["it"]="PAROLA",
+ ["nl"]="WOORD",
+ ["pe"]="WORD",
+ ["ro"]="CUVANT",
+ },
+ ["WORDS"]={
+ ["cs"]="SLOVA",
+ ["de"]="WOERTER",
+ ["en"]="WORDS",
+ ["fr"]="MOTS",
+ ["it"]="PAROLE",
+ ["nl"]="WOORDEN",
+ ["pe"]="WORDS",
+ ["ro"]="CUVINTE",
+ },
+ ["Word"]={
+ ["cs"]="Slovo",
+ ["de"]="Wort",
+ ["en"]="Word",
+ ["fr"]="Mot",
+ ["it"]="Parola",
+ ["nl"]="Woord",
+ ["pe"]="Word",
+ ["ro"]="Cuvant",
+ },
+ ["Words"]={
+ ["cs"]="Slova",
+ ["de"]="Woerter",
+ ["en"]="Words",
+ ["fr"]="Mots",
+ ["it"]="Parole",
+ ["nl"]="Woorden",
+ ["pe"]="Words",
+ ["ro"]="Cuvinte",
+ },
+ ["about"]={
+ ["cs"]="oref",
+ ["de"]="ueber",
+ ["en"]="about",
+ ["fr"]="concernant",
+ ["it"]="intorno",
+ ["nl"]="about",
+ ["pe"]="درمورد",
+ ["ro"]="despre",
+ },
+ ["adaptlayout"]={
+ ["cs"]="prizpusobvzhled",
+ ["de"]="passelayoutan",
+ ["en"]="adaptlayout",
+ ["fr"]="adaptedisposition",
+ ["it"]="adattalayout",
+ ["nl"]="paslayoutaan",
+ ["pe"]="تنظیم‌طرØ‌بندی",
+ ["ro"]="adapteazaaspect",
+ },
+ ["adding"]={},
+ ["arg"]={
+ ["cs"]="arg",
+ ["de"]="arg",
+ ["en"]="arg",
+ ["fr"]="arg",
+ ["it"]="arg",
+ ["nl"]="arg",
+ ["pe"]="اÙزودن",
+ ["ro"]="arg",
+ },
+ ["at"]={
+ ["cs"]="pref",
+ ["de"]="bei",
+ ["en"]="at",
+ ["fr"]="a",
+ ["it"]="al",
+ ["nl"]="op",
+ ["pe"]="در",
+ ["ro"]="la",
+ },
+ ["atleftmargin"]={
+ ["cs"]="atleftmargin",
+ ["de"]="atleftmargin",
+ ["en"]="atleftmargin",
+ ["fr"]="atleftmargin",
+ ["it"]="atleftmargin",
+ ["nl"]="oplinkermarge",
+ ["pe"]="درØاشیه‌چپ",
+ ["ro"]="atleftmargin",
+ },
+ ["atpage"]={
+ ["cs"]="nastrane",
+ ["de"]="aufseite",
+ ["en"]="atpage",
+ ["fr"]="alapage",
+ ["it"]="apagina",
+ ["nl"]="oppagina",
+ ["pe"]="درصÙØÙ‡",
+ ["ro"]="lapagina",
+ },
+ ["atrightmargin"]={
+ ["cs"]="atrightmargin",
+ ["de"]="atrightmargin",
+ ["en"]="atrightmargin",
+ ["fr"]="atrightmargin",
+ ["it"]="atrightmargin",
+ ["nl"]="oprechtermarge",
+ ["pe"]="درØاشیه‌راست",
+ ["ro"]="atrightmargin",
+ },
+ ["background"]={
+ ["cs"]="pozadi",
+ ["de"]="hintergrund",
+ ["en"]="background",
+ ["fr"]="arriereplan",
+ ["it"]="sfondo",
+ ["nl"]="achtergrond",
+ ["pe"]="پس‌زمینه",
+ ["ro"]="fundal",
+ },
+ ["backspace"]={
+ ["cs"]="odsazenizleva",
+ ["de"]="rumpfweite",
+ ["en"]="backspace",
+ ["fr"]="retourarriere",
+ ["it"]="spaziodietro",
+ ["nl"]="rugwit",
+ ["pe"]="Ùاصله‌پشت",
+ ["ro"]="spatiuspate",
+ },
+ ["blackrule"]={
+ ["cs"]="cernalinka",
+ ["de"]="rechteck",
+ ["en"]="blackrule",
+ ["fr"]="lignenoire",
+ ["it"]="lineanera",
+ ["nl"]="blokje",
+ ["pe"]="خط‌سیاه",
+ ["ro"]="linieneagra",
+ },
+ ["blackrules"]={
+ ["cs"]="cernelinky",
+ ["de"]="rechtecke",
+ ["en"]="blackrules",
+ ["fr"]="lignesnoires",
+ ["it"]="lineenere",
+ ["nl"]="blokjes",
+ ["pe"]="خطهای‌سیاه",
+ ["ro"]="liniinegre",
+ },
+ ["blank"]={
+ ["cs"]="preskoc",
+ ["de"]="blanko",
+ ["en"]="blank",
+ ["fr"]="vide",
+ ["it"]="rigovuoto",
+ ["nl"]="blanko",
+ ["pe"]="خالی",
+ ["ro"]="blanc",
+ },
+ ["bookmark"]={
+ ["cs"]="zalozka",
+ ["de"]="bookmark",
+ ["en"]="bookmark",
+ ["fr"]="marquepage",
+ ["it"]="segnalibro",
+ ["nl"]="bookmark",
+ ["pe"]="چوبخط",
+ ["ro"]="semncarte",
+ },
+ ["bottomdistance"]={
+ ["cs"]="vzdalenostspodku",
+ ["de"]="abstandunten",
+ ["en"]="bottomdistance",
+ ["fr"]="distanceinf",
+ ["it"]="distanzafondo",
+ ["nl"]="onderafstand",
+ ["pe"]="Ùاصله‌پایین",
+ ["ro"]="distantajos",
+ },
+ ["bottomheight"]={
+ ["cs"]="vyskaspodku",
+ ["de"]="hoeheunten",
+ ["en"]="bottomheight",
+ ["fr"]="hauteurinf",
+ ["it"]="altezzafondo",
+ ["nl"]="onderhoogte",
+ ["pe"]="ارتÙاع‌پایین",
+ ["ro"]="inaltimejos",
+ },
+ ["bottomspace"]={
+ ["cs"]="bottomspace",
+ ["de"]="bottomspace",
+ ["en"]="bottomspace",
+ ["fr"]="espaceinf",
+ ["it"]="spaziofondo",
+ ["nl"]="bodemwit",
+ ["pe"]="Ùضای‌پایین",
+ ["ro"]="spatiujos",
+ },
+ ["but"]={
+ ["cs"]="spodek",
+ ["de"]="but",
+ ["en"]="but",
+ ["fr"]="but",
+ ["it"]="fondo",
+ ["nl"]="but",
+ ["pe"]="اما",
+ ["ro"]="but",
+ },
+ ["button"]={
+ ["cs"]="tlacitko",
+ ["de"]="knopf",
+ ["en"]="button",
+ ["fr"]="bouton",
+ ["it"]="pulsante",
+ ["nl"]="button",
+ ["pe"]="دکمه",
+ ["ro"]="buton",
+ },
+ ["bypassblocks"]={
+ ["cs"]="bypassblocks",
+ ["de"]="bypassblocks",
+ ["en"]="bypassblocks",
+ ["fr"]="sauteblocs",
+ ["it"]="saltablocchi",
+ ["nl"]="passeerblokken",
+ ["pe"]="عبوربلوکها",
+ ["ro"]="saripesteblocuri",
+ },
+ ["character"]={
+ ["cs"]="znak",
+ ["de"]="buchstabe",
+ ["en"]="character",
+ ["fr"]="caractere",
+ ["it"]="lettera",
+ ["nl"]="letter",
+ ["pe"]="ØرÙ",
+ ["ro"]="litera",
+ },
+ ["characters"]={
+ ["cs"]="znaky",
+ ["de"]="buchstaben",
+ ["en"]="characters",
+ ["fr"]="caracteres",
+ ["it"]="lettere",
+ ["nl"]="letters",
+ ["pe"]="ØرÙها",
+ ["ro"]="litere",
+ },
+ ["chem"]={
+ ["cs"]="chem",
+ ["de"]="chem",
+ ["en"]="chem",
+ ["fr"]="chem",
+ ["it"]="chim",
+ ["nl"]="chem",
+ ["pe"]="chem",
+ ["ro"]="chem",
+ },
+ ["clip"]={
+ ["cs"]="orez",
+ ["de"]="ausschnitt",
+ ["en"]="clip",
+ ["fr"]="clip",
+ ["it"]="clip",
+ ["nl"]="clip",
+ ["pe"]="گیره",
+ ["ro"]="clip",
+ },
+ ["clonefield"]={
+ ["cs"]="klonujpole",
+ ["de"]="klonierefeld",
+ ["en"]="clonefield",
+ ["fr"]="clonechamp",
+ ["it"]="clonacampo",
+ ["nl"]="kloonveld",
+ ["pe"]="میدان‌شبیه‌سازی",
+ ["ro"]="cloneazacamp",
+ },
+ ["color"]={
+ ["cs"]="barva",
+ ["de"]="farbe",
+ ["en"]="color",
+ ["fr"]="couleur",
+ ["it"]="colore",
+ ["nl"]="kleur",
+ ["pe"]="رنگ",
+ ["ro"]="culoare",
+ },
+ ["colorbar"]={
+ ["cs"]="barevnalista",
+ ["de"]="farbbalken",
+ ["en"]="colorbar",
+ ["fr"]="barrecouleur",
+ ["it"]="barracolori",
+ ["nl"]="kleurenbalk",
+ ["pe"]="میله‌رنگ",
+ ["ro"]="baraculoare",
+ },
+ ["colorvalue"]={
+ ["cs"]="hodnotabarvy",
+ ["de"]="farbewert",
+ ["en"]="colorvalue",
+ ["fr"]="valeurcouleur",
+ ["it"]="valorecolore",
+ ["nl"]="kleurwaarde",
+ ["pe"]="مقداررنگ",
+ ["ro"]="valoareculoare",
+ },
+ ["column"]={
+ ["cs"]="sloupec",
+ ["de"]="spalte",
+ ["en"]="column",
+ ["fr"]="colonne",
+ ["it"]="colonna",
+ ["nl"]="kolom",
+ ["pe"]="ستون",
+ ["ro"]="coloana",
+ },
+ ["comment"]={
+ ["cs"]="komentar",
+ ["de"]="kommentar",
+ ["en"]="comment",
+ ["fr"]="commentaire",
+ ["it"]="commento",
+ ["nl"]="commentaar",
+ ["pe"]="توضیØ",
+ ["ro"]="comentariu",
+ },
+ ["comparecolorgroup"]={
+ ["cs"]="porovnejskupinubarev",
+ ["de"]="vergleichefarbengruppe",
+ ["en"]="comparecolorgroup",
+ ["fr"]="comparegroupecouleur",
+ ["it"]="confrontagruppocolori",
+ ["nl"]="vergelijkkleurgroep",
+ ["pe"]="مقایسه‌گروه‌رنگ",
+ ["ro"]="comparagrupculoare",
+ },
+ ["comparepalet"]={
+ ["cs"]="porovnejpaletu",
+ ["de"]="vergleichepalette",
+ ["en"]="comparepalet",
+ ["fr"]="comparepalette",
+ ["it"]="confrontatavolozza",
+ ["nl"]="vergelijkpalet",
+ ["pe"]="لوØ‌مقایسه",
+ ["ro"]="comparapaleta",
+ },
+ ["completepagenumber"]={
+ ["cs"]="completepagenumber",
+ ["de"]="completepagenumber",
+ ["en"]="completepagenumber",
+ ["fr"]="completenumeropage",
+ ["it"]="numeropaginacompleto",
+ ["nl"]="volledigepaginanummer",
+ ["pe"]="شماره‌صÙØه‌کامل",
+ ["ro"]="completeazanumarpagina",
+ },
+ ["completeregister"]={
+ ["cs"]="completeregister",
+ ["de"]="completeregister",
+ ["en"]="completeregister",
+ ["fr"]="completeregistre",
+ ["it"]="completeregister",
+ ["nl"]="volledigregister",
+ ["pe"]="ثبت‌کامل",
+ ["ro"]="completeregister",
+ },
+ ["component"]={
+ ["cs"]="komponenta",
+ ["de"]="komponente",
+ ["en"]="component",
+ ["fr"]="composant",
+ ["it"]="componenet",
+ ["nl"]="onderdeel",
+ ["pe"]="مولÙÙ‡",
+ ["ro"]="componenta",
+ },
+ ["convertnumber"]={
+ ["cs"]="konvertujcislo",
+ ["de"]="konvertierezahl",
+ ["en"]="convertnumber",
+ ["fr"]="convertitnumero",
+ ["it"]="convertinumero",
+ ["nl"]="converteernummer",
+ ["pe"]="شماره‌مبدل",
+ ["ro"]="convertestenumar",
+ },
+ ["copyfield"]={
+ ["cs"]="kopirujpole",
+ ["de"]="kopierefeld",
+ ["en"]="copyfield",
+ ["fr"]="copitchamp",
+ ["it"]="copiacampo",
+ ["nl"]="copieerveld",
+ ["pe"]="میدان‌کپی",
+ ["ro"]="copiazacamp",
+ },
+ ["correctwhitespace"]={
+ ["cs"]="korekcebilehomista",
+ ["de"]="korrigierezwischenraum",
+ ["en"]="correctwhitespace",
+ ["fr"]="corrigeespaceblanc",
+ ["it"]="correggispaziobianco",
+ ["nl"]="corrigeerwitruimte",
+ ["pe"]="Ùضای‌سÙیدصØÛŒØ",
+ ["ro"]="corecteazaspatiualb",
+ },
+ ["coupledocument"]={
+ ["cs"]="propojenydokument",
+ ["de"]="verknuepfedokument",
+ ["en"]="coupledocument",
+ ["fr"]="coupledocument",
+ ["it"]="accoppiadocumento",
+ ["nl"]="koppeldocument",
+ ["pe"]="نوشتارزوج",
+ ["ro"]="cupleazadocument",
+ },
+ ["couplemarking"]={
+ ["cs"]="propojeneznaceni",
+ ["de"]="verknuepfebeschriftung",
+ ["en"]="couplemarking",
+ ["fr"]="couplemarquage",
+ ["it"]="accoppiamarcatura",
+ ["nl"]="koppelmarkering",
+ ["pe"]="نشانه‌گذاری‌زوج",
+ ["ro"]="cupleazamarcaje",
+ },
+ ["couplepage"]={
+ ["cs"]="parovastrana",
+ ["de"]="doppelseite",
+ ["en"]="couplepage",
+ ["fr"]="pagedouble",
+ ["it"]="accoppiapagina",
+ ["nl"]="koppelpagina",
+ ["pe"]="صÙØه‌زوج",
+ ["ro"]="paginadubla",
+ },
+ ["couplepaper"]={
+ ["cs"]="dvoustrannypapir",
+ ["de"]="doppelseitigespapier",
+ ["en"]="couplepaper",
+ ["fr"]="couplepapier",
+ ["it"]="accoppiacarta",
+ ["nl"]="koppelpapier",
+ ["pe"]="کاغذزوج",
+ ["ro"]="hartiedubla",
+ },
+ ["coupleregister"]={
+ ["cs"]="propojenyrejstrik",
+ ["de"]="verknuepfregister",
+ ["en"]="coupleregister",
+ ["fr"]="coupleregistre",
+ ["it"]="accoppiaregistro",
+ ["nl"]="koppelregister",
+ ["pe"]="ثبت‌زوج",
+ ["ro"]="cupleazaregistru",
+ },
+ ["crlf"]={
+ ["cs"]="crlf",
+ ["de"]="crlf",
+ ["en"]="crlf",
+ ["fr"]="crlf",
+ ["it"]="crlf",
+ ["nl"]="crlf",
+ ["pe"]="crlf",
+ ["ro"]="crlf",
+ },
+ ["currentdate"]={
+ ["cs"]="aktualnidatum",
+ ["de"]="heutigesdatum",
+ ["en"]="currentdate",
+ ["fr"]="datecourante",
+ ["it"]="datadioggi",
+ ["nl"]="huidigedatum",
+ ["pe"]="تاریخ‌جاری",
+ ["ro"]="datacurenta",
+ },
+ ["currentheadnumber"]={
+ ["cs"]="aktualnicislonadpisu",
+ ["de"]="heutigeskopfnummer",
+ ["en"]="currentheadnumber",
+ ["fr"]="numerotetecourant",
+ ["it"]="numerotestacorrente",
+ ["nl"]="huidigekopnummer",
+ ["pe"]="شماره‌سرجاری",
+ ["ro"]="numartitlucurent",
+ },
+ ["cutspace"]={
+ ["cs"]="cutspace",
+ ["de"]="cutspace",
+ ["en"]="cutspace",
+ ["fr"]="cutspace",
+ ["it"]="cutspace",
+ ["nl"]="snijwit",
+ ["pe"]="Ùضای‌برش",
+ ["ro"]="cutspace",
+ },
+ ["date"]={
+ ["cs"]="datum",
+ ["de"]="datum",
+ ["en"]="date",
+ ["fr"]="date",
+ ["it"]="data",
+ ["nl"]="datum",
+ ["pe"]="تاریخ",
+ ["ro"]="data",
+ },
+ ["decouplemarking"]={
+ ["cs"]="rozpojeneznaceni",
+ ["de"]="entknuepfebeschriftung",
+ ["en"]="decouplemarking",
+ ["fr"]="decouplemarquage",
+ ["it"]="separamarcatura",
+ ["nl"]="ontkoppelmarkering",
+ ["pe"]="جداسازی‌نشانه‌گذاری",
+ ["ro"]="decupleazamarcaje",
+ },
+ ["decrementnumber"]={
+ ["cs"]="decrementnumber",
+ ["de"]="decrementnumber",
+ ["en"]="decrementnumber",
+ ["fr"]="decrementenumero",
+ ["it"]="decrementnumber",
+ ["nl"]="verlaagnummer",
+ ["pe"]="شماره‌کاهش",
+ ["ro"]="decrementnumber",
+ },
+ ["define"]={
+ ["cs"]="definuj",
+ ["de"]="definieren",
+ ["en"]="define",
+ ["fr"]="definit",
+ ["it"]="definisci",
+ ["nl"]="definieer",
+ ["pe"]="تعریÙ",
+ ["ro"]="defineste",
+ },
+ ["defineaccent"]={
+ ["cs"]="definujakcent",
+ ["de"]="definiereakzent",
+ ["en"]="defineaccent",
+ ["fr"]="definitaccent",
+ ["it"]="definisciaccento",
+ ["nl"]="definieeraccent",
+ ["pe"]="تعریÙ‌لهجه",
+ ["ro"]="definesteaccent",
+ },
+ ["defineblank"]={
+ ["cs"]="definujpreskok",
+ ["de"]="definiereblanko",
+ ["en"]="defineblank",
+ ["fr"]="definitvide",
+ ["it"]="definiscirigovuoto",
+ ["nl"]="definieerblanko",
+ ["pe"]="تعریÙ‌خالی",
+ ["ro"]="definesteblanc",
+ },
+ ["defineblock"]={
+ ["cs"]="definujblok",
+ ["de"]="definiereblock",
+ ["en"]="defineblock",
+ ["fr"]="definitbloc",
+ ["it"]="definisciblocco",
+ ["nl"]="definieerblok",
+ ["pe"]="تعریÙ‌بلوک",
+ ["ro"]="definestebloc",
+ },
+ ["definebodyfont"]={
+ ["cs"]="definujzakladnifont",
+ ["de"]="definierefliesstext",
+ ["en"]="definebodyfont",
+ ["fr"]="definitpolicecorps",
+ ["it"]="definiscifontdeltesto",
+ ["nl"]="definieerkorps",
+ ["pe"]="تعریÙ‌قلم‌متن",
+ ["ro"]="definestefonttext",
+ },
+ ["definebodyfontenvironment"]={
+ ["cs"]="definujprostredizakladnihofontu",
+ ["de"]="definierefliesstextumgebung",
+ ["en"]="definebodyfontenvironment",
+ ["fr"]="definitenvironnementpolicecorps",
+ ["it"]="definisciambientefontdeltesto",
+ ["nl"]="definieerkorpsomgeving",
+ ["pe"]="تعریÙ‌مØیط‌قلم‌بدنه",
+ ["ro"]="definestemediulfonttext",
+ },
+ ["definebuffer"]={
+ ["cs"]="definujbuffer",
+ ["de"]="definierepuffer",
+ ["en"]="definebuffer",
+ ["fr"]="definitbuffer",
+ ["it"]="definiscibuffer",
+ ["nl"]="definieerbuffer",
+ ["pe"]="تعریÙ‌باÙر",
+ ["ro"]="definestebuffer",
+ },
+ ["definecharacter"]={
+ ["cs"]="definujznak",
+ ["de"]="definierezeichen",
+ ["en"]="definecharacter",
+ ["fr"]="definicaractere",
+ ["it"]="definiscicarattere",
+ ["nl"]="definieerkarakter",
+ ["pe"]="تعریÙ‌ØرÙ",
+ ["ro"]="definestecaracter",
+ },
+ ["definecolor"]={
+ ["cs"]="definujbarvu",
+ ["de"]="definierefarbe",
+ ["en"]="definecolor",
+ ["fr"]="definitcouleur",
+ ["it"]="definiscicolore",
+ ["nl"]="definieerkleur",
+ ["pe"]="تعریÙ‌رنگ",
+ ["ro"]="definesteculoare",
+ },
+ ["definecolorgroup"]={
+ ["cs"]="definujskupinubarev",
+ ["de"]="definierefarbengruppe",
+ ["en"]="definecolorgroup",
+ ["fr"]="definitgroupecouleur",
+ ["it"]="definiscigruppocolori",
+ ["nl"]="definieerkleurgroep",
+ ["pe"]="تعریÙ‌گروه‌رنگ",
+ ["ro"]="definestegrupculori",
+ },
+ ["definecolumnbreak"]={
+ ["cs"]="definecolumnbreak",
+ ["de"]="definecolumnbreak",
+ ["en"]="definecolumnbreak",
+ ["fr"]="definitsautdecolonne",
+ ["it"]="definecolumnbreak",
+ ["nl"]="definieerkolomovergang",
+ ["pe"]="تعریÙ‌شکستن‌ستون",
+ ["ro"]="definecolumnbreak",
+ },
+ ["definecolumnset"]={
+ ["cs"]="definecolumnset",
+ ["de"]="definecolumnset",
+ ["en"]="definecolumnset",
+ ["fr"]="definitjeucolonne",
+ ["it"]="definiscigruppocolonne",
+ ["nl"]="definieerkolomgroep",
+ ["pe"]="تعریÙ‌مجموعه‌ستون",
+ ["ro"]="definecolumnset",
+ },
+ ["definecombination"]={
+ ["cs"]="definecombination",
+ ["de"]="definecombination",
+ ["en"]="definecombination",
+ ["fr"]="definecombination",
+ ["it"]="definecombination",
+ ["nl"]="definieercombinatie",
+ ["pe"]="تعریÙ‌ترکیب",
+ ["ro"]="definecombination",
+ },
+ ["definecombinedlist"]={
+ ["cs"]="definujkombinovanyseznam",
+ ["de"]="definierezusammengestellteliste",
+ ["en"]="definecombinedlist",
+ ["fr"]="definitlisteimbriquee",
+ ["it"]="definiscielencocombinato",
+ ["nl"]="definieersamengesteldelijst",
+ ["pe"]="تعریÙ‌لیست‌ترکیبی",
+ ["ro"]="definestelistacombinata",
+ },
+ ["definecommand"]={
+ ["cs"]="definujprikaz",
+ ["de"]="definierebefehl",
+ ["en"]="definecommand",
+ ["fr"]="definitcommande",
+ ["it"]="definiscicomando",
+ ["nl"]="definieercommando",
+ ["pe"]="تعریÙ‌Ùرمان",
+ ["ro"]="definestecomanda",
+ },
+ ["defineconversion"]={
+ ["cs"]="definujkonverzi",
+ ["de"]="definierekonversion",
+ ["en"]="defineconversion",
+ ["fr"]="definitconversion",
+ ["it"]="definisciconversione",
+ ["nl"]="definieerconversie",
+ ["pe"]="تعریÙ‌تبدیل",
+ ["ro"]="definesteconversie",
+ },
+ ["definedescription"]={
+ ["cs"]="definujpopis",
+ ["de"]="definierebeschreibung",
+ ["en"]="definedescription",
+ ["fr"]="definitdescription",
+ ["it"]="definiscidescrizione",
+ ["nl"]="doordefinieren",
+ ["pe"]="تعریÙ‌شرØ",
+ ["ro"]="definestedescriere",
+ },
+ ["defineenumeration"]={
+ ["cs"]="definujvycet",
+ ["de"]="definierenummerierung",
+ ["en"]="defineenumeration",
+ ["fr"]="definitenumeration",
+ ["it"]="definiscienumerazione",
+ ["nl"]="doornummeren",
+ ["pe"]="تعریÙ‌شماره‌بندی",
+ ["ro"]="definesteenumerare",
+ },
+ ["definefield"]={
+ ["cs"]="definujpole",
+ ["de"]="definierefeld",
+ ["en"]="definefield",
+ ["fr"]="definitchamp",
+ ["it"]="definiscicampo",
+ ["nl"]="definieerveld",
+ ["pe"]="تعریÙ‌میدان",
+ ["ro"]="definestecamp",
+ },
+ ["definefieldstack"]={
+ ["cs"]="definujzasobnikpoli",
+ ["de"]="definierefeldstapel",
+ ["en"]="definefieldstack",
+ ["fr"]="definitpilechamp",
+ ["it"]="definiscistackcampi",
+ ["nl"]="definieerveldstapel",
+ ["pe"]="تعریÙ‌توده‌میدان",
+ ["ro"]="definestestivacampuri",
+ },
+ ["definefiguresymbol"]={
+ ["cs"]="definujobrazeksymbol",
+ ["de"]="definiereabbsymbol",
+ ["en"]="definefiguresymbol",
+ ["fr"]="definitsymbolefigure",
+ ["it"]="definiscifigurasimbolo",
+ ["nl"]="definieerfiguursymbool",
+ ["pe"]="تعریÙ‌نمادشکل",
+ ["ro"]="definestesimbolfigura",
+ },
+ ["definefloat"]={
+ ["cs"]="definujplvouciobjekt",
+ ["de"]="definieregleitobjekt",
+ ["en"]="definefloat",
+ ["fr"]="definitflottant",
+ ["it"]="definiscioggettomobile",
+ ["nl"]="definieerplaatsblok",
+ ["pe"]="تعریÙ‌شناور",
+ ["ro"]="definestefloat",
+ },
+ ["definefont"]={
+ ["cs"]="definujfont",
+ ["de"]="definiereschrift",
+ ["en"]="definefont",
+ ["fr"]="definitpolice",
+ ["it"]="definiscifont",
+ ["nl"]="definieerfont",
+ ["pe"]="تعریÙ‌قلم",
+ ["ro"]="definestefont",
+ },
+ ["definefontstyle"]={
+ ["cs"]="definujstylfontu",
+ ["de"]="definiereschriftstil",
+ ["en"]="definefontstyle",
+ ["fr"]="definitstylepolice",
+ ["it"]="definiscistilefont",
+ ["nl"]="definieerfontstijl",
+ ["pe"]="تعریÙ‌سبک‌قلم",
+ ["ro"]="definestestilfont",
+ },
+ ["definefontsynonym"]={
+ ["cs"]="definujsynonumumfontu",
+ ["de"]="defineschriftsynonym",
+ ["en"]="definefontsynonym",
+ ["fr"]="definitsynonymepolice",
+ ["it"]="definiscisinonimofont",
+ ["nl"]="definieerfontsynoniem",
+ ["pe"]="تعریÙ‌مترادÙ‌قلم",
+ ["ro"]="definestesinonimfont",
+ },
+ ["defineframed"]={
+ ["cs"]="definujoramovani",
+ ["de"]="definiereumrahmt",
+ ["en"]="defineframed",
+ ["fr"]="defineframed",
+ ["it"]="definisciincorniciato",
+ ["nl"]="definieeromlijnd",
+ ["pe"]="تعریÙ‌قالبی",
+ ["ro"]="definesteinconjurare",
+ },
+ ["defineframedtext"]={
+ ["cs"]="definujoramovanytext",
+ ["de"]="definiereumrahmtertext",
+ ["en"]="defineframedtext",
+ ["fr"]="defineframedtext",
+ ["it"]="definiscitestoincorniciato",
+ ["nl"]="definieerkadertekst",
+ ["pe"]="تعریÙ‌متن‌قالبی",
+ ["ro"]="definestetextinconjurat",
+ },
+ ["definehbox"]={
+ ["cs"]="definujhbox",
+ ["de"]="definierehbox",
+ ["en"]="definehbox",
+ ["fr"]="definithbox",
+ ["it"]="definiscihbox",
+ ["nl"]="definieerhbox",
+ ["pe"]="تعریÙ‌جعبه‌‌اÙÙ‚ÛŒ",
+ ["ro"]="definestehbox",
+ },
+ ["definehead"]={
+ ["cs"]="definujnadpis",
+ ["de"]="definiereueberschrift",
+ ["en"]="definehead",
+ ["fr"]="definittete",
+ ["it"]="definiscitesta",
+ ["nl"]="definieerkop",
+ ["pe"]="تعریÙ‌سر",
+ ["ro"]="definesteantet",
+ },
+ ["defineindenting"]={
+ ["cs"]="definujodsazovani",
+ ["de"]="definiereeinzug",
+ ["en"]="defineindenting",
+ ["fr"]="definitcompoalinea",
+ ["it"]="definiscirientro",
+ ["nl"]="doorspringen",
+ ["pe"]="تعریÙ‌تورÙتگی",
+ ["ro"]="definestealiat",
+ },
+ ["defineinmargin"]={
+ ["cs"]="defineinmargin",
+ ["de"]="defineinmargin",
+ ["en"]="defineinmargin",
+ ["fr"]="definitdansmarge",
+ ["it"]="defineinmargin",
+ ["nl"]="definieerinmarge",
+ ["pe"]="تعریÙ‌درون‌Øاشیه",
+ ["ro"]="defineinmargin",
+ },
+ ["defineinteractionmenu"]={
+ ["cs"]="definujinterakcnimenu",
+ ["de"]="definiereinteraktionsmenue",
+ ["en"]="defineinteractionmenu",
+ ["fr"]="definitmenuinteraction",
+ ["it"]="definiscimenuinterazione",
+ ["nl"]="definieerinteractiemenu",
+ ["pe"]="تعریÙ‌منوی‌پانل",
+ ["ro"]="definestemeniuinteractiune",
+ },
+ ["defineitemgroup"]={
+ ["cs"]="defineitemgroup",
+ ["de"]="defineitemgroup",
+ ["en"]="defineitemgroup",
+ ["fr"]="defineitemgroup",
+ ["it"]="defineitemgroup",
+ ["nl"]="definieeritemgroep",
+ ["pe"]="تعریÙ‌گروه‌آیتم",
+ ["ro"]="defineitemgroup",
+ },
+ ["definelabel"]={
+ ["cs"]="definujpopisek",
+ ["de"]="definierelabel",
+ ["en"]="definelabel",
+ ["fr"]="definitetiquette",
+ ["it"]="definiscietichetta",
+ ["nl"]="doorlabelen",
+ ["pe"]="تعریÙ‌برچسب",
+ ["ro"]="definesteeticheta",
+ },
+ ["definelayer"]={
+ ["cs"]="definelayer",
+ ["de"]="definelayer",
+ ["en"]="definelayer",
+ ["fr"]="definitcalque",
+ ["it"]="definelayer",
+ ["nl"]="definieerlayer",
+ ["pe"]="تعریÙ‌لایه",
+ ["ro"]="definelayer",
+ },
+ ["definelayout"]={
+ ["cs"]="definelayout",
+ ["de"]="definelayout",
+ ["en"]="definelayout",
+ ["fr"]="definitdisposition",
+ ["it"]="definiscilayout",
+ ["nl"]="definieerlayout",
+ ["pe"]="تعریÙ‌طرØ‌بندی",
+ ["ro"]="definelayout",
+ },
+ ["definelist"]={
+ ["cs"]="definujseznam",
+ ["de"]="definiereliste",
+ ["en"]="definelist",
+ ["fr"]="definitliste",
+ ["it"]="definiscielenco",
+ ["nl"]="definieerlijst",
+ ["pe"]="تعریÙ‌لیست",
+ ["ro"]="definestelista",
+ },
+ ["definelogo"]={
+ ["cs"]="definujlogo",
+ ["de"]="definierelogo",
+ ["en"]="definelogo",
+ ["fr"]="definitlogo",
+ ["it"]="definiscilogo",
+ ["nl"]="definieerbeeldmerk",
+ ["pe"]="تعریÙ‌آرم",
+ ["ro"]="definestelogo",
+ },
+ ["definemainfield"]={
+ ["cs"]="definujhlavnipole",
+ ["de"]="definierehauptfeld",
+ ["en"]="definemainfield",
+ ["fr"]="definitchampprincipal",
+ ["it"]="definiscicampoprincipale",
+ ["nl"]="definieerhoofdveld",
+ ["pe"]="تعریÙ‌میدان‌اصلی",
+ ["ro"]="definestecampprincipal",
+ },
+ ["definemakeup"]={
+ ["cs"]="definujupravu",
+ ["de"]="definiereumbruch",
+ ["en"]="definemakeup",
+ ["fr"]="definitmakeup",
+ ["it"]="definiscimakeup",
+ ["nl"]="definieeropmaak",
+ ["pe"]="تعریÙ‌آرایش",
+ ["ro"]="definestemakeup",
+ },
+ ["definemarking"]={
+ ["cs"]="definujznaceni",
+ ["de"]="definierebeschriftung",
+ ["en"]="definemarking",
+ ["fr"]="definitmarquage",
+ ["it"]="definiscimarcatura",
+ ["nl"]="definieermarkering",
+ ["pe"]="تعریÙ‌نشانه‌گذاری",
+ ["ro"]="definestemarcaje",
+ },
+ ["definemathalignment"]={
+ ["cs"]="definemathalignment",
+ ["de"]="definemathalignment",
+ ["en"]="definemathalignment",
+ ["fr"]="definemathalignment",
+ ["it"]="definemathalignment",
+ ["nl"]="definieerwiskundeuitlijnen",
+ ["pe"]="تعریÙ‌تنظیم‌ریاضی",
+ ["ro"]="definemathalignment",
+ },
+ ["defineoutput"]={
+ ["cs"]="definujvystup",
+ ["de"]="defineoutput",
+ ["en"]="defineoutput",
+ ["fr"]="definitsortie",
+ ["it"]="definiscioutput",
+ ["nl"]="definieeruitvoer",
+ ["pe"]="تعریÙ‌خروجی",
+ ["ro"]="definesteoutput",
+ },
+ ["defineoverlay"]={
+ ["cs"]="definujprekryv",
+ ["de"]="definiereoverlay",
+ ["en"]="defineoverlay",
+ ["fr"]="definitrevetement",
+ ["it"]="definiscisovrapposizione",
+ ["nl"]="definieeroverlay",
+ ["pe"]="تعریÙ‌پوشش",
+ ["ro"]="definesteoverlay",
+ },
+ ["definepagebreak"]={
+ ["cs"]="definepagebreak",
+ ["de"]="definepagebreak",
+ ["en"]="definepagebreak",
+ ["fr"]="definitsautdepage",
+ ["it"]="definepagebreak",
+ ["nl"]="definieerpaginaovergang",
+ ["pe"]="تعریÙ‌شکست‌صÙØÙ‡",
+ ["ro"]="definepagebreak",
+ },
+ ["definepalet"]={
+ ["cs"]="definujpaletu",
+ ["de"]="definierepalette",
+ ["en"]="definepalet",
+ ["fr"]="definitpalette",
+ ["it"]="definiscitavolozza",
+ ["nl"]="definieerpalet",
+ ["pe"]="تعریÙ‌لوØ",
+ ["ro"]="definestepaleta",
+ },
+ ["definepapersize"]={
+ ["cs"]="definujvelikostpapiru",
+ ["de"]="definierepapierformat",
+ ["en"]="definepapersize",
+ ["fr"]="definittaillepapier",
+ ["it"]="definiscidimensionicarta",
+ ["nl"]="definieerpapierformaat",
+ ["pe"]="تعریÙ‌اندازه‌برگ",
+ ["ro"]="definestedimensiunehartie",
+ },
+ ["defineparagraphs"]={
+ ["cs"]="definujodstavce",
+ ["de"]="definiereabsaetze",
+ ["en"]="defineparagraphs",
+ ["fr"]="definitparagraphes",
+ ["it"]="definiscicapoversi",
+ ["nl"]="definieeralineas",
+ ["pe"]="تعریÙ‌پاراگراÙها",
+ ["ro"]="definesteparagraf",
+ },
+ ["defineplacement"]={
+ ["cs"]="defineplacement",
+ ["de"]="defineplacement",
+ ["en"]="defineplacement",
+ ["fr"]="defineplacement",
+ ["it"]="defineplacement",
+ ["nl"]="definieerplaats",
+ ["pe"]="تعریÙ‌جانشانی",
+ ["ro"]="defineplacement",
+ },
+ ["defineprofile"]={
+ ["cs"]="definujprofil",
+ ["de"]="definiereprofil",
+ ["en"]="defineprofile",
+ ["fr"]="definitprofil",
+ ["it"]="definisciprofilo",
+ ["nl"]="definieerprofiel",
+ ["pe"]="تعریÙ‌پروÙایل",
+ ["ro"]="definesteprofil",
+ },
+ ["defineprogram"]={
+ ["cs"]="definujprogram",
+ ["de"]="definiereprogramme",
+ ["en"]="defineprogram",
+ ["fr"]="definitprogramme",
+ ["it"]="definisciprogramma",
+ ["nl"]="definieerprogramma",
+ ["pe"]="تعریÙ‌برنامه",
+ ["ro"]="definesteprogram",
+ },
+ ["definerawfont"]={
+ ["cs"]="definerawfont",
+ ["de"]="definerawfont",
+ ["en"]="definerawfont",
+ ["fr"]="definitpolicebrute",
+ ["it"]="definiscifontgrezzo",
+ ["nl"]="definerawfont",
+ ["pe"]="تعریÙ‌قلم‌خام",
+ ["ro"]="definestefontraw",
+ },
+ ["definereference"]={
+ ["cs"]="definujodkaz",
+ ["de"]="definierereferenz",
+ ["en"]="definereference",
+ ["fr"]="definitreference",
+ ["it"]="definisciriferimento",
+ ["nl"]="definieerreferentie",
+ ["pe"]="تعریÙ‌مرجع",
+ ["ro"]="definestereferinte",
+ },
+ ["definereferenceformat"]={
+ ["cs"]="definujformatodkazu",
+ ["de"]="definierereferenzformat",
+ ["en"]="definereferenceformat",
+ ["fr"]="definitformatreference",
+ ["it"]="definisciformatoriferimento",
+ ["nl"]="definieerreferentieformaat",
+ ["pe"]="تعریÙ‌شمایل‌مرجع",
+ ["ro"]="definesteformatreferinte",
+ },
+ ["definereferencelist"]={
+ ["cs"]="definujseznamodkazu",
+ ["de"]="definierereferenzliste",
+ ["en"]="definereferencelist",
+ ["fr"]="definitlistereference",
+ ["it"]="definiscilistariferimenti",
+ ["nl"]="definieerreferentielijst",
+ ["pe"]="تعریÙ‌لیست‌مرجع",
+ ["ro"]="definestelistareferinte",
+ },
+ ["defineregister"]={
+ ["cs"]="definujrejstrik",
+ ["de"]="definiereregister",
+ ["en"]="defineregister",
+ ["fr"]="definitregistre",
+ ["it"]="definisciregistro",
+ ["nl"]="definieerregister",
+ ["pe"]="تعریÙ‌ثبت",
+ ["ro"]="definesteregistru",
+ },
+ ["definerule"]={
+ ["cs"]="definerule",
+ ["de"]="definerule",
+ ["en"]="definerule",
+ ["fr"]="definitregle",
+ ["it"]="definiscilinea",
+ ["nl"]="definieerlijn",
+ ["pe"]="تعریÙ‌خط‌Øائل",
+ ["ro"]="definesterigla",
+ },
+ ["definesection"]={
+ ["cs"]="definujsekci",
+ ["de"]="definiereabschnitt",
+ ["en"]="definesection",
+ ["fr"]="definitsection",
+ ["it"]="definiscisezione",
+ ["nl"]="definieersectie",
+ ["pe"]="تعریÙ‌بخش",
+ ["ro"]="definestesectiune",
+ },
+ ["definesectionblock"]={
+ ["cs"]="definujbloksekce",
+ ["de"]="definiereabschnittsblock",
+ ["en"]="definesectionblock",
+ ["fr"]="definitblocsection",
+ ["it"]="definiscibloccosezione",
+ ["nl"]="definieersectieblok",
+ ["pe"]="تعریÙ‌بلوک‌بخش",
+ ["ro"]="definesteblocsectiune",
+ },
+ ["definesorting"]={
+ ["cs"]="definujtrideni",
+ ["de"]="definieresortieren",
+ ["en"]="definesorting",
+ ["fr"]="definittri",
+ ["it"]="definisciordinamento",
+ ["nl"]="definieersorteren",
+ ["pe"]="تعریÙ‌ترتیب",
+ ["ro"]="definestesortare",
+ },
+ ["definestartstop"]={
+ ["cs"]="definujstartstop",
+ ["de"]="definierestartstop",
+ ["en"]="definestartstop",
+ ["fr"]="definitdemarrestoppe",
+ ["it"]="definisciiniziatermina",
+ ["nl"]="definieerstartstop",
+ ["pe"]="تعریÙ‌شروع‌پایان",
+ ["ro"]="definestestartstop",
+ },
+ ["definestyle"]={
+ ["cs"]="definujstyl",
+ ["de"]="definierestil",
+ ["en"]="definestyle",
+ ["fr"]="definitstyle",
+ ["it"]="definiscistile",
+ ["nl"]="definieerletter",
+ ["pe"]="تعریÙ‌سبک",
+ ["ro"]="definestestil",
+ },
+ ["definesubfield"]={
+ ["cs"]="definujpodpole",
+ ["de"]="definieresubfeld",
+ ["en"]="definesubfield",
+ ["fr"]="definitsouschamp",
+ ["it"]="definiscisottocampo",
+ ["nl"]="definieersubveld",
+ ["pe"]="تعریÙ‌زیرمیدان",
+ ["ro"]="definestesubcamp",
+ },
+ ["definesymbol"]={
+ ["cs"]="definujsymbol",
+ ["de"]="definieresymbol",
+ ["en"]="definesymbol",
+ ["fr"]="definitsymbole",
+ ["it"]="definiscisimbolo",
+ ["nl"]="definieersymbool",
+ ["pe"]="تعریÙ‌نماد",
+ ["ro"]="definestesimbol",
+ },
+ ["definesynonyms"]={
+ ["cs"]="definujsynonyma",
+ ["de"]="definieresynonyme",
+ ["en"]="definesynonyms",
+ ["fr"]="definitsynonymes",
+ ["it"]="definiscisinonimi",
+ ["nl"]="definieersynoniemen",
+ ["pe"]="تعریÙ‌مترادÙها",
+ ["ro"]="definestesinonim",
+ },
+ ["definetabletemplate"]={
+ ["cs"]="definujsablonutabulky",
+ ["de"]="definieretabellenvorlage",
+ ["en"]="definetabletemplate",
+ ["fr"]="definittrametableau",
+ ["it"]="definiscimodellotabella",
+ ["nl"]="definieertabelvorm",
+ ["pe"]="تعریÙ‌الگوی‌جدول",
+ ["ro"]="definestesablontabel",
+ },
+ ["definetabulate"]={
+ ["cs"]="definujtabelaci",
+ ["de"]="definieretabulator",
+ ["en"]="definetabulate",
+ ["fr"]="definittabulation",
+ ["it"]="definiscitabulato",
+ ["nl"]="definieertabulatie",
+ ["pe"]="تعریÙ‌جدول‌بندی",
+ ["ro"]="definestetabulatori",
+ },
+ ["definetext"]={
+ ["cs"]="definujtext",
+ ["de"]="definieretext",
+ ["en"]="definetext",
+ ["fr"]="definittexte",
+ ["it"]="definiscitesto",
+ ["nl"]="definieertekst",
+ ["pe"]="تعریÙ‌متن",
+ ["ro"]="definestetext",
+ },
+ ["definetextposition"]={
+ ["cs"]="definetextposition",
+ ["de"]="definetextposition",
+ ["en"]="definetextposition",
+ ["fr"]="definitpositiontexte",
+ ["it"]="definisciposizionetesto",
+ ["nl"]="definieertekstpositie",
+ ["pe"]="تعریÙ‌مکان‌متن",
+ ["ro"]="definestepozitietext",
+ },
+ ["definetextvariable"]={
+ ["cs"]="definetextvariable",
+ ["de"]="definetextvariable",
+ ["en"]="definetextvariable",
+ ["fr"]="definitvariabletexte",
+ ["it"]="definiscivariabiletesto",
+ ["nl"]="definieertekstvariabele",
+ ["pe"]="تعریÙ‌متغیرمتن",
+ ["ro"]="definestevariabilatext",
+ },
+ ["definetype"]={
+ ["cs"]="definetype",
+ ["de"]="definetype",
+ ["en"]="definetype",
+ ["fr"]="definittype",
+ ["it"]="definiscitype",
+ ["nl"]="definieertype",
+ ["pe"]="تعریÙ‌تایپ",
+ ["ro"]="definetype",
+ },
+ ["definetyping"]={
+ ["cs"]="definujopis",
+ ["de"]="definieretippen",
+ ["en"]="definetyping",
+ ["fr"]="definitdactylo",
+ ["it"]="definiscityping",
+ ["nl"]="definieertypen",
+ ["pe"]="تعریÙ‌تایپ‌کردن",
+ ["ro"]="definestetyping",
+ },
+ ["defineversion"]={
+ ["cs"]="definujverzi",
+ ["de"]="definiereversion",
+ ["en"]="defineversion",
+ ["fr"]="definitversion",
+ ["it"]="definisciversion",
+ ["nl"]="definieerversie",
+ ["pe"]="تعریÙ‌نسخه",
+ ["ro"]="definesteversiune",
+ },
+ ["determineheadnumber"]={
+ ["cs"]="stanovcislonadpisu",
+ ["de"]="bestimmekopfnummer",
+ ["en"]="determineheadnumber",
+ ["fr"]="determinenumerotete",
+ ["it"]="determinanumerotesta",
+ ["nl"]="bepaalkopnummer",
+ ["pe"]="تعیین‌شماره‌سر",
+ ["ro"]="determinanumartitlu",
+ },
+ ["determinelistcharacteristics"]={
+ ["cs"]="stanovcharakteristickuseznamu",
+ ["de"]="bestimmelistencharakeristika",
+ ["en"]="determinelistcharacteristics",
+ ["fr"]="determinecaracteristiqueliste",
+ ["it"]="determinacarattersticheelenco",
+ ["nl"]="bepaallijstkenmerken",
+ ["pe"]="تعیین‌مشخصات‌لیست",
+ ["ro"]="determinacaracteristicilelistei",
+ },
+ ["determineregistercharacteristics"]={
+ ["cs"]="urcicharakteristikurejstriku",
+ ["de"]="bestimmeregistercharakteristika",
+ ["en"]="determineregistercharacteristics",
+ ["fr"]="determinecaracteristiquesregistre",
+ ["it"]="determinacaratteristicheregistro",
+ ["nl"]="bepaalregisterkenmerken",
+ ["pe"]="تعیین‌مشخصات‌ثبت",
+ ["ro"]="determinacaracteristiciregistru",
+ },
+ ["dimension"]={
+ ["cs"]="rozmer",
+ ["de"]="dimension",
+ ["en"]="dimension",
+ ["fr"]="dimension",
+ ["it"]="dimensione",
+ ["nl"]="dimensie",
+ ["pe"]="بعد",
+ ["ro"]="dimensiune",
+ },
+ ["disableinteractionmenu"]={
+ ["cs"]="zablokujinterakcnimenu",
+ ["de"]="inaktiviereinteraktionsmenue",
+ ["en"]="disableinteractionmenu",
+ ["fr"]="inhibemenuinteraction",
+ ["it"]="disabilitamenuinterazione",
+ ["nl"]="blokkeerinteractiemenu",
+ ["pe"]="ازکارانداختن‌منوی‌پانل",
+ ["ro"]="dezactiveazameniuinteractiune",
+ },
+ ["domicile"]={
+ ["cs"]="bydliste",
+ ["de"]="wohnort",
+ ["en"]="domicile",
+ ["fr"]="domicile",
+ ["it"]="domicilio",
+ ["nl"]="woonplaats",
+ ["pe"]="مسکن",
+ ["ro"]="domiciliu",
+ },
+ ["donttest"]={
+ ["cs"]="zadnytest",
+ ["de"]="keintest",
+ ["en"]="donttest",
+ ["fr"]="sanstest",
+ ["it"]="notest",
+ ["nl"]="geentest",
+ ["pe"]="امتØان‌نکن",
+ ["ro"]="nutesta",
+ },
+ ["edgedistance"]={
+ ["cs"]="vzdalenostokraje",
+ ["de"]="randabstand",
+ ["en"]="edgedistance",
+ ["fr"]="distancebord",
+ ["it"]="distanzabordo",
+ ["nl"]="randafstand",
+ ["pe"]="Ùاصله‌لبه",
+ ["ro"]="distantacolt",
+ },
+ ["edgewidth"]={
+ ["cs"]="sirkaokraje",
+ ["de"]="randbreite",
+ ["en"]="edgewidth",
+ ["fr"]="largeurbord",
+ ["it"]="ampiezzabordo",
+ ["nl"]="randbreedte",
+ ["pe"]="عرض‌لبه",
+ ["ro"]="latimecolturi",
+ },
+ ["emptylines"]={
+ ["cs"]="emptylines",
+ ["de"]="emptylines",
+ ["en"]="emptylines",
+ ["fr"]="emptylines",
+ ["it"]="emptylines",
+ ["nl"]="legeregels",
+ ["pe"]="خطها‌خالی",
+ ["ro"]="emptylines",
+ },
+ ["environment"]={
+ ["cs"]="prostredi",
+ ["de"]="umgebung",
+ ["en"]="environment",
+ ["fr"]="environement",
+ ["it"]="ambiente",
+ ["nl"]="omgeving",
+ ["pe"]="Ù…Øیط",
+ ["ro"]="mediu",
+ },
+ ["externalfigure"]={
+ ["cs"]="externiobraz",
+ ["de"]="externeabbildung",
+ ["en"]="externalfigure",
+ ["fr"]="figureexterne",
+ ["it"]="figuraesterna",
+ ["nl"]="externfiguur",
+ ["pe"]="شکل‌خارجی",
+ ["ro"]="figuraexterna",
+ },
+ ["fact"]={
+ ["cs"]="fakt",
+ ["de"]="geg",
+ ["en"]="fact",
+ ["fr"]="fait",
+ ["it"]="fatto",
+ ["nl"]="geg",
+ ["pe"]="Øقیقت",
+ ["ro"]="fact",
+ },
+ ["field"]={
+ ["cs"]="pole",
+ ["de"]="feld",
+ ["en"]="field",
+ ["fr"]="champ",
+ ["it"]="campi",
+ ["nl"]="veld",
+ ["pe"]="میدان",
+ ["ro"]="camp",
+ },
+ ["fieldstack"]={
+ ["cs"]="zasobnikpoli",
+ ["de"]="feldstapel",
+ ["en"]="fieldstack",
+ ["fr"]="pilechamp",
+ ["it"]="stackcampi",
+ ["nl"]="veldstapel",
+ ["pe"]="میدان‌پشته",
+ ["ro"]="stivacampuri",
+ },
+ ["fillinfield"]={
+ ["cs"]="vyplnovepole",
+ ["de"]="ausfuellfeld",
+ ["en"]="fillinfield",
+ ["fr"]="remplitchamp",
+ ["it"]="camporiempimento",
+ ["nl"]="invulveld",
+ ["pe"]="درج‌درمیدان",
+ ["ro"]="campumplere",
+ },
+ ["fillinline"]={
+ ["cs"]="vyplnovyradek",
+ ["de"]="gefuelltezeile",
+ ["en"]="fillinline",
+ ["fr"]="remplitligne",
+ ["it"]="rigariempimento",
+ ["nl"]="invulregel",
+ ["pe"]="درج‌درخط",
+ ["ro"]="linieumplere",
+ },
+ ["fillinrules"]={
+ ["cs"]="vyplnovelinky",
+ ["de"]="gefuelltesrechteck",
+ ["en"]="fillinrules",
+ ["fr"]="remplitlignesreglees",
+ ["it"]="lineeriempimento",
+ ["nl"]="invullijnen",
+ ["pe"]="درج‌درخطها",
+ ["ro"]="rigleumplere",
+ },
+ ["fillintext"]={
+ ["cs"]="vyplnenytext",
+ ["de"]="ausfuelltext",
+ ["en"]="fillintext",
+ ["fr"]="remplittexte",
+ ["it"]="testoriempimento",
+ ["nl"]="invultekst",
+ ["pe"]="درج‌درمتن",
+ ["ro"]="textumplere",
+ },
+ ["fitfield"]={
+ ["cs"]="prizpusobivepole",
+ ["de"]="passendfeld",
+ ["en"]="fitfield",
+ ["fr"]="ajustechamp",
+ ["it"]="adattacampo",
+ ["nl"]="passendveld",
+ ["pe"]="پرکردن‌میدان",
+ ["ro"]="potrivestecamp",
+ },
+ ["fixedspace"]={
+ ["cs"]="tvrdamezera",
+ ["de"]="festesspatium",
+ ["en"]="fixedspace",
+ ["fr"]="espacefixe",
+ ["it"]="spaziofisso",
+ ["nl"]="vastespatie",
+ ["pe"]="Ùضای‌ثابت",
+ ["ro"]="spatiufixat",
+ },
+ ["fixedspaces"]={
+ ["cs"]="tvrdemezery",
+ ["de"]="festesspatium",
+ ["en"]="fixedspaces",
+ ["fr"]="espacesfixes",
+ ["it"]="spazifissi",
+ ["nl"]="vastespaties",
+ ["pe"]="Ùضاهای‌ثابت",
+ ["ro"]="spatiifixate",
+ },
+ ["followprofile"]={
+ ["cs"]="dodrzujprofil",
+ ["de"]="folgeprofil",
+ ["en"]="followprofile",
+ ["fr"]="suivantprofil",
+ ["it"]="seguiprofilo",
+ ["nl"]="volgprofiel",
+ ["pe"]="پیروی‌پروÙایل",
+ ["ro"]="urmeazaprofil",
+ },
+ ["followprofileversion"]={
+ ["cs"]="dodrzujverziprofilu",
+ ["de"]="folgeprofilversion",
+ ["en"]="followprofileversion",
+ ["fr"]="suivantversionprofil",
+ ["it"]="seguiversioneprofilo",
+ ["nl"]="volgprofielversie",
+ ["pe"]="پیروی‌نسخه‌پروÙایل",
+ ["ro"]="urmeazaversiuneprofil",
+ },
+ ["followversion"]={
+ ["cs"]="dodrzujverzi",
+ ["de"]="folgeversion",
+ ["en"]="followversion",
+ ["fr"]="suivantversion",
+ ["it"]="seguiversione",
+ ["nl"]="volgversie",
+ ["pe"]="پیروی‌نسخه",
+ ["ro"]="urmeazaversiune",
+ },
+ ["footerdistance"]={
+ ["cs"]="vzdalenostupati",
+ ["de"]="fusszeileabstand",
+ ["en"]="footerdistance",
+ ["fr"]="distancepdp",
+ ["it"]="distanzapdp",
+ ["nl"]="voetafstand",
+ ["pe"]="Ùاصله‌ته‌برگ",
+ ["ro"]="distantasubsol",
+ },
+ ["footerheight"]={
+ ["cs"]="vyskaupati",
+ ["de"]="fusszeilenhoehe",
+ ["en"]="footerheight",
+ ["fr"]="hauteurpdp",
+ ["it"]="altezzapdp",
+ ["nl"]="voethoogte",
+ ["pe"]="ارتÙاع‌ته‌برگ",
+ ["ro"]="inaltimesubsol",
+ },
+ ["footnote"]={
+ ["cs"]="poznamkapodcarou",
+ ["de"]="fussnote",
+ ["en"]="footnote",
+ ["fr"]="notepdp",
+ ["it"]="notapdp",
+ ["nl"]="voetnoot",
+ ["pe"]="پانوشت",
+ ["ro"]="notasubsol",
+ },
+ ["footnotetext"]={
+ ["cs"]="footnotetext",
+ ["de"]="footnotetext",
+ ["en"]="footnotetext",
+ ["fr"]="textenotepdp",
+ ["it"]="testonotapdp",
+ ["nl"]="voetnoottekst",
+ ["pe"]="متن‌پانوشت",
+ ["ro"]="footnotetext",
+ },
+ ["forceblocks"]={
+ ["cs"]="forceblocks",
+ ["de"]="forceblocks",
+ ["en"]="forceblocks",
+ ["fr"]="forceblocs",
+ ["it"]="forzablocchi",
+ ["nl"]="forceerblokken",
+ ["pe"]="اجباربلوکها",
+ ["ro"]="forteazablocuri",
+ },
+ ["formulanumber"]={
+ ["cs"]="cislorovnice",
+ ["de"]="formelnummer",
+ ["en"]="formulanumber",
+ ["fr"]="numeroformule",
+ ["it"]="numeroformula",
+ ["nl"]="formulenummer",
+ ["pe"]="شماره‌Ùرمول",
+ ["ro"]="numarformula",
+ },
+ ["fraction"]={
+ ["cs"]="zlomek",
+ ["de"]="bruch",
+ ["en"]="fraction",
+ ["fr"]="fraction",
+ ["it"]="frazione",
+ ["nl"]="breuk",
+ ["pe"]="کسر",
+ ["ro"]="fractie",
+ },
+ ["framed"]={
+ ["cs"]="oramovani",
+ ["de"]="umrahmt",
+ ["en"]="framed",
+ ["fr"]="framed",
+ ["it"]="incorniciato",
+ ["nl"]="omlijnd",
+ ["pe"]="قالبی",
+ ["ro"]="framed",
+ },
+ ["from"]={
+ ["cs"]="zref",
+ ["de"]="von",
+ ["en"]="from",
+ ["fr"]="de",
+ ["it"]="da",
+ ["nl"]="uit",
+ ["pe"]="از",
+ ["ro"]="din",
+ },
+ ["getbuffer"]={
+ ["cs"]="ziskejbuffer",
+ ["de"]="holepuffer",
+ ["en"]="getbuffer",
+ ["fr"]="prendbuffer",
+ ["it"]="prendibuffer",
+ ["nl"]="haalbuffer",
+ ["pe"]="دریاÙت‌باÙر",
+ ["ro"]="adubuffer",
+ },
+ ["getmarking"]={
+ ["cs"]="ziskejznaceni",
+ ["de"]="holebeschriftung",
+ ["en"]="getmarking",
+ ["fr"]="obtientmarquage",
+ ["it"]="prendimarcatura",
+ ["nl"]="haalmarkering",
+ ["pe"]="دریاÙت‌نشانه",
+ ["ro"]="adumarcaje",
+ },
+ ["getnumber"]={
+ ["cs"]="getnumber",
+ ["de"]="getnumber",
+ ["en"]="getnumber",
+ ["fr"]="getnumber",
+ ["it"]="getnumber",
+ ["nl"]="haalnummer",
+ ["pe"]="دریاÙت‌شماره",
+ ["ro"]="getnumber",
+ },
+ ["godown"]={
+ ["cs"]="jdidolu",
+ ["de"]="nachunten",
+ ["en"]="godown",
+ ["fr"]="vaenbas",
+ ["it"]="vaigiu",
+ ["nl"]="omlaag",
+ ["pe"]="بروپایین",
+ ["ro"]="injos",
+ },
+ ["goto"]={
+ ["cs"]="jdina",
+ ["de"]="zu",
+ ["en"]="goto",
+ ["fr"]="va",
+ ["it"]="vaia",
+ ["nl"]="naar",
+ ["pe"]="بروبه",
+ ["ro"]="dute",
+ },
+ ["gotobox"]={
+ ["cs"]="jdinabox",
+ ["de"]="zurbox",
+ ["en"]="gotobox",
+ ["fr"]="vaalaboite",
+ ["it"]="vaiabox",
+ ["nl"]="naarbox",
+ ["pe"]="بروبه‌جعبه",
+ ["ro"]="dutebox",
+ },
+ ["gotopage"]={
+ ["cs"]="jdinastranu",
+ ["de"]="zurseite",
+ ["en"]="gotopage",
+ ["fr"]="vaalapage",
+ ["it"]="vaiapagina",
+ ["nl"]="naarpagina",
+ ["pe"]="بروبه‌صÙØÙ‡",
+ ["ro"]="dutepagina",
+ },
+ ["graycolor"]={
+ ["cs"]="sedabarva",
+ ["de"]="graufarbe",
+ ["en"]="graycolor",
+ ["fr"]="couleurgrise",
+ ["it"]="coloregrigio",
+ ["nl"]="grijskleur",
+ ["pe"]="رنگ‌خاکستری",
+ ["ro"]="culoaregri",
+ },
+ ["greyvalue"]={
+ ["cs"]="hodnotasedi",
+ ["de"]="grauwert",
+ ["en"]="greyvalue",
+ ["fr"]="valeurgris",
+ ["it"]="valoregrigio",
+ ["nl"]="grijswaarde",
+ ["pe"]="مقدارخاکستری",
+ ["ro"]="valoaregri",
+ },
+ ["grid"]={
+ ["cs"]="mrizka",
+ ["de"]="gitter",
+ ["en"]="grid",
+ ["fr"]="grille",
+ ["it"]="griglia",
+ ["nl"]="rooster",
+ ["pe"]="توری",
+ ["ro"]="grid",
+ },
+ ["hairline"]={
+ ["cs"]="vlasovalinka",
+ ["de"]="haarlinie",
+ ["en"]="hairline",
+ ["fr"]="ligneh",
+ ["it"]="capello",
+ ["nl"]="haarlijn",
+ ["pe"]="خط‌مو",
+ ["ro"]="firdepar",
+ },
+ ["head"]={
+ ["cs"]="nadpis",
+ ["de"]="kopf",
+ ["en"]="head",
+ ["fr"]="tete",
+ ["it"]="testa",
+ ["nl"]="kop",
+ ["pe"]="سر",
+ ["ro"]="titlu",
+ },
+ ["headerdistance"]={
+ ["cs"]="vzdalenostzahlavi",
+ ["de"]="kopfzeilenabstand",
+ ["en"]="headerdistance",
+ ["fr"]="distanceentete",
+ ["it"]="distanzaintestazione",
+ ["nl"]="hoofdafstand",
+ ["pe"]="Ùاصله‌سربرگ",
+ ["ro"]="distantaantet",
+ },
+ ["headerheight"]={
+ ["cs"]="vyskazahlavi",
+ ["de"]="kopfzeilenhoehe",
+ ["en"]="headerheight",
+ ["fr"]="hauteurentete",
+ ["it"]="altezzaintestazione",
+ ["nl"]="hoofdhoogte",
+ ["pe"]="ارتÙاع‌سربرگ",
+ ["ro"]="inaltimeantet",
+ },
+ ["headlevel"]={
+ ["cs"]="hlavniuroven",
+ ["de"]="kopfniveau",
+ ["en"]="headlevel",
+ ["fr"]="niveautete",
+ ["it"]="livellotesta",
+ ["nl"]="kopniveau",
+ ["pe"]="مرØله‌سر",
+ ["ro"]="niveltitlu",
+ },
+ ["headnumber"]={
+ ["cs"]="cislonadpisu",
+ ["de"]="kopfnummer",
+ ["en"]="headnumber",
+ ["fr"]="numerotete",
+ ["it"]="numerotesta",
+ ["nl"]="kopnummer",
+ ["pe"]="شماره‌سر",
+ ["ro"]="numartitlu",
+ },
+ ["headsym"]={
+ ["cs"]="headsym",
+ ["de"]="headsym",
+ ["en"]="headsym",
+ ["fr"]="headsym",
+ ["it"]="headsym",
+ ["nl"]="kopsym",
+ ["pe"]="نمادسر",
+ ["ro"]="headsym",
+ },
+ ["headtext"]={
+ ["cs"]="texthlavicky",
+ ["de"]="ueberschrifttext",
+ ["en"]="headtext",
+ ["fr"]="textetete",
+ ["it"]="testoinstestazioni",
+ ["nl"]="koptekst",
+ ["pe"]="متن‌سر",
+ ["ro"]="texttitlu",
+ },
+ ["hideblocks"]={
+ ["cs"]="schovejbloky",
+ ["de"]="verbergebloecke",
+ ["en"]="hideblocks",
+ ["fr"]="cacheblocs",
+ ["it"]="nascondiblocchi",
+ ["nl"]="verbergblokken",
+ ["pe"]="بلوکها‌پنهان",
+ ["ro"]="ascundeblocuri",
+ },
+ ["high"]={
+ ["cs"]="vysoky",
+ ["de"]="hoch",
+ ["en"]="high",
+ ["fr"]="haut",
+ ["it"]="ap",
+ ["nl"]="hoog",
+ ["pe"]="بلند",
+ ["ro"]="inalt",
+ },
+ ["hl"]={
+ ["cs"]="hl",
+ ["de"]="hl",
+ ["en"]="hl",
+ ["fr"]="hl",
+ ["it"]="hl",
+ ["nl"]="hl",
+ ["pe"]="خ‌ا",
+ ["ro"]="hl",
+ },
+ ["immediatebetweenlist"]={
+ ["cs"]="immediatebetweenlist",
+ ["de"]="immediatebetweenlist",
+ ["en"]="immediatebetweenlist",
+ ["fr"]="immediatebetweenlist",
+ ["it"]="immediatebetweenlist",
+ ["nl"]="directtussenlijst",
+ ["pe"]="Ùوری‌بین‌لیست",
+ ["ro"]="immediatebetweenlist",
+ },
+ ["immediatetolist"]={
+ ["cs"]="immediatetolist",
+ ["de"]="immediatetolist",
+ ["en"]="immediatetolist",
+ ["fr"]="immediatetolist",
+ ["it"]="immediatetolist",
+ ["nl"]="directnaarlijst",
+ ["pe"]="Ùوری‌به‌لیست",
+ ["ro"]="immediatetolist",
+ },
+ ["in"]={
+ ["cs"]="tref",
+ ["de"]="in",
+ ["en"]="in",
+ ["fr"]="dans",
+ ["it"]="in",
+ ["nl"]="in",
+ ["pe"]="درون",
+ ["ro"]="in",
+ },
+ ["incrementnumber"]={
+ ["cs"]="zvysujicicislo",
+ ["de"]="nummererhoehen",
+ ["en"]="incrementnumber",
+ ["fr"]="incrementenumero",
+ ["it"]="incrementanumero",
+ ["nl"]="verhoognummer",
+ ["pe"]="شماره‌اÙزایش",
+ ["ro"]="numarincrement",
+ },
+ ["indenting"]={
+ ["cs"]="odsazovani",
+ ["de"]="einziehen",
+ ["en"]="indenting",
+ ["fr"]="composeenalinea",
+ ["it"]="rientro",
+ ["nl"]="inspringen",
+ ["pe"]="تورÙتگی",
+ ["ro"]="aliniat",
+ },
+ ["inframed"]={
+ ["cs"]="zaramovani",
+ ["de"]="imumriss",
+ ["en"]="inframed",
+ ["fr"]="inframed",
+ ["it"]="circondato",
+ ["nl"]="inlijnd",
+ ["pe"]="درقالبی",
+ ["ro"]="inframed",
+ },
+ ["infull"]={
+ ["cs"]="plnezneni",
+ ["de"]="volleswort",
+ ["en"]="infull",
+ ["fr"]="infull",
+ ["it"]="perlungo",
+ ["nl"]="voluit",
+ ["pe"]="درپر",
+ ["ro"]="pelung",
+ },
+ ["ininner"]={
+ ["cs"]="ininner",
+ ["de"]="ininner",
+ ["en"]="ininner",
+ ["fr"]="ininner",
+ ["it"]="ininner",
+ ["nl"]="inbinnen",
+ ["pe"]="درداخلی",
+ ["ro"]="ininner",
+ },
+ ["inleft"]={
+ ["cs"]="vlevo",
+ ["de"]="imlinken",
+ ["en"]="inleft",
+ ["fr"]="dansgauche",
+ ["it"]="insinistra",
+ ["nl"]="inlinker",
+ ["pe"]="درچپ",
+ ["ro"]="instanga",
+ },
+ ["inleftedge"]={
+ ["cs"]="nalevo",
+ ["de"]="imlinkenrand",
+ ["en"]="inleftedge",
+ ["fr"]="dansbordgauche",
+ ["it"]="inlatosinistro",
+ ["nl"]="inlinkerrand",
+ ["pe"]="درلبه‌چپ",
+ ["ro"]="inparteastanga",
+ },
+ ["inleftmargin"]={
+ ["cs"]="nalevyokraj",
+ ["de"]="inlinkermarginale",
+ ["en"]="inleftmargin",
+ ["fr"]="dansmargegauche",
+ ["it"]="inmarginesinistro",
+ ["nl"]="inlinkermarge",
+ ["pe"]="درØاشیه‌چپ",
+ ["ro"]="inmargineastanga",
+ },
+ ["inline"]={
+ ["cs"]="vradku",
+ ["de"]="inzeile",
+ ["en"]="inline",
+ ["fr"]="alaligne",
+ ["it"]="inriga",
+ ["nl"]="inregel",
+ ["pe"]="درخط",
+ ["ro"]="inlinie",
+ },
+ ["inmargin"]={
+ ["cs"]="naokraj",
+ ["de"]="inmarginalie",
+ ["en"]="inmargin",
+ ["fr"]="dansmarge",
+ ["it"]="inmargine",
+ ["nl"]="inmarge",
+ ["pe"]="درØاشیه",
+ ["ro"]="marginal",
+ },
+ ["inmframed"]={
+ ["cs"]="mazaramovani",
+ ["de"]="immaumrise",
+ ["en"]="inmaframed",
+ ["fr"]="inmframed",
+ ["it"]="inmaframed",
+ ["nl"]="inwilijnd",
+ ["pe"]="inmframed",
+ ["ro"]="inmaframed",
+ },
+ ["inneredgedistance"]={
+ ["cs"]="inneredgedistance",
+ ["de"]="inneredgedistance",
+ ["en"]="inneredgedistance",
+ ["fr"]="inneredgedistance",
+ ["it"]="inneredgedistance",
+ ["nl"]="binnenrandafstand",
+ ["pe"]="Ùاصله‌لبه‌داخلی",
+ ["ro"]="inneredgedistance",
+ },
+ ["inneredgewidth"]={
+ ["cs"]="inneredgewidth",
+ ["de"]="inneredgewidth",
+ ["en"]="inneredgewidth",
+ ["fr"]="inneredgewidth",
+ ["it"]="inneredgewidth",
+ ["nl"]="binnenrandbreedte",
+ ["pe"]="عرض‌لبه‌داخلی",
+ ["ro"]="inneredgewidth",
+ },
+ ["innermargindistance"]={
+ ["cs"]="innermargindistance",
+ ["de"]="innermargindistance",
+ ["en"]="innermargindistance",
+ ["fr"]="innermargindistance",
+ ["it"]="innermargindistance",
+ ["nl"]="binnenmargeafstand",
+ ["pe"]="Ùاصله‌Øاشیه‌داخلی",
+ ["ro"]="innermargindistance",
+ },
+ ["innermarginwidth"]={
+ ["cs"]="innermarginwidth",
+ ["de"]="innermarginwidth",
+ ["en"]="innermarginwidth",
+ ["fr"]="innermarginwidth",
+ ["it"]="innermarginwidth",
+ ["nl"]="binnenmargebreedte",
+ ["pe"]="عرض‌Øاشیه‌داخلی",
+ ["ro"]="innermarginwidth",
+ },
+ ["inothermargin"]={
+ ["cs"]="nadruhyokraj",
+ ["de"]="inanderermarginale",
+ ["en"]="inothermargin",
+ ["fr"]="dansautremarge",
+ ["it"]="inaltromargine",
+ ["nl"]="inanderemarge",
+ ["pe"]="درØاشیه‌دیگر",
+ ["ro"]="inaltamargine",
+ },
+ ["inouter"]={
+ ["cs"]="inouter",
+ ["de"]="inouter",
+ ["en"]="inouter",
+ ["fr"]="inouter",
+ ["it"]="inouter",
+ ["nl"]="inbuiten",
+ ["pe"]="درخارجی",
+ ["ro"]="inouter",
+ },
+ ["inright"]={
+ ["cs"]="vpravo",
+ ["de"]="imrechten",
+ ["en"]="inright",
+ ["fr"]="dansdroite",
+ ["it"]="indestra",
+ ["nl"]="inrechter",
+ ["pe"]="درراست",
+ ["ro"]="indreapta",
+ },
+ ["inrightedge"]={
+ ["cs"]="napravo",
+ ["de"]="imrechtenrand",
+ ["en"]="inrightedge",
+ ["fr"]="dansborddroit",
+ ["it"]="inlatodestro",
+ ["nl"]="inrechterrand",
+ ["pe"]="درلبه‌راست",
+ ["ro"]="inparteadreapta",
+ },
+ ["inrightmargin"]={
+ ["cs"]="napravyokraj",
+ ["de"]="inrechtermarginale",
+ ["en"]="inrightmargin",
+ ["fr"]="dansmargedroite",
+ ["it"]="inmarginedestro",
+ ["nl"]="inrechtermarge",
+ ["pe"]="درØاشیه‌راست",
+ ["ro"]="inmargineadreapta",
+ },
+ ["installlanguage"]={
+ ["cs"]="instalacejazyka",
+ ["de"]="installieresprache",
+ ["en"]="installlanguage",
+ ["fr"]="installelangue",
+ ["it"]="installalingua",
+ ["nl"]="installeertaal",
+ ["pe"]="نصب‌زبان",
+ ["ro"]="instalarelimba",
+ },
+ ["interactionbar"]={
+ ["cs"]="interakcnilista",
+ ["de"]="interaktionsbalken",
+ ["en"]="interactionbar",
+ ["fr"]="barreinteraction",
+ ["it"]="barrainterazione",
+ ["nl"]="interactiebalk",
+ ["pe"]="میله‌پانل",
+ ["ro"]="barainteractiune",
+ },
+ ["interactionbuttons"]={
+ ["cs"]="interakcnitlacitka",
+ ["de"]="interaktionsknopfe",
+ ["en"]="interactionbuttons",
+ ["fr"]="boutonsinteraction",
+ ["it"]="pulsantinterazione",
+ ["nl"]="interactiebuttons",
+ ["pe"]="دکمه‌پانل",
+ ["ro"]="butoaneinteractiune",
+ },
+ ["interactionmenu"]={
+ ["cs"]="interaktivnimenu",
+ ["de"]="interaktionsmenue",
+ ["en"]="interactionmenu",
+ ["fr"]="menuinteraction",
+ ["it"]="menuinterattivo",
+ ["nl"]="interactiemenu",
+ ["pe"]="منوی‌پانل",
+ ["ro"]="meniuinteractiune",
+ },
+ ["item"]={
+ ["cs"]="polozka",
+ ["de"]="pos",
+ ["en"]="item",
+ ["fr"]="element",
+ ["it"]="elemento",
+ ["nl"]="som",
+ ["pe"]="آیتم",
+ ["ro"]="element",
+ },
+ ["items"]={
+ ["cs"]="polozky",
+ ["de"]="posten",
+ ["en"]="items",
+ ["fr"]="elements",
+ ["it"]="elementi",
+ ["nl"]="items",
+ ["pe"]="آیتمها",
+ ["ro"]="element",
+ },
+ ["its"]={
+ ["cs"]="pol",
+ ["de"]="its",
+ ["en"]="its",
+ ["fr"]="el",
+ ["it"]="el",
+ ["nl"]="its",
+ ["pe"]="its",
+ ["ro"]="el",
+ },
+ ["keepblocks"]={
+ ["cs"]="zachovejbloky",
+ ["de"]="behaltebloecke",
+ ["en"]="keepblocks",
+ ["fr"]="gardeblocs",
+ ["it"]="tieniblocchi",
+ ["nl"]="handhaafblokken",
+ ["pe"]="ØÙظ‌بلوکها",
+ ["ro"]="pastreazablocuri",
+ },
+ ["label"]={
+ ["cs"]="poppisek",
+ ["de"]="label",
+ ["en"]="label",
+ ["fr"]="etiquette",
+ ["it"]="etichetta",
+ ["nl"]="label",
+ ["pe"]="برچسب",
+ ["ro"]="eticheta",
+ },
+ ["labels"]={
+ ["cs"]="popisky",
+ ["de"]="labels",
+ ["en"]="labels",
+ ["fr"]="etiquettes",
+ ["it"]="etichette",
+ ["nl"]="labels",
+ ["pe"]="برچسبها",
+ ["ro"]="etichete",
+ },
+ ["labeltext"]={
+ ["cs"]="textpopisku",
+ ["de"]="labeltext",
+ ["en"]="labeltext",
+ ["fr"]="labeltexte",
+ ["it"]="testoetichetta",
+ ["nl"]="labeltekst",
+ ["pe"]="متن‌برچسب",
+ ["ro"]="texteticheta",
+ },
+ ["language"]={
+ ["cs"]="jazyk",
+ ["de"]="sprache",
+ ["en"]="language",
+ ["fr"]="langue",
+ ["it"]="lingua",
+ ["nl"]="taal",
+ ["pe"]="زبان",
+ ["ro"]="limba",
+ },
+ ["leftaligned"]={
+ ["cs"]="zarovnanovlevo",
+ ["de"]="linksbuendig",
+ ["en"]="leftaligned",
+ ["fr"]="aligneagauche",
+ ["it"]="allineasinistra",
+ ["nl"]="regellinks",
+ ["pe"]="چپ‌چین",
+ ["ro"]="aliniatstanga",
+ },
+ ["leftedgedistance"]={
+ ["cs"]="vzdalenostlevehookraje",
+ ["de"]="abstandlinkerrand",
+ ["en"]="leftedgedistance",
+ ["fr"]="distancebordgauche",
+ ["it"]="distanzabordosinistro",
+ ["nl"]="linkerrandafstand",
+ ["pe"]="Ùاصله‌لبه‌چپ",
+ ["ro"]="distantacoltstanga",
+ },
+ ["leftedgewidth"]={
+ ["cs"]="sirkalevehookraje",
+ ["de"]="breitelinkerrand",
+ ["en"]="leftedgewidth",
+ ["fr"]="largeurbordgauche",
+ ["it"]="ampiezzabordosinistro",
+ ["nl"]="linkerrandbreedte",
+ ["pe"]="عرض‌لبه‌چپ",
+ ["ro"]="latimecoltstanga",
+ },
+ ["leftmargindistance"]={
+ ["cs"]="vzdalenostlevemarginalie",
+ ["de"]="linkemarginalafstand",
+ ["en"]="leftmargindistance",
+ ["fr"]="distancemargegauche",
+ ["it"]="distanzamarginesinistro",
+ ["nl"]="linkermargeafstand",
+ ["pe"]="Ùاصله‌Øاشیه‌چپ",
+ ["ro"]="distantamarginestanga",
+ },
+ ["leftmarginwidth"]={
+ ["cs"]="sirkalevemarginalie",
+ ["de"]="linkemarginalbreite",
+ ["en"]="leftmarginwidth",
+ ["fr"]="largeurmargegauche",
+ ["it"]="ampiezzamarginesinistro",
+ ["nl"]="linkermargebreedte",
+ ["pe"]="عرض‌Øاشیه‌چپ",
+ ["ro"]="latimemarginestanga",
+ },
+ ["leg"]={
+ ["cs"]="leg",
+ ["de"]="leg",
+ ["en"]="leg",
+ ["fr"]="leg",
+ ["it"]="leg",
+ ["nl"]="leg",
+ ["pe"]="پا",
+ ["ro"]="leg",
+ },
+ ["linewidth"]={
+ ["cs"]="tloustkacary",
+ ["de"]="liniendicke",
+ ["en"]="linethickness",
+ ["fr"]="largeurligne",
+ ["it"]="spessoreriga",
+ ["nl"]="lijndikte",
+ ["pe"]="عرض‌خط",
+ ["ro"]="grosimelinie",
+ },
+ ["listheight"]={
+ ["cs"]="vyskaseznamu",
+ ["de"]="listenhoehe",
+ ["en"]="listheight",
+ ["fr"]="hauteurliste",
+ ["it"]="altezzaelenco",
+ ["nl"]="lijsthoogte",
+ ["pe"]="ارتÙاع‌خط",
+ ["ro"]="inaltimelista",
+ },
+ ["listlength"]={
+ ["cs"]="delkaseznamu",
+ ["de"]="listenlaenge",
+ ["en"]="listlength",
+ ["fr"]="llongueurliste",
+ ["it"]="lunghezzaelenco",
+ ["nl"]="lijstlengte",
+ ["pe"]="طول‌لیست",
+ ["ro"]="lungimelista",
+ },
+ ["listsymbol"]={
+ ["cs"]="listsymbol",
+ ["de"]="listsymbol",
+ ["en"]="listsymbol",
+ ["fr"]="listesymbole",
+ ["it"]="listsymbol",
+ ["nl"]="lijstsymbool",
+ ["pe"]="نمادلیست",
+ ["ro"]="listsymbol",
+ },
+ ["listwidth"]={
+ ["cs"]="sirkaseznamu",
+ ["de"]="listenbreite",
+ ["en"]="listwidth",
+ ["fr"]="largeurliste",
+ ["it"]="ampiezzaelenco",
+ ["nl"]="lijstbreedte",
+ ["pe"]="عرض‌لیست",
+ ["ro"]="latimelista",
+ },
+ ["logfields"]={
+ ["cs"]="zaznamovepole",
+ ["de"]="registrierefelder",
+ ["en"]="logfields",
+ ["fr"]="logchamp",
+ ["it"]="logcampi",
+ ["nl"]="registreervelden",
+ ["pe"]="میدانهای‌گزارش",
+ ["ro"]="logcampuri",
+ },
+ ["lohi"]={
+ ["cs"]="nivy",
+ ["de"]="tiho",
+ ["en"]="lohi",
+ ["fr"]="baha",
+ ["it"]="pedap",
+ ["nl"]="laho",
+ ["pe"]="پابا",
+ ["ro"]="jossus",
+ },
+ ["low"]={
+ ["cs"]="nizky",
+ ["de"]="tief",
+ ["en"]="low",
+ ["fr"]="bas",
+ ["it"]="ped",
+ ["nl"]="laag",
+ ["pe"]="پایین",
+ ["ro"]="jos",
+ },
+ ["macroname"]={
+ ["cs"]="jmeno",
+ ["de"]="name",
+ ["en"]="name",
+ ["fr"]="nommacro",
+ ["it"]="nome",
+ ["nl"]="naam",
+ ["pe"]="نام‌ماکرو",
+ ["ro"]="nume",
+ },
+ ["mainlanguage"]={
+ ["cs"]="hlavnijazyk",
+ ["de"]="hauptsprache",
+ ["en"]="mainlanguage",
+ ["fr"]="langueprincipale",
+ ["it"]="linguaprincipale",
+ ["nl"]="hoofdtaal",
+ ["pe"]="زبان‌اصلی",
+ ["ro"]="limbaprincipala",
+ },
+ ["makeupheight"]={
+ ["cs"]="vyskasazby",
+ ["de"]="satzhoehe",
+ ["en"]="makeupheight",
+ ["fr"]="hauteurmakeup",
+ ["it"]="altezzamakeup",
+ ["nl"]="zethoogte",
+ ["pe"]="ارتÙاع‌آرایش",
+ ["ro"]="inaltimemakeup",
+ },
+ ["makeupwidth"]={
+ ["cs"]="sirkasazby",
+ ["de"]="satzbreite",
+ ["en"]="makeupwidth",
+ ["fr"]="largeurmakeup",
+ ["it"]="ampiezzamakeup",
+ ["nl"]="zetbreedte",
+ ["pe"]="عرض‌آرایش",
+ ["ro"]="latimemakeup",
+ },
+ ["mar"]={
+ ["cs"]="okr",
+ ["de"]="mar",
+ ["en"]="mar",
+ ["fr"]="mar",
+ ["it"]="mar",
+ ["nl"]="mar",
+ ["pe"]="Øاش",
+ ["ro"]="mar",
+ },
+ ["margindistance"]={
+ ["cs"]="vzdalenostmarginalie",
+ ["de"]="marginalafstand",
+ ["en"]="margindistance",
+ ["fr"]="distancemarge",
+ ["it"]="distanzamargine",
+ ["nl"]="margeafstand",
+ ["pe"]="Ùاصله‌Øاشیه",
+ ["ro"]="distantamargine",
+ },
+ ["marginrule"]={
+ ["cs"]="marginalnilinka",
+ ["de"]="marginallinie",
+ ["en"]="marginrule",
+ ["fr"]="margereglee",
+ ["it"]="lineamargine",
+ ["nl"]="kantlijn",
+ ["pe"]="خط‌Øاشیه",
+ ["ro"]="liniemargine",
+ },
+ ["margintext"]={
+ ["cs"]="marginalnitext",
+ ["de"]="marginaltext",
+ ["en"]="margintext",
+ ["fr"]="textemarge",
+ ["it"]="testoinmargine",
+ ["nl"]="margetekst",
+ ["pe"]="متن‌Øاشیه",
+ ["ro"]="textmarginal",
+ },
+ ["margintitle"]={
+ ["cs"]="marginalninadpis",
+ ["de"]="marginaltitel",
+ ["en"]="margintitle",
+ ["fr"]="titremarge",
+ ["it"]="titoloinmargine",
+ ["nl"]="margetitel",
+ ["pe"]="عنوان‌Øاشیه",
+ ["ro"]="titlumarginal",
+ },
+ ["marginwidth"]={
+ ["cs"]="sirkamarginalie",
+ ["de"]="marginalbreite",
+ ["en"]="marginwidth",
+ ["fr"]="largeurmarge",
+ ["it"]="ampiezzamargine",
+ ["nl"]="margebreedte",
+ ["pe"]="عرض‌Øاشیه",
+ ["ro"]="latimemargine",
+ },
+ ["marginword"]={
+ ["cs"]="marginalnislovo",
+ ["de"]="marginalwort",
+ ["en"]="marginword",
+ ["fr"]="motmarge",
+ ["it"]="parolainmargine",
+ ["nl"]="margewoord",
+ ["pe"]="کلمه‌Øاشیه",
+ ["ro"]="cuvantmarginal",
+ },
+ ["marking"]={
+ ["cs"]="znaceni",
+ ["de"]="beschriftung",
+ ["en"]="marking",
+ ["fr"]="marquage",
+ ["it"]="marcatura",
+ ["nl"]="markeer",
+ ["pe"]="نشانه‌گذاری",
+ ["ro"]="marcaje",
+ },
+ ["markversion"]={
+ ["cs"]="oznacverzi",
+ ["de"]="beschrifteversion",
+ ["en"]="markversion",
+ ["fr"]="marquageversion",
+ ["it"]="marcaversione",
+ ["nl"]="markeerversie",
+ ["pe"]="نسخه‌نشانه",
+ ["ro"]="marcheazaversiune",
+ },
+ ["mathematics"]={
+ ["cs"]="matematika",
+ ["de"]="mathematik",
+ ["en"]="mathematics",
+ ["fr"]="mathematique",
+ ["it"]="matematica",
+ ["nl"]="wiskunde",
+ ["pe"]="ریاضی",
+ ["ro"]="matematica",
+ },
+ ["menubutton"]={
+ ["cs"]="tlacitkomenu",
+ ["de"]="menueknopf",
+ ["en"]="menubutton",
+ ["fr"]="boutonmenu",
+ ["it"]="pulsantemenu",
+ ["nl"]="menubutton",
+ ["pe"]="دکمه‌منو",
+ ["ro"]="butonmeniu",
+ },
+ ["mframed"]={
+ ["cs"]="maoramovani",
+ ["de"]="maumrise",
+ ["en"]="maframed",
+ ["fr"]="mframed",
+ ["it"]="maframed",
+ ["nl"]="wilijnd",
+ ["pe"]="mframed",
+ ["ro"]="maframed",
+ },
+ ["midaligned"]={
+ ["cs"]="zarovnanonastred",
+ ["de"]="zentriert",
+ ["en"]="midaligned",
+ ["fr"]="aligneaumilieu",
+ ["it"]="allineacentro",
+ ["nl"]="regelmidden",
+ ["pe"]="تنظیم‌وسط",
+ ["ro"]="aliniatcentru",
+ },
+ ["mirror"]={
+ ["cs"]="zrcadlit",
+ ["de"]="spiegeln",
+ ["en"]="mirror",
+ ["fr"]="reflete",
+ ["it"]="riflessione",
+ ["nl"]="spiegel",
+ ["pe"]="آینه",
+ ["ro"]="reflexie",
+ },
+ ["month"]={
+ ["cs"]="mesic",
+ ["de"]="monat",
+ ["en"]="month",
+ ["fr"]="mois",
+ ["it"]="mese",
+ ["nl"]="maand",
+ ["pe"]="ماه",
+ ["ro"]="luna",
+ },
+ ["moveformula"]={
+ ["cs"]="moveformula",
+ ["de"]="moveformula",
+ ["en"]="moveformula",
+ ["fr"]="deplaceformule",
+ ["it"]="spostaformula",
+ ["nl"]="verplaatsformule",
+ ["pe"]="انتقال‌Ùرمول",
+ ["ro"]="moveformula",
+ },
+ ["moveongrid"]={
+ ["cs"]="premistinamrizku",
+ ["de"]="amgitterneuausrichten",
+ ["en"]="moveongrid",
+ ["fr"]="deplacesurgrille",
+ ["it"]="spostaagriglia",
+ ["nl"]="verplaatsopgrid",
+ ["pe"]="انتقال‌به‌توری",
+ ["ro"]="mutapegrid",
+ },
+ ["movesidefloat"]={
+ ["cs"]="movesidefloat",
+ ["de"]="movesidefloat",
+ ["en"]="movesidefloat",
+ ["fr"]="movesidefloat",
+ ["it"]="movesidefloat",
+ ["nl"]="verplaatszijblok",
+ ["pe"]="انتقال‌کنار‌شناور",
+ ["ro"]="movesidefloat",
+ },
+ ["navigating"]={
+ ["cs"]="navigating",
+ ["de"]="navigating",
+ ["en"]="navigating",
+ ["fr"]="navigating",
+ ["it"]="navigating",
+ ["nl"]="navigerend",
+ ["pe"]="هدایت",
+ ["ro"]="navigating",
+ },
+ ["nodimension"]={
+ ["cs"]="zadnyrozmer",
+ ["de"]="keindimension",
+ ["en"]="nodimension",
+ ["fr"]="sansdimension",
+ ["it"]="nientedimensioni",
+ ["nl"]="geendimensie",
+ ["pe"]="بدون‌بعد",
+ ["ro"]="faradimensiune",
+ },
+ ["noheaderandfooterlines"]={
+ ["cs"]="zadnezahlaviaupati",
+ ["de"]="keinekopfundfusszeilen",
+ ["en"]="noheaderandfooterlines",
+ ["fr"]="sanslignesenteteetpdp",
+ ["it"]="nientelineintestazionepdp",
+ ["nl"]="geenhoofdenvoetregels",
+ ["pe"]="بدون‌خط‌سروته‌برگ",
+ ["ro"]="faraliniiantetsisubsol",
+ },
+ ["noindenting"]={
+ ["cs"]="zadneodsazovani",
+ ["de"]="nichteinziehen",
+ ["en"]="noindenting",
+ ["fr"]="sansalinea",
+ ["it"]="nienterientro",
+ ["nl"]="nietinspringen",
+ ["pe"]="بدون‌تورÙتگی",
+ ["ro"]="faraaliniat",
+ },
+ ["nolist"]={
+ ["cs"]="zadnyseznam",
+ ["de"]="keineliste",
+ ["en"]="nolist",
+ ["fr"]="sansliste",
+ ["it"]="nienteelenco",
+ ["nl"]="geenlijst",
+ ["pe"]="بدون‌لیست",
+ ["ro"]="faralista",
+ },
+ ["nomarking"]={
+ ["cs"]="zadneznaceni",
+ ["de"]="keinebeschriftung",
+ ["en"]="nomarking",
+ ["fr"]="sansmarquage",
+ ["it"]="nientemarcatura",
+ ["nl"]="geenmarkering",
+ ["pe"]="بدون‌نشانه‌گذاری",
+ ["ro"]="faramarcaje",
+ },
+ ["nomoreblocks"]={
+ ["cs"]="zadnedalsibloky",
+ ["de"]="keinebloeckemehr",
+ ["en"]="nomoreblocks",
+ ["fr"]="pasplusdeblocs",
+ ["it"]="bastablocchi",
+ ["nl"]="geenblokkenmeer",
+ ["pe"]="بدون‌بلوکهای‌بیشتر",
+ ["ro"]="gatablocuri",
+ },
+ ["nomorefiles"]={
+ ["cs"]="zadnedalsisoubory",
+ ["de"]="keinedateienmehr",
+ ["en"]="nomorefiles",
+ ["fr"]="pasplusdefichiers",
+ ["it"]="bastafile",
+ ["nl"]="geenfilesmeer",
+ ["pe"]="بدون‌Ùایلهای‌بیشتر",
+ ["ro"]="farafisiere",
+ },
+ ["nop"]={
+ ["cs"]="nop",
+ ["de"]="nop",
+ ["en"]="nop",
+ ["fr"]="nop",
+ ["it"]="nop",
+ ["nl"]="nop",
+ ["pe"]="منÙÛŒ",
+ ["ro"]="nop",
+ },
+ ["nospace"]={
+ ["cs"]="zadnamezera",
+ ["de"]="keinspatium",
+ ["en"]="nospace",
+ ["fr"]="sansespace",
+ ["it"]="nientespazio",
+ ["nl"]="geenspatie",
+ ["pe"]="بدون‌Ùضا",
+ ["ro"]="faraspatiu",
+ },
+ ["note"]={
+ ["cs"]="poznamka",
+ ["de"]="notiz",
+ ["en"]="note",
+ ["fr"]="note",
+ ["it"]="nota",
+ ["nl"]="noot",
+ ["pe"]="یادداشت",
+ ["ro"]="nota",
+ },
+ ["notopandbottomlines"]={
+ ["cs"]="zadnehorniadolniradky",
+ ["de"]="keinzeilenobenundunten",
+ ["en"]="notopandbottomlines",
+ ["fr"]="sanslignessupetinf",
+ ["it"]="nientelineecimafondo",
+ ["nl"]="geenbovenenonderregels",
+ ["pe"]="بدون‌خط‌بالاوپایین",
+ ["ro"]="faraliniisussijos",
+ },
+ ["notsmallcapped"]={
+ ["cs"]="nokap",
+ ["de"]="nokap",
+ ["en"]="nocap",
+ ["fr"]="nocap",
+ ["it"]="nocap",
+ ["nl"]="nokap",
+ ["pe"]="سرپوش‌کوچک‌نه",
+ ["ro"]="nokap",
+ },
+ ["nowhitespace"]={
+ ["cs"]="zadnebilemisto",
+ ["de"]="keinzwischenraum",
+ ["en"]="nowhitespace",
+ ["fr"]="sansespaceblanc",
+ ["it"]="nientespaziobianco",
+ ["nl"]="geenwitruimte",
+ ["pe"]="بدون‌Ùضای‌سÙید",
+ ["ro"]="faraspatiualb",
+ },
+ ["numberofsubpages"]={
+ ["cs"]="numberofsubpages",
+ ["de"]="numberofsubpages",
+ ["en"]="numberofsubpages",
+ ["fr"]="nombredesouspages",
+ ["it"]="numberofsubpages",
+ ["nl"]="aantalsubpaginas",
+ ["pe"]="شماره‌زیرصÙØÙ‡",
+ ["ro"]="numberofsubpages",
+ },
+ ["numbers"]={
+ ["cs"]="cisla",
+ ["de"]="ziffern",
+ ["en"]="numbers",
+ ["fr"]="numeros",
+ ["it"]="numeri",
+ ["nl"]="cijfers",
+ ["pe"]="شماره‌ها",
+ ["ro"]="numere",
+ },
+ ["outeredgedistance"]={
+ ["cs"]="outeredgedistance",
+ ["de"]="outeredgedistance",
+ ["en"]="outeredgedistance",
+ ["fr"]="outeredgedistance",
+ ["it"]="outeredgedistance",
+ ["nl"]="buitenrandafstand",
+ ["pe"]="Ùاصله‌لبه‌خارجی",
+ ["ro"]="outeredgedistance",
+ },
+ ["outeredgewidth"]={
+ ["cs"]="outeredgewidth",
+ ["de"]="outeredgewidth",
+ ["en"]="outeredgewidth",
+ ["fr"]="outeredgewidth",
+ ["it"]="outeredgewidth",
+ ["nl"]="buitenrandbreedte",
+ ["pe"]="عرض‌لبه‌خارجی",
+ ["ro"]="outeredgewidth",
+ },
+ ["outermargindistance"]={
+ ["cs"]="outermargindistance",
+ ["de"]="outermargindistance",
+ ["en"]="outermargindistance",
+ ["fr"]="outermargindistance",
+ ["it"]="outermargindistance",
+ ["nl"]="buitenmargeafstand",
+ ["pe"]="Ùاصله‌Øاشیه‌خارجی",
+ ["ro"]="outermargindistance",
+ },
+ ["outermarginwidth"]={
+ ["cs"]="outermarginwidth",
+ ["de"]="outermarginwidth",
+ ["en"]="outermarginwidth",
+ ["fr"]="outermarginwidth",
+ ["it"]="outermarginwidth",
+ ["nl"]="buitenmargebreedte",
+ ["pe"]="عرض‌Øاشیه‌خارجی",
+ ["ro"]="outermarginwidth",
+ },
+ ["overbar"]={
+ ["cs"]="nadtrzeno",
+ ["de"]="ueberstrichen",
+ ["en"]="overbar",
+ ["fr"]="overbar",
+ ["it"]="sopralinea",
+ ["nl"]="overstreep",
+ ["pe"]="میله‌رو",
+ ["ro"]="barasus",
+ },
+ ["overbars"]={
+ ["cs"]="nadtrzeni",
+ ["de"]="ueberstreichen",
+ ["en"]="overbars",
+ ["fr"]="overbars",
+ ["it"]="sopralinee",
+ ["nl"]="overstrepen",
+ ["pe"]="میله‌ها‌رو",
+ ["ro"]="supralinie",
+ },
+ ["overstrike"]={
+ ["cs"]="preskrtnuto",
+ ["de"]="durchgestrichen",
+ ["en"]="overstrike",
+ ["fr"]="surlignetout",
+ ["it"]="sbarrato",
+ ["nl"]="doorstreep",
+ ["pe"]="خط‌زدن",
+ ["ro"]="liniepeste",
+ },
+ ["overstrikes"]={
+ ["cs"]="preskrtnuti",
+ ["de"]="durchstreichen",
+ ["en"]="overstrikes",
+ ["fr"]="surligne",
+ ["it"]="sbarrati",
+ ["nl"]="doorstrepen",
+ ["pe"]="خط‌زدنها",
+ ["ro"]="liniipeste",
+ },
+ ["packed"]={
+ ["cs"]="zhustene",
+ ["de"]="kleinerdurchschuss",
+ ["en"]="packed",
+ ["fr"]="groupe",
+ ["it"]="impaccato",
+ ["nl"]="opelkaar",
+ ["pe"]="Ùشرده",
+ ["ro"]="impachetat",
+ },
+ ["page"]={
+ ["cs"]="strana",
+ ["de"]="seite",
+ ["en"]="page",
+ ["fr"]="page",
+ ["it"]="pagina",
+ ["nl"]="pagina",
+ ["pe"]="صÙØÙ‡",
+ ["ro"]="pagina",
+ },
+ ["pagedepth"]={
+ ["cs"]="pagedepth",
+ ["de"]="pagedepth",
+ ["en"]="pagedepth",
+ ["fr"]="pagedepth",
+ ["it"]="pagedepth",
+ ["nl"]="paginadiepte",
+ ["pe"]="عمق‌صÙØÙ‡",
+ ["ro"]="pagedepth",
+ },
+ ["pagenumber"]={
+ ["cs"]="cislostrany",
+ ["de"]="seitenummer",
+ ["en"]="pagenumber",
+ ["fr"]="numeropage",
+ ["it"]="numeropagina",
+ ["nl"]="paginanummer",
+ ["pe"]="شماره‌صÙØÙ‡",
+ ["ro"]="numarpagina",
+ },
+ ["pageoffset"]={
+ ["cs"]="pageoffset",
+ ["de"]="pageoffset",
+ ["en"]="pageoffset",
+ ["fr"]="pageoffset",
+ ["it"]="pageoffset",
+ ["nl"]="paginaoffset",
+ ["pe"]="Ø¢Ùست‌صÙØÙ‡",
+ ["ro"]="pageoffset",
+ },
+ ["pagereference"]={
+ ["cs"]="odkaznastranu",
+ ["de"]="seitenreferenz",
+ ["en"]="pagereference",
+ ["fr"]="referencepage",
+ ["it"]="riferimentopagina",
+ ["nl"]="paginareferentie",
+ ["pe"]="مرجع‌صÙØÙ‡",
+ ["ro"]="referintapagina",
+ },
+ ["pagetype"]={
+ ["cs"]="typstrany",
+ ["de"]="seitentyp",
+ ["en"]="pagetype",
+ ["fr"]="tapepage",
+ ["it"]="tipopagina",
+ ["nl"]="soortpagina",
+ ["pe"]="نوع‌صÙØÙ‡",
+ ["ro"]="tippagina",
+ },
+ ["paperheight"]={
+ ["cs"]="vyskapapiru",
+ ["de"]="papierhoehe",
+ ["en"]="paperheight",
+ ["fr"]="hauteurpapier",
+ ["it"]="altezzacarta",
+ ["nl"]="papierhoogte",
+ ["pe"]="ارتÙاع‌برگ",
+ ["ro"]="inaltimehartie",
+ },
+ ["paperwidth"]={
+ ["cs"]="sirkapapiru",
+ ["de"]="papierbreite",
+ ["en"]="paperwidth",
+ ["fr"]="largeurpapier",
+ ["it"]="ampiezzacarta",
+ ["nl"]="papierbreedte",
+ ["pe"]="عرض‌برگ",
+ ["ro"]="latimehartie",
+ },
+ ["periods"]={
+ ["cs"]="tecky",
+ ["de"]="punkt",
+ ["en"]="periods",
+ ["fr"]="periodes",
+ ["it"]="punti",
+ ["nl"]="punten",
+ ["pe"]="نقطه‌ها",
+ ["ro"]="puncte",
+ },
+ ["plaatsruwelijst"]={
+ ["cs"]="placerawlist",
+ ["de"]="placerawlist",
+ ["en"]="placerawlist",
+ ["fr"]="placerawlist",
+ ["it"]="placerawlist",
+ ["nl"]="plaatsruwelijst",
+ ["pe"]="درج‌لیست‌خام",
+ ["ro"]="placerawlist",
+ },
+ ["placebookmarks"]={
+ ["cs"]="umistizalozky",
+ ["de"]="platzierebookmarks",
+ ["en"]="placebookmarks",
+ ["fr"]="placemarquespages",
+ ["it"]="mettisegnalibro",
+ ["nl"]="plaatsbookmarks",
+ ["pe"]="درج‌چوب‌خط",
+ ["ro"]="plaseazasemnecarte",
+ },
+ ["placecombinedlist"]={
+ ["cs"]="umistikombinovanyseznam",
+ ["de"]="platzierezusammengestellteliste",
+ ["en"]="placecombinedlist",
+ ["fr"]="placelisteinmbriquee",
+ ["it"]="mettielencocombinato",
+ ["nl"]="plaatssamengesteldelijst",
+ ["pe"]="درج‌لیست‌مختلط",
+ ["ro"]="punelistacombinata",
+ },
+ ["placefloat"]={
+ ["cs"]="placefloat",
+ ["de"]="placefloat",
+ ["en"]="placefloat",
+ ["fr"]="placeflottant",
+ ["it"]="placefloat",
+ ["nl"]="plaatsplaatsblok",
+ ["pe"]="درج‌شناور",
+ ["ro"]="placefloat",
+ },
+ ["placefootnotes"]={
+ ["cs"]="umistipoznamkypodcarou",
+ ["de"]="platzierefussnoten",
+ ["en"]="placefootnotes",
+ ["fr"]="placenotespdp",
+ ["it"]="mettinotepdp",
+ ["nl"]="plaatsvoetnoten",
+ ["pe"]="درج‌پانوشتها",
+ ["ro"]="punenotesubsol",
+ },
+ ["placeformula"]={
+ ["cs"]="umistirovnici",
+ ["de"]="platziereformel",
+ ["en"]="placeformula",
+ ["fr"]="placeformule",
+ ["it"]="mettiformula",
+ ["nl"]="plaatsformule",
+ ["pe"]="درج‌Ùرمول",
+ ["ro"]="puneformula",
+ },
+ ["placeheadnumber"]={
+ ["cs"]="placeheadnumber",
+ ["de"]="placeheadnumber",
+ ["en"]="placeheadnumber",
+ ["fr"]="placenumerotete",
+ ["it"]="posizionanumerotesta",
+ ["nl"]="plaatskopnummer",
+ ["pe"]="درج‌شماره‌سر",
+ ["ro"]="placeheadnumber",
+ },
+ ["placeheadtext"]={
+ ["cs"]="placeheadtext",
+ ["de"]="placeheadtext",
+ ["en"]="placeheadtext",
+ ["fr"]="placetextetete",
+ ["it"]="posizionatestotesta",
+ ["nl"]="plaatskoptekst",
+ ["pe"]="درج‌متن‌سر",
+ ["ro"]="placeheadtext",
+ },
+ ["placelegend"]={
+ ["cs"]="umistilegendu",
+ ["de"]="platzierelegende",
+ ["en"]="placelegend",
+ ["fr"]="placelegende",
+ ["it"]="mettilegenda",
+ ["nl"]="plaatslegenda",
+ ["pe"]="درج‌راهنما",
+ ["ro"]="punelegenda",
+ },
+ ["placelist"]={
+ ["cs"]="umistiseznam",
+ ["de"]="platziereliste",
+ ["en"]="placelist",
+ ["fr"]="placeliste",
+ ["it"]="mettielenco",
+ ["nl"]="plaatslijst",
+ ["pe"]="درج‌لیست",
+ ["ro"]="punelista",
+ },
+ ["placelocalfootnotes"]={
+ ["cs"]="umistilokalnipoznamkypodcarou",
+ ["de"]="platzierelokalefussnoten",
+ ["en"]="placelocalfootnotes",
+ ["fr"]="placenotespdplocales",
+ ["it"]="mettinotepdplocali",
+ ["nl"]="plaatslokalevoetnoten",
+ ["pe"]="درج‌پانوشتهای‌موضعی",
+ ["ro"]="punenotesubsollocale",
+ },
+ ["placelogos"]={
+ ["cs"]="umistiloga",
+ ["de"]="platzierelogo",
+ ["en"]="placelogos",
+ ["fr"]="placelogos",
+ ["it"]="mettiloghi",
+ ["nl"]="plaatsbeeldmerken",
+ ["pe"]="درج‌آرمها",
+ ["ro"]="punelogouri",
+ },
+ ["placeongrid"]={
+ ["cs"]="umistinamrizku",
+ ["de"]="amgitterausrichten",
+ ["en"]="placeongrid",
+ ["fr"]="placesurgrille",
+ ["it"]="mettiingriglia",
+ ["nl"]="plaatsopgrid",
+ ["pe"]="درج‌در‌توری",
+ ["ro"]="plaseazapegrid",
+ },
+ ["placeontopofeachother"]={
+ ["cs"]="umistinadsebe",
+ ["de"]="platziereuntereinander",
+ ["en"]="placeontopofeachother",
+ ["fr"]="placelesunsaudessusdesautres",
+ ["it"]="mettiunosullaltro",
+ ["nl"]="plaatsonderelkaar",
+ ["pe"]="درج‌در‌بالای‌یکدیگر",
+ ["ro"]="punedeasuprafiecareia",
+ },
+ ["placepagenumber"]={
+ ["cs"]="placepagenumber",
+ ["de"]="placepagenumber",
+ ["en"]="placepagenumber",
+ ["fr"]="placenumeropage",
+ ["it"]="mettinumeropagina",
+ ["nl"]="plaatspaginanummer",
+ ["pe"]="درج‌شماره‌صÙØÙ‡",
+ ["ro"]="punenumarpagina",
+ },
+ ["placereferencelist"]={
+ ["cs"]="placereferencelist",
+ ["de"]="placereferencelist",
+ ["en"]="placereferencelist",
+ ["fr"]="placelistereference",
+ ["it"]="placereferencelist",
+ ["nl"]="plaatsreferentielijst",
+ ["pe"]="درج‌لیست‌مرجع",
+ ["ro"]="placereferencelist",
+ },
+ ["placeregister"]={
+ ["cs"]="umistirejstrik",
+ ["de"]="platziereregister",
+ ["en"]="placeregister",
+ ["fr"]="placeregistre",
+ ["it"]="mettiregistro",
+ ["nl"]="plaatsregister",
+ ["pe"]="درج‌ثبت",
+ ["ro"]="puneregistru",
+ },
+ ["placerule"]={
+ ["cs"]="placerule",
+ ["de"]="placerule",
+ ["en"]="placerule",
+ ["fr"]="placeregle",
+ ["it"]="mettilinea",
+ ["nl"]="plaatslijn",
+ ["pe"]="درج‌خط",
+ ["ro"]="punerigla",
+ },
+ ["placesidebyside"]={
+ ["cs"]="umistivedlesebe",
+ ["de"]="platzierenebeneinander",
+ ["en"]="placesidebyside",
+ ["fr"]="placecoteacote",
+ ["it"]="mettifiancoafianco",
+ ["nl"]="plaatsnaastelkaar",
+ ["pe"]="درج‌کنار‌به‌کنار",
+ ["ro"]="punefatainfata",
+ },
+ ["placesubformula"]={
+ ["cs"]="umistipodrovnici",
+ ["de"]="platziereunterformel",
+ ["en"]="placesubformula",
+ ["fr"]="placesousformule",
+ ["it"]="mettisottoformula",
+ ["nl"]="plaatssubformule",
+ ["pe"]="درج‌زیرÙرمول",
+ ["ro"]="punesubformula",
+ },
+ ["placetextvariable"]={
+ ["cs"]="placetextvariable",
+ ["de"]="placetextvariable",
+ ["en"]="placetextvariable",
+ ["fr"]="placevariabletexte",
+ ["it"]="mettivariabiletesto",
+ ["nl"]="plaatstekstvariabele",
+ ["pe"]="درج‌متغیرمتن",
+ ["ro"]="punevariabilatext",
+ },
+ ["position"]={
+ ["cs"]="pozice",
+ ["de"]="position",
+ ["en"]="position",
+ ["fr"]="position",
+ ["it"]="posizione",
+ ["nl"]="positioneer",
+ ["pe"]="مکان",
+ ["ro"]="pozitie",
+ },
+ ["positiontext"]={
+ ["cs"]="positiontext",
+ ["de"]="positiontext",
+ ["en"]="positiontext",
+ ["fr"]="positionnetexte",
+ ["it"]="posizionatesto",
+ ["nl"]="positioneertekst",
+ ["pe"]="مکان‌متن",
+ ["ro"]="pozitietext",
+ },
+ ["printpaperheight"]={
+ ["cs"]="vyskatiskpapiru",
+ ["de"]="printpapierhoehe",
+ ["en"]="printpaperheight",
+ ["fr"]="hauteureditionpapier",
+ ["it"]="altezzacartastampa",
+ ["nl"]="printpapierhoogte",
+ ["pe"]="چاپ‌ارتÙاع‌برگ",
+ ["ro"]="inaltimehartieimprimanta",
+ },
+ ["printpaperwidth"]={
+ ["cs"]="sirkatiskpapiru",
+ ["de"]="printpapierbreite",
+ ["en"]="printpaperwidth",
+ ["fr"]="largeureditionpapier",
+ ["it"]="ampiezzacartastampa",
+ ["nl"]="printpapierbreedte",
+ ["pe"]="چاپ‌عرض‌برگ",
+ ["ro"]="latimehartieimprimanta",
+ },
+ ["processblocks"]={
+ ["cs"]="zpracujbloky",
+ ["de"]="bearbeitebloecke",
+ ["en"]="processblocks",
+ ["fr"]="traiteblocs",
+ ["it"]="elaborablocchi",
+ ["nl"]="verwerkblokken",
+ ["pe"]="بلوکهای‌پردازش",
+ ["ro"]="proceseazabloc",
+ },
+ ["processpage"]={
+ ["cs"]="zpracujstranu",
+ ["de"]="bearbeiteseite",
+ ["en"]="processpage",
+ ["fr"]="traitepage",
+ ["it"]="elaborapagina",
+ ["nl"]="verwerkpagina",
+ ["pe"]="صÙØه‌پردازش",
+ ["ro"]="proceseazapagina",
+ },
+ ["product"]={
+ ["cs"]="produkt",
+ ["de"]="produkt",
+ ["en"]="product",
+ ["fr"]="produit",
+ ["it"]="prodotto",
+ ["nl"]="produkt",
+ ["pe"]="تولید",
+ ["ro"]="produs",
+ },
+ ["program"]={
+ ["cs"]="program",
+ ["de"]="programm",
+ ["en"]="program",
+ ["fr"]="programme",
+ ["it"]="programma",
+ ["nl"]="programma",
+ ["pe"]="برنامه",
+ ["ro"]="program",
+ },
+ ["project"]={
+ ["cs"]="projekt",
+ ["de"]="projekt",
+ ["en"]="project",
+ ["fr"]="projet",
+ ["it"]="progetto",
+ ["nl"]="projekt",
+ ["pe"]="پروژه",
+ ["ro"]="proiect",
+ },
+ ["publication"]={
+ ["cs"]="publikace",
+ ["de"]="publikation",
+ ["en"]="publication",
+ ["fr"]="publication",
+ ["it"]="pubblicazione",
+ ["nl"]="publicatie",
+ ["pe"]="نشر",
+ ["ro"]="publicatie",
+ },
+ ["quotation"]={
+ ["cs"]="citace",
+ ["de"]="zitat",
+ ["en"]="quotation",
+ ["fr"]="citation",
+ ["it"]="citazione",
+ ["nl"]="citaat",
+ ["pe"]="نقل‌قول",
+ ["ro"]="citat",
+ },
+ ["quote"]={
+ ["cs"]="citovat",
+ ["de"]="zitieren",
+ ["en"]="quote",
+ ["fr"]="citer",
+ ["it"]="menzione",
+ ["nl"]="citeer",
+ ["pe"]="نقل",
+ ["ro"]="minicitat",
+ },
+ ["ran"]={
+ ["cs"]="ran",
+ ["de"]="ran",
+ ["en"]="ran",
+ ["fr"]="ran",
+ ["it"]="ran",
+ ["nl"]="ran",
+ ["pe"]="ran",
+ ["ro"]="ran",
+ },
+ ["redo"]={
+ ["cs"]="opakovat",
+ ["de"]="wiederholen",
+ ["en"]="redo",
+ ["fr"]="refait",
+ ["it"]="rifai",
+ ["nl"]="herhaal",
+ ["pe"]="انجام‌دوباره",
+ ["ro"]="refa",
+ },
+ ["ref"]={
+ ["cs"]="ref",
+ ["de"]="ref",
+ ["en"]="ref",
+ ["fr"]="ref",
+ ["it"]="rif",
+ ["nl"]="ref",
+ ["pe"]="رج",
+ ["ro"]="ref",
+ },
+ ["reference"]={
+ ["cs"]="odkaz",
+ ["de"]="referenz",
+ ["en"]="reference",
+ ["fr"]="reference",
+ ["it"]="riferimento",
+ ["nl"]="referentie",
+ ["pe"]="مرجع",
+ ["ro"]="referinta",
+ },
+ ["referral"]={
+ ["cs"]="odkaz",
+ ["de"]="verweis",
+ ["en"]="referral",
+ ["fr"]="recommandation",
+ ["it"]="referral",
+ ["nl"]="kenmerk",
+ ["pe"]="رجوع",
+ ["ro"]="referit",
+ },
+ ["referraldate"]={
+ ["cs"]="odkaznadatum",
+ ["de"]="verweisdatum",
+ ["en"]="referraldate",
+ ["fr"]="daterecommandation",
+ ["it"]="datareferral",
+ ["nl"]="kenmerkdatum",
+ ["pe"]="تاریخ‌رجوع",
+ ["ro"]="datareferit",
+ },
+ ["referring"]={
+ ["cs"]="odkazujici",
+ ["de"]="referieren",
+ ["en"]="referring",
+ ["fr"]="faitreference",
+ ["it"]="referring",
+ ["nl"]="refereer",
+ ["pe"]="مراجعه",
+ ["ro"]="referring",
+ },
+ ["remark"]={
+ ["cs"]="oznaceni",
+ ["de"]="bemerkung",
+ ["en"]="remark",
+ ["fr"]="commentaire",
+ ["it"]="commento",
+ ["nl"]="toelichting",
+ ["pe"]="توجه",
+ ["ro"]="remarca",
+ },
+ ["reset"]={
+ ["cs"]="reset",
+ ["de"]="ruecksetzten",
+ ["en"]="reset",
+ ["fr"]="raz",
+ ["it"]="reimposta",
+ ["nl"]="reset",
+ ["pe"]="بازنشانی",
+ ["ro"]="reset",
+ },
+ ["resetmarking"]={
+ ["cs"]="resetznaceni",
+ ["de"]="ruecksetztenbeschriftung",
+ ["en"]="resetmarking",
+ ["fr"]="razmarquage",
+ ["it"]="reimpostamarcatura",
+ ["nl"]="resetmarkering",
+ ["pe"]="بازنشانی‌نشانه‌گذاری",
+ ["ro"]="reseteazamarcaje",
+ },
+ ["resetnumber"]={
+ ["cs"]="resetnumber",
+ ["de"]="resetnumber",
+ ["en"]="resetnumber",
+ ["fr"]="raznumero",
+ ["it"]="resetnumber",
+ ["nl"]="resetnummer",
+ ["pe"]="بازنشانی‌شماره",
+ ["ro"]="resetnumber",
+ },
+ ["resettext"]={
+ ["cs"]="resettextcontent",
+ ["de"]="resettextcontent",
+ ["en"]="resettextcontent",
+ ["fr"]="resettextcontent",
+ ["it"]="resettextcontent",
+ ["nl"]="resettekstinhoud",
+ ["pe"]="بازنشانی‌متن",
+ ["ro"]="resettextcontent",
+ },
+ ["rightaligned"]={
+ ["cs"]="zarovnanovpravo",
+ ["de"]="rechtsbuendig",
+ ["en"]="rightaligned",
+ ["fr"]="aligneadroite",
+ ["it"]="allineadestra",
+ ["nl"]="regelrechts",
+ ["pe"]="تنظیم‌راست",
+ ["ro"]="aliniatdreapta",
+ },
+ ["rightedgedistance"]={
+ ["cs"]="vzdalenostpravehookraje",
+ ["de"]="abstandrechterrand",
+ ["en"]="rightedgedistance",
+ ["fr"]="distanceborddroit",
+ ["it"]="distanzabordodestro",
+ ["nl"]="rechterrandafstand",
+ ["pe"]="Ùاصله‌لبه‌راست",
+ ["ro"]="distantacoltdreapta",
+ },
+ ["rightedgewidth"]={
+ ["cs"]="sirkapravehookraje",
+ ["de"]="breiterechterrand",
+ ["en"]="rightedgewidth",
+ ["fr"]="largeurborddroit",
+ ["it"]="ampiezzabordodestro",
+ ["nl"]="rechterrandbreedte",
+ ["pe"]="عرض‌لبه‌راست",
+ ["ro"]="latimecoltdreapta",
+ },
+ ["rightmargindistance"]={
+ ["cs"]="vzdalenostpravemarginalie",
+ ["de"]="rechtemarginalafstand",
+ ["en"]="rightmargindistance",
+ ["fr"]="distancemargedroite",
+ ["it"]="distanzamarginedestro",
+ ["nl"]="rechtermargeafstand",
+ ["pe"]="Ùاصله‌Øاشیه‌راست",
+ ["ro"]="distantamarginedreapta",
+ },
+ ["rightmarginwidth"]={
+ ["cs"]="sirkapravemarginalie",
+ ["de"]="rechtemarginalbreite",
+ ["en"]="rightmarginwidth",
+ ["fr"]="largeurmargedroite",
+ ["it"]="ampiezzamarginedestro",
+ ["nl"]="rechtermargebreedte",
+ ["pe"]="عرض‌Øاشیه‌راست",
+ ["ro"]="latimemarginedreapta",
+ },
+ ["romannumerals"]={
+ ["cs"]="rimskecislice",
+ ["de"]="roemischezahlen",
+ ["en"]="romannumerals",
+ ["fr"]="chiffresromains",
+ ["it"]="numeriromani",
+ ["nl"]="romeins",
+ ["pe"]="اعدادلاتین",
+ ["ro"]="numereromane",
+ },
+ ["rotate"]={
+ ["cs"]="otocit",
+ ["de"]="drehen",
+ ["en"]="rotate",
+ ["fr"]="oriente",
+ ["it"]="ruota",
+ ["nl"]="roteer",
+ ["pe"]="دوران",
+ ["ro"]="roteste",
+ },
+ ["scale"]={
+ ["cs"]="meritko",
+ ["de"]="format",
+ ["en"]="scale",
+ ["fr"]="echelle",
+ ["it"]="scala",
+ ["nl"]="schaal",
+ ["pe"]="مقیاس",
+ ["ro"]="scala",
+ },
+ ["screen"]={
+ ["cs"]="obrazovka",
+ ["de"]="bildschirm",
+ ["en"]="screen",
+ ["fr"]="ecran",
+ ["it"]="schermo",
+ ["nl"]="scherm",
+ ["pe"]="پرده",
+ ["ro"]="ecran",
+ },
+ ["selectblocks"]={
+ ["cs"]="vyberbloky",
+ ["de"]="waehlebloeckeaus",
+ ["en"]="selectblocks",
+ ["fr"]="selectionneblocs",
+ ["it"]="selezionablocchi",
+ ["nl"]="selecteerblokken",
+ ["pe"]="انتخاب‌بلوکها",
+ ["ro"]="selecteazablocuri",
+ },
+ ["selectpaper"]={
+ ["cs"]="vyberpapir",
+ ["de"]="waehlepapieraus",
+ ["en"]="selectpaper",
+ ["fr"]="selectionnepapier",
+ ["it"]="selezionacarta",
+ ["nl"]="selecteerpapier",
+ ["pe"]="انتخاب‌برگ",
+ ["ro"]="selecteazahartie",
+ },
+ ["selectversion"]={
+ ["cs"]="vyberverzi",
+ ["de"]="waehleversionaus",
+ ["en"]="selectversion",
+ ["fr"]="selectionneversion",
+ ["it"]="selezionaversione",
+ ["nl"]="selecteerversie",
+ ["pe"]="انتخاب‌نسخه",
+ ["ro"]="selecteazaversiune",
+ },
+ ["setnumber"]={
+ ["cs"]="setnumber",
+ ["de"]="setnumber",
+ ["en"]="setnumber",
+ ["fr"]="affectenumero",
+ ["it"]="setnumber",
+ ["nl"]="setnummer",
+ ["pe"]="تعیین‌شماره",
+ ["ro"]="setnumber",
+ },
+ ["settextcontent"]={
+ ["cs"]="settextcontent",
+ ["de"]="settext",
+ ["en"]="settextcontent",
+ ["fr"]="settext",
+ ["it"]="settext",
+ ["nl"]="steltekstinhoudin",
+ ["pe"]="تعیین‌مØتوای‌متن",
+ ["ro"]="settextcontent",
+ },
+ ["settextvariable"]={
+ ["cs"]="settextvariable",
+ ["de"]="settextvariable",
+ ["en"]="settextvariable",
+ ["fr"]="affectevariabletexte",
+ ["it"]="setvariabiletesto",
+ ["nl"]="kentekstvariabeletoe",
+ ["pe"]="تعیین‌متغیر‌متن",
+ ["ro"]="setvariabilatext",
+ },
+ ["setupalign"]={
+ ["cs"]="nastavzarovnani",
+ ["de"]="stelleausrichtungein",
+ ["en"]="setupalign",
+ ["fr"]="reglealignement",
+ ["it"]="impostaallineamento",
+ ["nl"]="steluitlijnenin",
+ ["pe"]="بارگذاری‌تنظیم",
+ ["ro"]="seteazaalinierea",
+ },
+ ["setuparranging"]={
+ ["cs"]="nastavusporadani",
+ ["de"]="stelleanordnenein",
+ ["en"]="setuparranging",
+ ["fr"]="reglearrangement",
+ ["it"]="impostaparranging",
+ ["nl"]="stelarrangerenin",
+ ["pe"]="بارگذاری‌ترتیب",
+ ["ro"]="seteazaaranjareapag",
+ },
+ ["setupbackground"]={
+ ["cs"]="nastavpozadi",
+ ["de"]="stellehintergrundein",
+ ["en"]="setupbackground",
+ ["fr"]="reglearriereplan",
+ ["it"]="impostasfondo",
+ ["nl"]="stelachtergrondin",
+ ["pe"]="بارگذاری‌پس‌زمینه",
+ ["ro"]="seteazafundal",
+ },
+ ["setupbackgrounds"]={
+ ["cs"]="nastavpozadi",
+ ["de"]="stellehintergruendeein",
+ ["en"]="setupbackgrounds",
+ ["fr"]="reglearriereplans",
+ ["it"]="impostasfondi",
+ ["nl"]="stelachtergrondenin",
+ ["pe"]="بارگذاری‌پس‌زمینه‌ها",
+ ["ro"]="seteazafundaluri",
+ },
+ ["setupblackrules"]={
+ ["cs"]="nastavcernelinky",
+ ["de"]="stellerechteckein",
+ ["en"]="setupblackrules",
+ ["fr"]="reglelignesnoires",
+ ["it"]="impostalineenere",
+ ["nl"]="stelblokjesin",
+ ["pe"]="بارگذاری‌خطهای‌سیاه",
+ ["ro"]="seteazaliniinegre",
+ },
+ ["setupblank"]={
+ ["cs"]="nastavpreskok",
+ ["de"]="stelleblankoein",
+ ["en"]="setupblank",
+ ["fr"]="definitvide",
+ ["it"]="impostarigovuoto",
+ ["nl"]="stelblankoin",
+ ["pe"]="بارگذاری‌خالی",
+ ["ro"]="seteazablanc",
+ },
+ ["setupblock"]={
+ ["cs"]="nastavblok",
+ ["de"]="stelleblockein",
+ ["en"]="setupblock",
+ ["fr"]="reglebloc",
+ ["it"]="impostablocco",
+ ["nl"]="stelblokin",
+ ["pe"]="بارگذاری‌بلوک",
+ ["ro"]="seteazabloc",
+ },
+ ["setupbodyfont"]={
+ ["cs"]="nastavzakladnifont",
+ ["de"]="stellefliesstextein",
+ ["en"]="setupbodyfont",
+ ["fr"]="reglepolicecorps",
+ ["it"]="impostafontdeltesto",
+ ["nl"]="stelkorpsin",
+ ["pe"]="بارگذاری‌قلم‌متن",
+ ["ro"]="seteazafonttext",
+ },
+ ["setupbodyfontenvironment"]={
+ ["cs"]="nastavprostredizakladnihofontu",
+ ["de"]="stellefliesstextumgebungein",
+ ["en"]="setupbodyfontenvironment",
+ ["fr"]="regleenvironnementpolicecorps",
+ ["it"]="impostaambientefontdeltesto",
+ ["nl"]="stelkorpsomgevingin",
+ ["pe"]="بارگذاری‌مØیط‌قلم‌متن",
+ ["ro"]="seteazamediulfonttext",
+ },
+ ["setupbottom"]={
+ ["cs"]="nastavspodek",
+ ["de"]="stelleuntenein",
+ ["en"]="setupbottom",
+ ["fr"]="regleinf",
+ ["it"]="impostafondo",
+ ["nl"]="stelonderin",
+ ["pe"]="بارگذاری‌پایین",
+ ["ro"]="seteazajos",
+ },
+ ["setupbottomtexts"]={
+ ["cs"]="nastavdolnitexty",
+ ["de"]="stelletextuntenein",
+ ["en"]="setupbottomtexts",
+ ["fr"]="regletextesinf",
+ ["it"]="impostatestifondo",
+ ["nl"]="stelondertekstenin",
+ ["pe"]="بارگذاری‌متن‌پایین",
+ ["ro"]="seteazatextejos",
+ },
+ ["setupbuffer"]={
+ ["cs"]="nastavbuffer",
+ ["de"]="stellepufferein",
+ ["en"]="setupbuffer",
+ ["fr"]="reglebuffer",
+ ["it"]="impostabuffer",
+ ["nl"]="stelbufferin",
+ ["pe"]="بارگذاری‌باÙر",
+ ["ro"]="seteazabuffer",
+ },
+ ["setupbuttons"]={
+ ["cs"]="nastavtlacitka",
+ ["de"]="stelleknopfein",
+ ["en"]="setupbuttons",
+ ["fr"]="regleboutons",
+ ["it"]="impostapulsanti",
+ ["nl"]="stelbuttonsin",
+ ["pe"]="بارگذاری‌دکمه‌ها",
+ ["ro"]="seteazabutoane",
+ },
+ ["setupcapitals"]={
+ ["cs"]="nastavkapitalky",
+ ["de"]="stelleversalienein",
+ ["en"]="setupcapitals",
+ ["fr"]="reglecapitales",
+ ["it"]="impostamaiuscole",
+ ["nl"]="stelkapitalenin",
+ ["pe"]="setupcapitals",
+ ["ro"]="seteazamajuscule",
+ },
+ ["setupcaption"]={
+ ["cs"]="nastavpopisek",
+ ["de"]="stellebildunterschriftein",
+ ["en"]="setupcaption",
+ ["fr"]="regleintitule",
+ ["it"]="impostacaption",
+ ["nl"]="stelblokkopjein",
+ ["pe"]="بارگذاری‌شرØ",
+ ["ro"]="seteazalegenda",
+ },
+ ["setupcaptions"]={
+ ["cs"]="nastavpopisky",
+ ["de"]="stellebilderunterschriftein",
+ ["en"]="setupcaptions",
+ ["fr"]="regleintitules",
+ ["it"]="impostacaptions",
+ ["nl"]="stelblokkopjesin",
+ ["pe"]="بارگذاری‌شرØها",
+ ["ro"]="seteazalegendele",
+ },
+ ["setupclipping"]={
+ ["cs"]="nastavorez",
+ ["de"]="stelleausschnittein",
+ ["en"]="setupclipping",
+ ["fr"]="regleclipping",
+ ["it"]="impostaclippling",
+ ["nl"]="stelclipin",
+ ["pe"]="بارگذاری‌چیدن",
+ ["ro"]="seteazaclipping",
+ },
+ ["setupcolor"]={
+ ["cs"]="nastavbarvu",
+ ["de"]="stellefarbeein",
+ ["en"]="setupcolor",
+ ["fr"]="reglecouleur",
+ ["it"]="impostacolore",
+ ["nl"]="stelkleurin",
+ ["pe"]="بارگذاری‌رنگ",
+ ["ro"]="seteazaculoare",
+ },
+ ["setupcolors"]={
+ ["cs"]="nastavbarvy",
+ ["de"]="stellefarbenein",
+ ["en"]="setupcolors",
+ ["fr"]="reglecouleurs",
+ ["it"]="impostacolori",
+ ["nl"]="stelkleurenin",
+ ["pe"]="بارگذاری‌رنگها",
+ ["ro"]="seteazaculori",
+ },
+ ["setupcolumns"]={
+ ["cs"]="nastavsloupce",
+ ["de"]="stellespaltenein",
+ ["en"]="setupcolumns",
+ ["fr"]="reglecolonnes",
+ ["it"]="impostacolonne",
+ ["nl"]="stelkolommenin",
+ ["pe"]="بارگذاری‌ستونها",
+ ["ro"]="seteazacoloane",
+ },
+ ["setupcolumnset"]={
+ ["cs"]="setupcolumnset",
+ ["de"]="setupcolumnset",
+ ["en"]="setupcolumnset",
+ ["fr"]="reglejeucolonne",
+ ["it"]="impostagruppocolonne",
+ ["nl"]="stelkolomgroepin",
+ ["pe"]="بارگذاری‌مجموعه‌ستون",
+ ["ro"]="setupcolumnset",
+ },
+ ["setupcolumnsetlines"]={
+ ["cs"]="setupcolumnsetlines",
+ ["de"]="setupcolumnsetlines",
+ ["en"]="setupcolumnsetlines",
+ ["fr"]="setupcolumnsetlines",
+ ["it"]="setupcolumnsetlines",
+ ["nl"]="stelkolomgroepregelsin",
+ ["pe"]="بارگذاری‌خطهای‌مجموعه‌ستون",
+ ["ro"]="setupcolumnsetlines",
+ },
+ ["setupcolumnsetstart"]={
+ ["cs"]="setupcolumnsetstart",
+ ["de"]="setupcolumnsetstart",
+ ["en"]="setupcolumnsetstart",
+ ["fr"]="setupcolumnsetstart",
+ ["it"]="setupcolumnsetstart",
+ ["nl"]="stelkolomgroepstartin",
+ ["pe"]="بارگذاری‌شروع‌مجموعه‌ستون",
+ ["ro"]="setupcolumnsetstart",
+ },
+ ["setupcombinations"]={
+ ["cs"]="nastavspojeni",
+ ["de"]="stellekombinationein",
+ ["en"]="setupcombinations",
+ ["fr"]="reglecombinaisons",
+ ["it"]="impostacombinazioni",
+ ["nl"]="stelcombinatiesin",
+ ["pe"]="بارگذاری‌ترکیب‌ها",
+ ["ro"]="seteazacombinari",
+ },
+ ["setupcombinedlist"]={
+ ["cs"]="nastavkombinovanyseznam",
+ ["de"]="stellezusammengestelltelisteein",
+ ["en"]="setupcombinedlist",
+ ["fr"]="reglelisteimbriquee",
+ ["it"]="impostaelencocombinato",
+ ["nl"]="stelsamengesteldelijstin",
+ ["pe"]="بارگذاری‌لیست‌ترکیبی",
+ ["ro"]="seteazalistacombinata",
+ },
+ ["setupcomment"]={
+ ["cs"]="nastavkomentar",
+ ["de"]="stellekommentarein",
+ ["en"]="setupcomment",
+ ["fr"]="reglecommentaire",
+ ["it"]="impostacommento",
+ ["nl"]="stelcommentaarin",
+ ["pe"]="بارگذاری‌توضیØ",
+ ["ro"]="seteazacomentariu",
+ },
+ ["setupdescriptions"]={
+ ["cs"]="nastavpopisy",
+ ["de"]="definierebeschreibungen",
+ ["en"]="setupdescriptions",
+ ["fr"]="regledescriptions",
+ ["it"]="impostadescrizioni",
+ ["nl"]="steldoordefinierenin",
+ ["pe"]="بارگذاری‌شرØ",
+ ["ro"]="seteazadescriere",
+ },
+ ["setupenumerations"]={
+ ["cs"]="nastavvycty",
+ ["de"]="stellebeschreibungein",
+ ["en"]="setupenumerations",
+ ["fr"]="regleenumerations",
+ ["it"]="impostaenumerazioni",
+ ["nl"]="steldoornummerenin",
+ ["pe"]="بارگذاری‌شماره‌گذاریها",
+ ["ro"]="seteazaenumerare",
+ },
+ ["setupexternalfigures"]={
+ ["cs"]="nastavexterniobrazy",
+ ["de"]="stelleexterneabbildungenein",
+ ["en"]="setupexternalfigures",
+ ["fr"]="reglefiguresexternes",
+ ["it"]="impostafigureesterne",
+ ["nl"]="stelexternefigurenin",
+ ["pe"]="بارگذاری‌شکلهای‌خارجی",
+ ["ro"]="seteazafiguriexterne",
+ },
+ ["setupfield"]={
+ ["cs"]="nastavpole",
+ ["de"]="stellefeldein",
+ ["en"]="setupfield",
+ ["fr"]="reglechamp",
+ ["it"]="impostacampo",
+ ["nl"]="stelveldin",
+ ["pe"]="بارگذاری‌میدان",
+ ["ro"]="seteazacamp",
+ },
+ ["setupfields"]={
+ ["cs"]="nastavvsechnapole",
+ ["de"]="stellefelderin",
+ ["en"]="setupfields",
+ ["fr"]="reglechamps",
+ ["it"]="impostacampi",
+ ["nl"]="stelveldenin",
+ ["pe"]="بارگذاری‌میدانها",
+ ["ro"]="seteazacampuri",
+ },
+ ["setupfillinlines"]={
+ ["cs"]="nastavvyplnoveradky",
+ ["de"]="stellegefuelltezeileein",
+ ["en"]="setupfillinlines",
+ ["fr"]="regleremplitligne",
+ ["it"]="impostarigheriempimento",
+ ["nl"]="stelinvulregelsin",
+ ["pe"]="بارگذاری‌پرکردن‌خطها",
+ ["ro"]="seteazaliniiumplere",
+ },
+ ["setupfillinrules"]={
+ ["cs"]="nastavvyplnovelinky",
+ ["de"]="stellegefuelltesrechteckein",
+ ["en"]="setupfillinrules",
+ ["fr"]="regleremplitlignesreglees",
+ ["it"]="impostalineeriempimento",
+ ["nl"]="stelinvullijnenin",
+ ["pe"]="بارگذاری‌درج‌درخطها",
+ ["ro"]="seteazarigleumplere",
+ },
+ ["setupfloat"]={
+ ["cs"]="nastavplvouciobjekt",
+ ["de"]="stellegleitobjektein",
+ ["en"]="setupfloat",
+ ["fr"]="regleflottant",
+ ["it"]="impostaoggettomobile",
+ ["nl"]="stelplaatsblokin",
+ ["pe"]="بارگذاری‌شناور",
+ ["ro"]="seteazafloat",
+ },
+ ["setupfloats"]={
+ ["cs"]="nastavplvouciobjekty",
+ ["de"]="stellegleitobjekteein",
+ ["en"]="setupfloats",
+ ["fr"]="regleflottants",
+ ["it"]="impostaoggettimobili",
+ ["nl"]="stelplaatsblokkenin",
+ ["pe"]="بارگذاری‌شناورها",
+ ["ro"]="seteazafloats",
+ },
+ ["setupfloatsplitting"]={
+ ["cs"]="nastavdeleniplvoucichobjektu",
+ ["de"]="stelleplatziegeteiltegleitobjekt",
+ ["en"]="setupfloatsplitting",
+ ["fr"]="regleseparationflottant",
+ ["it"]="impostaspezzamentooggettomobile",
+ ["nl"]="stelplaatsbloksplitsenin",
+ ["pe"]="بارگذاری‌شکاÙتن‌شناورها",
+ ["ro"]="seteazaimpartireafloat",
+ },
+ ["setupfooter"]={
+ ["cs"]="nastavupati",
+ ["de"]="stellefusszeileein",
+ ["en"]="setupfooter",
+ ["fr"]="reglepdp",
+ ["it"]="impostapdp",
+ ["nl"]="stelvoetin",
+ ["pe"]="بارگذاری‌ته‌برگ",
+ ["ro"]="seteazasubsol",
+ },
+ ["setupfootertexts"]={
+ ["cs"]="nastavtextyupati",
+ ["de"]="stellefusszeilentextein",
+ ["en"]="setupfootertexts",
+ ["fr"]="regletextespdp",
+ ["it"]="impostatestipdp",
+ ["nl"]="stelvoettekstenin",
+ ["pe"]="بارگذاری‌متن‌پانوشت",
+ ["ro"]="seteazatextesubsol",
+ },
+ ["setupfootnotedefinition"]={
+ ["cs"]="nastavdefinicipoznamekpodcarou",
+ ["de"]="stellefussnotendefinitionein",
+ ["en"]="setupfootnotedefinition",
+ ["fr"]="definitnotepdp",
+ ["it"]="impostadefinizionenotepdp",
+ ["nl"]="stelvoetnootdefinitiein",
+ ["pe"]="بارگذاری‌تعریÙ‌پانوشت",
+ ["ro"]="seteazadefinireanotasubsol",
+ },
+ ["setupfootnotes"]={
+ ["cs"]="nastavpoznamkypodcarou",
+ ["de"]="stellefussnotenein",
+ ["en"]="setupfootnotes",
+ ["fr"]="reglenotepdp",
+ ["it"]="impostanotepdp",
+ ["nl"]="stelvoetnotenin",
+ ["pe"]="بارگذاری‌پانوشتها",
+ ["ro"]="seteazanotasubsol",
+ },
+ ["setupforms"]={
+ ["cs"]="setupforms",
+ ["de"]="setupforms",
+ ["en"]="setupforms",
+ ["fr"]="regleformulaires",
+ ["it"]="impostaforms",
+ ["nl"]="stelformulierenin",
+ ["pe"]="بارگذاری‌طرØ",
+ ["ro"]="seteazaformulare",
+ },
+ ["setupformulas"]={
+ ["cs"]="nastavrovnice",
+ ["de"]="stelleformelnein",
+ ["en"]="setupformulae",
+ ["fr"]="regleformules",
+ ["it"]="impostaformule",
+ ["nl"]="stelformulesin",
+ ["pe"]="بارگذاری‌Ùرمولها",
+ ["ro"]="seteazaformule",
+ },
+ ["setupframed"]={
+ ["cs"]="nastavoramovani",
+ ["de"]="stelleumrahmtein",
+ ["en"]="setupframed",
+ ["fr"]="regleencadre",
+ ["it"]="impostaincorniciato",
+ ["nl"]="stelomlijndin",
+ ["pe"]="بارگذاری‌قالبی",
+ ["ro"]="seteazainconjurat",
+ },
+ ["setupframedtexts"]={
+ ["cs"]="nastavoramovanetexty",
+ ["de"]="stelleumrahmtetexteein",
+ ["en"]="setupframedtexts",
+ ["fr"]="setupframedtexts",
+ ["it"]="impostatestiincorniciati",
+ ["nl"]="stelkadertekstenin",
+ ["pe"]="بارگذاری‌متن‌قالبی",
+ ["ro"]="definestetexteinconjurate",
+ },
+ ["setuphead"]={
+ ["cs"]="nastavnadpis",
+ ["de"]="stelleueberschriftein",
+ ["en"]="setuphead",
+ ["fr"]="regletete",
+ ["it"]="impostatesta",
+ ["nl"]="stelkopin",
+ ["pe"]="بارگذاری‌سر",
+ ["ro"]="seteazatitlu",
+ },
+ ["setupheader"]={
+ ["cs"]="nastavzahlavi",
+ ["de"]="stellekopfzeileein",
+ ["en"]="setupheader",
+ ["fr"]="regleentete",
+ ["it"]="impostainstestazione",
+ ["nl"]="stelhoofdin",
+ ["pe"]="بارگذاری‌سربرگ",
+ ["ro"]="seteazaantet",
+ },
+ ["setupheadertexts"]={
+ ["cs"]="nastavtextyzahlavi",
+ ["de"]="stellekopfzeilentextein",
+ ["en"]="setupheadertexts",
+ ["fr"]="regletextesentete",
+ ["it"]="impostatestiintestazioni",
+ ["nl"]="stelhoofdtekstenin",
+ ["pe"]="بارگذاری‌متن‌سربرگ",
+ ["ro"]="seteazatexteantet",
+ },
+ ["setupheadnumber"]={
+ ["cs"]="nastavcislonadpisu",
+ ["de"]="stellekopfzahlein",
+ ["en"]="setupheadnumber",
+ ["fr"]="reglenumerotete",
+ ["it"]="impostanumerotesta",
+ ["nl"]="stelkopnummerin",
+ ["pe"]="بارگذاری‌شماره‌سر",
+ ["ro"]="seteazanumartitlu",
+ },
+ ["setupheads"]={
+ ["cs"]="nastavnadpisy",
+ ["de"]="stelleueberschriftenein",
+ ["en"]="setupheads",
+ ["fr"]="regletetes",
+ ["it"]="impostateste",
+ ["nl"]="stelkoppenin",
+ ["pe"]="بارگذاری‌سرها",
+ ["ro"]="seteazatitluri",
+ },
+ ["setupheadtext"]={
+ ["cs"]="nastavtexthlavicky",
+ ["de"]="stelleueberschrifttextein",
+ ["en"]="setupheadtext",
+ ["fr"]="regletextetete",
+ ["it"]="impostatestointestazioni",
+ ["nl"]="stelkoptekstin",
+ ["pe"]="بارگذاری‌متن‌سر",
+ ["ro"]="seteazatexttitlu",
+ },
+ ["setuphyphenmark"]={
+ ["cs"]="nastavdelitko",
+ ["de"]="stellebindestrichein",
+ ["en"]="setuphyphenmark",
+ ["fr"]="reglemarquagehyphenation",
+ ["it"]="impostasegnosillabazione",
+ ["nl"]="stelkoppeltekenin",
+ ["pe"]="بارگذاری‌نشانه‌شکستن",
+ ["ro"]="seteazaliniesilabe",
+ },
+ ["setupindentations"]={
+ ["cs"]="nastavodsazeni",
+ ["de"]="stelleeinzuegein",
+ ["en"]="setupindentations",
+ ["fr"]="reglealineas",
+ ["it"]="impostarientri",
+ ["nl"]="steldoorspringenin",
+ ["pe"]="بارگذاری‌تورÙتگیها",
+ ["ro"]="seteazaaliniate",
+ },
+ ["setupindenting"]={
+ ["cs"]="nastavodsazovani",
+ ["de"]="stelleeinziehenein",
+ ["en"]="setupindenting",
+ ["fr"]="reglecomposeenalinea",
+ ["it"]="impostarientro",
+ ["nl"]="stelinspringenin",
+ ["pe"]="بارگذاری‌تورÙتگی",
+ ["ro"]="seteazaaliniat",
+ },
+ ["setupinmargin"]={
+ ["cs"]="nastavmarginalie",
+ ["de"]="stelleinmarginalieein",
+ ["en"]="setupinmargin",
+ ["fr"]="regledansmarge",
+ ["it"]="impostainmargine",
+ ["nl"]="stelinmargein",
+ ["pe"]="بارگذاری‌درون‌Øاشیه",
+ ["ro"]="seteazamarginal",
+ },
+ ["setupinteraction"]={
+ ["cs"]="nastavinterakci",
+ ["de"]="stelleinteraktionein",
+ ["en"]="setupinteraction",
+ ["fr"]="regleinteraction",
+ ["it"]="impostainterazione",
+ ["nl"]="stelinteractiein",
+ ["pe"]="بارگذاری‌پانل",
+ ["ro"]="seteazainteractiunea",
+ },
+ ["setupinteractionbar"]={
+ ["cs"]="nastavinterakcnilistu",
+ ["de"]="stelleinteraktionsbalkenein",
+ ["en"]="setupinteractionbar",
+ ["fr"]="reglebarreinteraction",
+ ["it"]="impostabarrainterazione",
+ ["nl"]="stelinteractiebalkin",
+ ["pe"]="بارگذاری‌میله‌پانل",
+ ["ro"]="seteazabarainteractiune",
+ },
+ ["setupinteractionmenu"]={
+ ["cs"]="nastavinterakcnimenu",
+ ["de"]="stelleinteraktionsmenueein",
+ ["en"]="setupinteractionmenu",
+ ["fr"]="reglemenuinteraction",
+ ["it"]="impostamenuinterazione",
+ ["nl"]="stelinteractiemenuin",
+ ["pe"]="بارگذاری‌منوی‌پانل",
+ ["ro"]="seteazameniuinteractiune",
+ },
+ ["setupinteractionscreen"]={
+ ["cs"]="nastavinterakcniobrazovku",
+ ["de"]="stelleinteraktionsbildschirmein",
+ ["en"]="setupinteractionscreen",
+ ["fr"]="regleecraninteraction",
+ ["it"]="impostaschermointerazione",
+ ["nl"]="stelinteractieschermin",
+ ["pe"]="بارگذاری‌پرده‌پانل",
+ ["ro"]="seteazaecraninteractiune",
+ },
+ ["setupinterlinespace"]={
+ ["cs"]="nastavmeziradkovoumezeru",
+ ["de"]="stellezeilenabstandein",
+ ["en"]="setupinterlinespace",
+ ["fr"]="regleespacementinterligne",
+ ["it"]="impostainterlinea",
+ ["nl"]="stelinterliniein",
+ ["pe"]="بارگذاری‌Ùاصله‌بین‌خط",
+ ["ro"]="seteazaspatiuinterliniar",
+ },
+ ["setupitemgroup"]={
+ ["cs"]="setupitemgroup",
+ ["de"]="setupitemgroup",
+ ["en"]="setupitemgroup",
+ ["fr"]="setupitemgroup",
+ ["it"]="setupitemgroup",
+ ["nl"]="stelitemgroepin",
+ ["pe"]="بارگذاری‌گروه‌آیتم",
+ ["ro"]="setupitemgroup",
+ },
+ ["setupitemgroups"]={
+ ["cs"]="nastavvycty",
+ ["de"]="stelleaufzaehlungenein",
+ ["en"]="setupitemizations",
+ ["fr"]="reglegroupeselements",
+ ["it"]="impostaelencazioni",
+ ["nl"]="stelopsommingenin",
+ ["pe"]="بارگذاری‌گروههای‌آیتم",
+ ["ro"]="setareitemization",
+ },
+ ["setupitems"]={
+ ["cs"]="nastavpolozky",
+ ["de"]="stellepostenein",
+ ["en"]="setupitems",
+ ["fr"]="regleelements",
+ ["it"]="impostaelementi",
+ ["nl"]="stelitemsin",
+ ["pe"]="بارگذاری‌آیتمها",
+ ["ro"]="seteazaelemente",
+ },
+ ["setuplabeltext"]={
+ ["cs"]="nastavtextpopisku",
+ ["de"]="stellelabeltextein",
+ ["en"]="setuplabeltext",
+ ["fr"]="reglelabeltexte",
+ ["it"]="impostatestoetichette",
+ ["nl"]="stellabeltekstin",
+ ["pe"]="باگذاری‌متن‌برچسب",
+ ["ro"]="seteazatexteticheta",
+ },
+ ["setuplanguage"]={
+ ["cs"]="nastavjazyk",
+ ["de"]="stellespracheein",
+ ["en"]="setuplanguage",
+ ["fr"]="reglelangue",
+ ["it"]="impostalingua",
+ ["nl"]="steltaalin",
+ ["pe"]="بارگذاری‌زبان",
+ ["ro"]="setarelimba",
+ },
+ ["setuplayout"]={
+ ["cs"]="nastavvzhled",
+ ["de"]="stellelayoutein",
+ ["en"]="setuplayout",
+ ["fr"]="regledisposition",
+ ["it"]="impostalayout",
+ ["nl"]="stellayoutin",
+ ["pe"]="بارگذاری‌طرØ‌بندی",
+ ["ro"]="seteazaaspect",
+ },
+ ["setuplegend"]={
+ ["cs"]="nastavlegendu",
+ ["de"]="stellelegendeein",
+ ["en"]="setuplegend",
+ ["fr"]="reglelegende",
+ ["it"]="impostalegenda",
+ ["nl"]="stellegendain",
+ ["pe"]="بارگذاری‌راهنما",
+ ["ro"]="seteazalegenda",
+ },
+ ["setuplinenumbering"]={
+ ["cs"]="nastavcislovaniradku",
+ ["de"]="stellezeilennumerierungein",
+ ["en"]="setuplinenumbering",
+ ["fr"]="reglenumerotationligne",
+ ["it"]="impostanumerazionerighe",
+ ["nl"]="stelregelnummerenin",
+ ["pe"]="بارگذاری‌شماره‌‌گذاری‌خط",
+ ["ro"]="seteazanumerotarelinii",
+ },
+ ["setuplines"]={
+ ["cs"]="nastavradky",
+ ["de"]="stellezeilenein",
+ ["en"]="setuplines",
+ ["fr"]="reglelignes",
+ ["it"]="impostarighe",
+ ["nl"]="stelregelsin",
+ ["pe"]="بارگذاری‌خطها",
+ ["ro"]="seteazalinii",
+ },
+ ["setuplinewidth"]={
+ ["cs"]="nastavsirkucary",
+ ["de"]="stellelinienbreiteein",
+ ["en"]="setuplinewidth",
+ ["fr"]="regleepaisseurligne",
+ ["it"]="impostaampiezzariga",
+ ["nl"]="stellijndiktein",
+ ["pe"]="بارگذاری‌عرض‌خط",
+ ["ro"]="seteazagrosimelinie",
+ },
+ ["setuplist"]={
+ ["cs"]="nastavseznam",
+ ["de"]="stellelisteein",
+ ["en"]="setuplist",
+ ["fr"]="regleliste",
+ ["it"]="impostaelenco",
+ ["nl"]="stellijstin",
+ ["pe"]="بارگذاری‌لیست",
+ ["ro"]="seteazalista",
+ },
+ ["setupmakeup"]={
+ ["cs"]="nastavupravu",
+ ["de"]="stelleumbruchein",
+ ["en"]="setupmakeup",
+ ["fr"]="reglemakeup",
+ ["it"]="impostamakeup",
+ ["nl"]="stelopmaakin",
+ ["pe"]="بارگذاری‌آرایش",
+ ["ro"]="seteazamakeup",
+ },
+ ["setupmarginblocks"]={
+ ["cs"]="nastavmarginalniblok",
+ ["de"]="stellemarginalblockein",
+ ["en"]="setupmarginblocks",
+ ["fr"]="regleblocmarge",
+ ["it"]="impostablocchimargine",
+ ["nl"]="stelmargeblokkenin",
+ ["pe"]="بارگذاری‌بلوکهای‌Øاشیه",
+ ["ro"]="seteazablocurimarginale",
+ },
+ ["setupmarginrules"]={
+ ["cs"]="nastavmarginalnilinky",
+ ["de"]="stellemarginallinieein",
+ ["en"]="setupmarginrules",
+ ["fr"]="reglemargereglee",
+ ["it"]="impostalineemargine",
+ ["nl"]="stelkantlijnin",
+ ["pe"]="بارگذاری‌خطهای‌Øاشیه",
+ ["ro"]="seteazaliniimargine",
+ },
+ ["setupmarking"]={
+ ["cs"]="nastavznaceni",
+ ["de"]="stellebeschriftungein",
+ ["en"]="setupmarking",
+ ["fr"]="reglemarquage",
+ ["it"]="impostamarcatura",
+ ["nl"]="stelmarkeringin",
+ ["pe"]="بارگذاری‌نشانه‌گذاری",
+ ["ro"]="seteazamarcaje",
+ },
+ ["setupmathalignment"]={
+ ["cs"]="setupmathalignment",
+ ["de"]="setupmathalignment",
+ ["en"]="setupmathalignment",
+ ["fr"]="setupmathalignment",
+ ["it"]="setupmathalignment",
+ ["nl"]="stelwiskundeuitlijnenin",
+ ["pe"]="بارگذاری‌تنظیم‌ریاضی",
+ ["ro"]="setupmathalignment",
+ },
+ ["setupnarrower"]={
+ ["cs"]="nastavzuzeni",
+ ["de"]="stelleengerein",
+ ["en"]="setupnarrower",
+ ["fr"]="reglecompoetroite",
+ ["it"]="impostapiustretto",
+ ["nl"]="stelsmallerin",
+ ["pe"]="بارگذاری‌باریکتر",
+ ["ro"]="seteazaingust",
+ },
+ ["setupnumber"]={
+ ["cs"]="setupnumber",
+ ["de"]="setupnumber",
+ ["en"]="setupnumber",
+ ["fr"]="reglenumero",
+ ["it"]="impostanumerazione",
+ ["nl"]="stelnummerin",
+ ["pe"]="بارگذاری‌شماره",
+ ["ro"]="setupnumber",
+ },
+ ["setupnumbering"]={
+ ["cs"]="nastavcislovani",
+ ["de"]="stellenummerierungein",
+ ["en"]="setupnumbering",
+ ["fr"]="reglenumerotation",
+ ["it"]="impostanumerazione",
+ ["nl"]="stelnummerenin",
+ ["pe"]="بارگذاری‌شماره‌گذاری",
+ ["ro"]="seteazanumerotare",
+ },
+ ["setupoppositeplacing"]={
+ ["cs"]="nastavumisteniprotejsku",
+ ["de"]="stellegegenueberplatzierenein",
+ ["en"]="setupoppositeplacing",
+ ["fr"]="regleplacementopposition",
+ ["it"]="impostaposizionamentoopposti",
+ ["nl"]="stelnaastplaatsenin",
+ ["pe"]="بارگذاری‌درج‌مخالÙ",
+ ["ro"]="seteazaplasareaopozita",
+ },
+ ["setupoutput"]={
+ ["cs"]="nastavvystup",
+ ["de"]="stelleausgabeein",
+ ["en"]="setupoutput",
+ ["fr"]="reglesortie",
+ ["it"]="impostaoutput",
+ ["nl"]="steluitvoerin",
+ ["pe"]="بارگذاری‌خروجی",
+ ["ro"]="setareoutput",
+ },
+ ["setuppagecomment"]={
+ ["cs"]="nastavkomentarstrany",
+ ["de"]="stelleseitenkommentarein",
+ ["en"]="setuppagecomment",
+ ["fr"]="reglecommentairepage",
+ ["it"]="impostacommentopagina",
+ ["nl"]="stelpaginacommentaarin",
+ ["pe"]="بارگذاری‌توضیØ‌صÙØÙ‡",
+ ["ro"]="seteazacomentariupagina",
+ },
+ ["setuppagenumber"]={
+ ["cs"]="nastavcislostrany",
+ ["de"]="stelleseitennummerein",
+ ["en"]="setuppagenumber",
+ ["fr"]="reglenumeropage",
+ ["it"]="impostanumeropagina",
+ ["nl"]="stelpaginanummerin",
+ ["pe"]="بارگذاری‌شماره‌صÙØÙ‡",
+ ["ro"]="seteazanumarpagina",
+ },
+ ["setuppagenumbering"]={
+ ["cs"]="nastavcislovanistran",
+ ["de"]="stelleseitennummeriernungein",
+ ["en"]="setuppagenumbering",
+ ["fr"]="reglenumerotationpage",
+ ["it"]="impostanumerazionepagina",
+ ["nl"]="stelpaginanummeringin",
+ ["pe"]="بارگذاری‌شماره‌گذاری‌صÙØÙ‡",
+ ["ro"]="seteazanumerotarepagina",
+ },
+ ["setuppagetransitions"]={
+ ["cs"]="nastavprechodstrany",
+ ["de"]="stelleseitenuebergangein",
+ ["en"]="setuppagetransitions",
+ ["fr"]="regletransitionspage",
+ ["it"]="impostatransizionepagina",
+ ["nl"]="stelpaginaovergangenin",
+ ["pe"]="بارگذاری‌گذارصÙØÙ‡",
+ ["ro"]="seteazatranzitiepagina",
+ },
+ ["setuppalet"]={
+ ["cs"]="nastavpaletu",
+ ["de"]="stellepaletteein",
+ ["en"]="setuppalet",
+ ["fr"]="reglepalette",
+ ["it"]="impostatavolozza",
+ ["nl"]="stelpaletin",
+ ["pe"]="بارگذاری‌لوØ",
+ ["ro"]="seteazapaleta",
+ },
+ ["setuppaper"]={
+ ["cs"]="setuppaper",
+ ["de"]="setuppaper",
+ ["en"]="setuppaper",
+ ["fr"]="reglepapier",
+ ["it"]="setuppaper",
+ ["nl"]="stelpapierin",
+ ["pe"]="بارگذاری‌برگ",
+ ["ro"]="setuppaper",
+ },
+ ["setuppapersize"]={
+ ["cs"]="nastavvelikostpapiru",
+ ["de"]="stellepapierformatein",
+ ["en"]="setuppapersize",
+ ["fr"]="regletaillepapier",
+ ["it"]="impostadimensionicarta",
+ ["nl"]="stelpapierformaatin",
+ ["pe"]="بارگذاری‌اندازه‌برگ",
+ ["ro"]="seteazadimensiunihartie",
+ },
+ ["setupparagraphnumbering"]={
+ ["cs"]="nastavcislovaniodstavcu",
+ ["de"]="stelleabsatznummerierungein",
+ ["en"]="setupparagraphnumbering",
+ ["fr"]="reglenumerotationparagraphe",
+ ["it"]="impostanumerazionecapoversi",
+ ["nl"]="stelparagraafnummerenin",
+ ["pe"]="بارگذاری‌شماره‌گذاری‌پاراگراÙ",
+ ["ro"]="seteazanumerotareparagrafe",
+ },
+ ["setupparagraphs"]={
+ ["cs"]="nastavodstavce",
+ ["de"]="stelleabsaetzeein",
+ ["en"]="setupparagraphs",
+ ["fr"]="regleparagraphes",
+ ["it"]="impostacapoversi",
+ ["nl"]="stelalineasin",
+ ["pe"]="بارگذاری‌پاراگراÙها",
+ ["ro"]="seteazaparagrafe",
+ },
+ ["setupplacement"]={
+ ["cs"]="setupplacement",
+ ["de"]="setupplacement",
+ ["en"]="setupplacement",
+ ["fr"]="setupplacement",
+ ["it"]="setupplacement",
+ ["nl"]="stelplaatsin",
+ ["pe"]="بارگذاری‌جانشانی",
+ ["ro"]="setupplacement",
+ },
+ ["setuppositioning"]={
+ ["cs"]="nastavumistovani",
+ ["de"]="stellepositionierenein",
+ ["en"]="setuppositioning",
+ ["fr"]="reglepositionnement",
+ ["it"]="impostaposizionamento",
+ ["nl"]="stelpositionerenin",
+ ["pe"]="بارگذاری‌مکان‌گذاری",
+ ["ro"]="setarepozitie",
+ },
+ ["setupprofiles"]={
+ ["cs"]="nastavprofily",
+ ["de"]="stelleprofilein",
+ ["en"]="setupprofiles",
+ ["fr"]="regleprofils",
+ ["it"]="impostaprofili",
+ ["nl"]="stelprofielenin",
+ ["pe"]="بارگذاری‌پروÙایلها",
+ ["ro"]="seteazaprofile",
+ },
+ ["setupprograms"]={
+ ["cs"]="nastavprogramy",
+ ["de"]="stelleprogrammein",
+ ["en"]="setupprograms",
+ ["fr"]="regleprogrammes",
+ ["it"]="impostaprogrammi",
+ ["nl"]="stelprogrammasin",
+ ["pe"]="بارگذاری‌برنامه‌ها",
+ ["ro"]="seteazaprograme",
+ },
+ ["setuppublications"]={
+ ["cs"]="nastavpublikace",
+ ["de"]="stellepublikationein",
+ ["en"]="setuppublications",
+ ["fr"]="reglepublications",
+ ["it"]="impostapubblicazioni",
+ ["nl"]="stelpublicatiesin",
+ ["pe"]="بارگذاری‌نشرها",
+ ["ro"]="seteazapublicatii",
+ },
+ ["setupquote"]={
+ ["cs"]="nastavcitaci",
+ ["de"]="stellezitierenein",
+ ["en"]="setupquote",
+ ["fr"]="demarreciter",
+ ["it"]="impostamenzione",
+ ["nl"]="stelciterenin",
+ ["pe"]="بارگذاری‌نقل",
+ ["ro"]="seteazaminicitat",
+ },
+ ["setupreferencelist"]={
+ ["cs"]="nastavseznamodkazu",
+ ["de"]="stellereferenzlisteein",
+ ["en"]="setupreferencelist",
+ ["fr"]="reglelistereference",
+ ["it"]="impostalistariferimenti",
+ ["nl"]="stelreferentielijstin",
+ ["pe"]="بارگذاری‌لیست‌مرجع",
+ ["ro"]="seteazalistareferinte",
+ },
+ ["setupreferencing"]={
+ ["cs"]="nastavodkazovani",
+ ["de"]="stellereferenzierenein",
+ ["en"]="setupreferencing",
+ ["fr"]="reglereferencage",
+ ["it"]="impostariferimento",
+ ["nl"]="stelrefererenin",
+ ["pe"]="بارگذاری‌ارجاع",
+ ["ro"]="seteazareferinte",
+ },
+ ["setupregister"]={
+ ["cs"]="nastavrejstrik",
+ ["de"]="stelleregisterein",
+ ["en"]="setupregister",
+ ["fr"]="regleregistre",
+ ["it"]="impostaregistro",
+ ["nl"]="stelregisterin",
+ ["pe"]="بارگذاری‌ثبت",
+ ["ro"]="seteazaregistru",
+ },
+ ["setuprotate"]={
+ ["cs"]="nastavotoceni",
+ ["de"]="stelledrehenein",
+ ["en"]="setuprotate",
+ ["fr"]="regleoriente",
+ ["it"]="impostarotazione",
+ ["nl"]="stelroterenin",
+ ["pe"]="بارگذاری‌دوران",
+ ["ro"]="seteazarotare",
+ },
+ ["setuprule"]={
+ ["cs"]="setuprule",
+ ["de"]="setuprule",
+ ["en"]="setuprule",
+ ["fr"]="regleregle",
+ ["it"]="impostalinea",
+ ["nl"]="stellijnin",
+ ["pe"]="بارگذاری‌خط",
+ ["ro"]="seteazarigla",
+ },
+ ["setups"]={
+ ["cs"]="nastaveni",
+ ["de"]="einstellungen",
+ ["en"]="setups",
+ ["fr"]="reglages",
+ ["it"]="impostazioni",
+ ["nl"]="instellingen",
+ ["pe"]="بارگذاریها",
+ ["ro"]="setari",
+ },
+ ["setupscreens"]={
+ ["cs"]="nastavrastr",
+ ["de"]="stellerasterein",
+ ["en"]="setupscreens",
+ ["fr"]="regleecrans",
+ ["it"]="impostaschermi",
+ ["nl"]="stelrastersin",
+ ["pe"]="بارگذاری‌پرده‌ها",
+ ["ro"]="seteazaecrane",
+ },
+ ["setupsection"]={
+ ["cs"]="nastavsekci",
+ ["de"]="stelleabschnittein",
+ ["en"]="setupsection",
+ ["fr"]="reglesection",
+ ["it"]="impostasezione",
+ ["nl"]="stelsectiein",
+ ["pe"]="بارگذاری‌بخش",
+ ["ro"]="seteazasectiune",
+ },
+ ["setupsectionblock"]={
+ ["cs"]="nastavbloksekce",
+ ["de"]="stelleabschnittsblockein",
+ ["en"]="setupsectionblock",
+ ["fr"]="regleblocsection",
+ ["it"]="impostabloccosezione",
+ ["nl"]="stelsectieblokin",
+ ["pe"]="بارگذاری‌بلوک‌بخش",
+ ["ro"]="seteazablocsectiune",
+ },
+ ["setupsorting"]={
+ ["cs"]="nastavtrideni",
+ ["de"]="stellesortierenein",
+ ["en"]="setupsorting",
+ ["fr"]="regletri",
+ ["it"]="impostaordinamento",
+ ["nl"]="stelsorterenin",
+ ["pe"]="بارگذاری‌ترتیب",
+ ["ro"]="seteazasortare",
+ },
+ ["setupspacing"]={
+ ["cs"]="nastavradkovani",
+ ["de"]="stellespatiumein",
+ ["en"]="setupspacing",
+ ["fr"]="regleespacement",
+ ["it"]="impostaspaziatura",
+ ["nl"]="stelspatieringin",
+ ["pe"]="بارگذاری‌Ùضا‌گذاری",
+ ["ro"]="seteazaspatiu",
+ },
+ ["setupstartstop"]={
+ ["cs"]="setupstartstop",
+ ["de"]="setupstartstop",
+ ["en"]="setupstartstop",
+ ["fr"]="regledemarrestoppe",
+ ["it"]="impostainiziatermina",
+ ["nl"]="stelstartstopin",
+ ["pe"]="بارگذاری‌شروع‌پایان",
+ ["ro"]="setupstartstop",
+ },
+ ["setupstrut"]={
+ ["cs"]="setupstrut",
+ ["de"]="setupstrut",
+ ["en"]="setupstrut",
+ ["fr"]="reglestrut",
+ ["it"]="impostastrut",
+ ["nl"]="stelstrutin",
+ ["pe"]="بارگذاری‌بست",
+ ["ro"]="seteazastrut",
+ },
+ ["setupsubpagenumber"]={
+ ["cs"]="nastavpodcislostrany",
+ ["de"]="stelleunterseitennummerein",
+ ["en"]="setupsubpagenumber",
+ ["fr"]="reglesousnumeropage",
+ ["it"]="impostanumerosottopagina",
+ ["nl"]="stelsubpaginanummerin",
+ ["pe"]="بارگذاری‌شماره‌زیرصÙØÙ‡",
+ ["ro"]="seteazanumarsubpagina",
+ },
+ ["setupsymbolset"]={
+ ["cs"]="nastavsadusymbolu",
+ ["de"]="stellesymbolsetein",
+ ["en"]="setupsymbolset",
+ ["fr"]="reglejeusymboles",
+ ["it"]="impostasetsimboli",
+ ["nl"]="stelsymboolsetin",
+ ["pe"]="بارگذاری‌مجموعه‌نماد",
+ ["ro"]="seteazasimbol",
+ },
+ ["setupsynchronization"]={
+ ["cs"]="nastavsynchronizaci",
+ ["de"]="stellesynchronisationein",
+ ["en"]="setupsynchronization",
+ ["fr"]="reglesynchronisation",
+ ["it"]="impostasincronizzazione",
+ ["nl"]="stelsynchronisatiein",
+ ["pe"]="بارگذاری‌تطابق",
+ ["ro"]="setaresincronizare",
+ },
+ ["setupsynchronizationbar"]={
+ ["cs"]="nastavsynchronizacnilistu",
+ ["de"]="stellesynchronisationsbalkenein",
+ ["en"]="setupsynchronizationbar",
+ ["fr"]="reglebarresynchronisation",
+ ["it"]="impostabarrasincronizzazione",
+ ["nl"]="stelsynchronisatiebalkin",
+ ["pe"]="بارگذاری‌میله‌تطابق",
+ ["ro"]="setarebarasincronizare",
+ },
+ ["setupsynonyms"]={
+ ["cs"]="nastavsynonyma",
+ ["de"]="stellesynonymein",
+ ["en"]="setupsynonyms",
+ ["fr"]="reglesynonymes",
+ ["it"]="impostasinonimi",
+ ["nl"]="stelsynoniemenin",
+ ["pe"]="بارگذاری‌مترادÙها",
+ ["ro"]="seteazasinonime",
+ },
+ ["setupsystem"]={
+ ["cs"]="nastavsystem",
+ ["de"]="stellesystemein",
+ ["en"]="setupsystem",
+ ["fr"]="reglesysteme",
+ ["it"]="impostasistema",
+ ["nl"]="stelsysteemin",
+ ["pe"]="بارگذاری‌سیستم",
+ ["ro"]="seteazasistem",
+ },
+ ["setuptab"]={
+ ["cs"]="nastavtab",
+ ["de"]="stelletabein",
+ ["en"]="setuptab",
+ ["fr"]="regletab",
+ ["it"]="impostatab",
+ ["nl"]="steltabin",
+ ["pe"]="بارگذاری‌تب",
+ ["ro"]="seteazatab",
+ },
+ ["setuptables"]={
+ ["cs"]="nastavtabulky",
+ ["de"]="stelletabellenein",
+ ["en"]="setuptables",
+ ["fr"]="regletableaux",
+ ["it"]="impostatabelle",
+ ["nl"]="steltabellenin",
+ ["pe"]="بارگذاری‌جدولها",
+ ["ro"]="seteazatabele",
+ },
+ ["setuptabulate"]={
+ ["cs"]="nastavtabelaci",
+ ["de"]="stelletabulatorein",
+ ["en"]="setuptabulate",
+ ["fr"]="regletabulation",
+ ["it"]="impostatabulato",
+ ["nl"]="steltabulatiein",
+ ["pe"]="بارگذاری‌جدول‌بندی",
+ ["ro"]="seteazatabulatori",
+ },
+ ["setuptext"]={
+ ["cs"]="nastavtext",
+ ["de"]="stelletextein",
+ ["en"]="setuptext",
+ ["fr"]="regletexte",
+ ["it"]="impostatesto",
+ ["nl"]="steltekstin",
+ ["pe"]="بارگذاری‌متن",
+ ["ro"]="seteazatext",
+ },
+ ["setuptextposition"]={
+ ["cs"]="setuptextposition",
+ ["de"]="setuptextposition",
+ ["en"]="setuptextposition",
+ ["fr"]="reglepositiontexte",
+ ["it"]="impostaposizionetesto",
+ ["nl"]="steltekstpositiein",
+ ["pe"]="بارگذاری‌مکان‌متن",
+ ["ro"]="seteazapozitietext",
+ },
+ ["setuptextrules"]={
+ ["cs"]="nastavtextovelinky",
+ ["de"]="stelletextumrissein",
+ ["en"]="setuptextrules",
+ ["fr"]="reglelignesreglestexte",
+ ["it"]="impostalineetesto",
+ ["nl"]="steltekstlijnenin",
+ ["pe"]="بارگذاری‌خطهای‌متن",
+ ["ro"]="seteazarigletext",
+ },
+ ["setuptexttexts"]={
+ ["cs"]="nastavtexttexty",
+ ["de"]="stelletexttexteein",
+ ["en"]="setuptexttexts",
+ ["fr"]="regletextestexte",
+ ["it"]="impostatestotesti",
+ ["nl"]="stelteksttekstenin",
+ ["pe"]="بارگذاری‌متن‌متنها",
+ ["ro"]="seteazatextetext",
+ },
+ ["setuptextvariable"]={
+ ["cs"]="setuptextvariable",
+ ["de"]="setuptextvariable",
+ ["en"]="setuptextvariable",
+ ["fr"]="reglevariabletexte",
+ ["it"]="impostavariabiletesto",
+ ["nl"]="steltekstvariabelein",
+ ["pe"]="بارگذاری‌متغیر‌متن",
+ ["ro"]="seteazavariabilatext",
+ },
+ ["setupthinrules"]={
+ ["cs"]="nastavtenkelinky",
+ ["de"]="stelleduennerumrissein",
+ ["en"]="setupthinrules",
+ ["fr"]="regletraitsfins",
+ ["it"]="impostalineesottili",
+ ["nl"]="steldunnelijnenin",
+ ["pe"]="بارگذاری‌خطها‌ی‌نازک",
+ ["ro"]="seteazaliniesubtire",
+ },
+ ["setuptolerance"]={
+ ["cs"]="nastavtoleranci",
+ ["de"]="stelletoleranzein",
+ ["en"]="setuptolerance",
+ ["fr"]="regletolerance",
+ ["it"]="impostatolleranza",
+ ["nl"]="steltolerantiein",
+ ["pe"]="بارگذاری‌بردباری",
+ ["ro"]="seteazatoleranta",
+ },
+ ["setuptop"]={
+ ["cs"]="nastavhorejsek",
+ ["de"]="stellenobenein",
+ ["en"]="setuptop",
+ ["fr"]="reglesup",
+ ["it"]="impostacima",
+ ["nl"]="stelbovenin",
+ ["pe"]="بارگذاری‌بالا",
+ ["ro"]="seteazasus",
+ },
+ ["setuptoptexts"]={
+ ["cs"]="nastavhornitexty",
+ ["de"]="stelletextobenein",
+ ["en"]="setuptoptexts",
+ ["fr"]="regletextessup",
+ ["it"]="impostatesticima",
+ ["nl"]="stelboventekstenin",
+ ["pe"]="بارگذاری‌متنهای‌بالا",
+ ["ro"]="seteazatextesus",
+ },
+ ["setuptype"]={
+ ["cs"]="nastavtype",
+ ["de"]="stelletipein",
+ ["en"]="setuptype",
+ ["fr"]="regletype",
+ ["it"]="impostatype",
+ ["nl"]="steltypein",
+ ["pe"]="بارگذاری‌تایپ",
+ ["ro"]="seteazatype",
+ },
+ ["setuptyping"]={
+ ["cs"]="nastavopis",
+ ["de"]="stelletippenein",
+ ["en"]="setuptyping",
+ ["fr"]="regledactylo",
+ ["it"]="impostatyping",
+ ["nl"]="steltypenin",
+ ["pe"]="بارگذاری‌تایپ‌کردن",
+ ["ro"]="seteazatyping",
+ },
+ ["setupunderbar"]={
+ ["cs"]="nastavpodtrzeni",
+ ["de"]="stelleunterstreichenein",
+ ["en"]="setupunderbar",
+ ["fr"]="reglesouslignage",
+ ["it"]="impostasottolinea",
+ ["nl"]="stelonderstrepenin",
+ ["pe"]="بارگذاری‌میله‌زیر",
+ ["ro"]="seteazasublinie",
+ },
+ ["setupurl"]={
+ ["cs"]="nastavurl",
+ ["de"]="stelleurlein",
+ ["en"]="setupurl",
+ ["fr"]="regleurl",
+ ["it"]="impostaurl",
+ ["nl"]="stelurlin",
+ ["pe"]="setupurl",
+ ["ro"]="seteazaurl",
+ },
+ ["setupversions"]={
+ ["cs"]="nastavverze",
+ ["de"]="stelleversionein",
+ ["en"]="setupversions",
+ ["fr"]="regleversions",
+ ["it"]="impostaversioni",
+ ["nl"]="stelversiesin",
+ ["pe"]="بارگذاری‌نسخه‌ها",
+ ["ro"]="seteazaversiuni",
+ },
+ ["setupwhitespace"]={
+ ["cs"]="nastavbilamista",
+ ["de"]="stellezwischenraumein",
+ ["en"]="setupwhitespace",
+ ["fr"]="regleespaceblanc",
+ ["it"]="impostaspaziobianco",
+ ["nl"]="stelwitruimtein",
+ ["pe"]="بارگذاری‌Ùضای‌سÙید",
+ ["ro"]="seteazaspatiualb",
+ },
+ ["showbodyfont"]={
+ ["cs"]="ukazzakladnifont",
+ ["de"]="zeigefliesstext",
+ ["en"]="showbodyfont",
+ ["fr"]="montrepolicecorps",
+ ["it"]="mostrafontdeltesto",
+ ["nl"]="toonkorps",
+ ["pe"]="نمایش‌قلم‌بدنه",
+ ["ro"]="afiseazafonttext",
+ },
+ ["showbodyfontenvironment"]={
+ ["cs"]="ukazpostredizakladnihofontu",
+ ["de"]="zeigefliesstextumgebung",
+ ["en"]="showbodyfontenvironment",
+ ["fr"]="montreenvironnementpolicecorps",
+ ["it"]="mostraambientefontdeltesto",
+ ["nl"]="toonkorpsomgeving",
+ ["pe"]="نمایش‌مØیط‌قلم‌بدنه",
+ ["ro"]="afiseazamediufonttext",
+ },
+ ["showcolor"]={
+ ["cs"]="ukazbarvu",
+ ["de"]="zeigefarbe",
+ ["en"]="showcolor",
+ ["fr"]="montrecouleur",
+ ["it"]="mostracolore",
+ ["nl"]="toonkleur",
+ ["pe"]="نمایش‌رنگ",
+ ["ro"]="afiseazaculoare",
+ },
+ ["showcolorgroup"]={
+ ["cs"]="ukazskupinubarev",
+ ["de"]="zeigefarbengruppe",
+ ["en"]="showcolorgroup",
+ ["fr"]="montregroupecouleur",
+ ["it"]="mostragruppocolori",
+ ["nl"]="toonkleurgroep",
+ ["pe"]="نمایش‌گروه‌رنگ",
+ ["ro"]="afiseazagrupculoare",
+ },
+ ["showexternalfigures"]={
+ ["cs"]="ukazexterniobrazy",
+ ["de"]="zeigeexterneabbildungen",
+ ["en"]="showexternalfigures",
+ ["fr"]="montrefiguresexternes",
+ ["it"]="mostrafiguresterne",
+ ["nl"]="toonexternefiguren",
+ ["pe"]="نمایش‌شکلهای‌خارجی",
+ ["ro"]="afiseazafiguriexterne",
+ },
+ ["showfields"]={
+ ["cs"]="ukazpole",
+ ["de"]="zeigefelder",
+ ["en"]="showfields",
+ ["fr"]="montrechamps",
+ ["it"]="mostracampi",
+ ["nl"]="toonvelden",
+ ["pe"]="نمایش‌میدانها",
+ ["ro"]="afiseazacampuri",
+ },
+ ["showframe"]={
+ ["cs"]="ukazramecek",
+ ["de"]="zeigerahmen",
+ ["en"]="showframe",
+ ["fr"]="montrecadre",
+ ["it"]="mostracornice",
+ ["nl"]="toonkader",
+ ["pe"]="نمایش‌قالب",
+ ["ro"]="afiseazarama",
+ },
+ ["showgrid"]={
+ ["cs"]="ukazmrizku",
+ ["de"]="zeigegitter",
+ ["en"]="showgrid",
+ ["fr"]="montregrille",
+ ["it"]="mostragriglia",
+ ["nl"]="toongrid",
+ ["pe"]="نمایش‌توری",
+ ["ro"]="afiseazagrid",
+ },
+ ["showlayout"]={
+ ["cs"]="ukazvzhled",
+ ["de"]="zeigelayout",
+ ["en"]="showlayout",
+ ["fr"]="montredisposition",
+ ["it"]="mostralyout",
+ ["nl"]="toonlayout",
+ ["pe"]="نمایش‌طرØ‌بندی",
+ ["ro"]="afiseazaaspect",
+ },
+ ["showmakeup"]={
+ ["cs"]="ukazupravu",
+ ["de"]="zeigeumbruch",
+ ["en"]="showmakeup",
+ ["fr"]="montremakeup",
+ ["it"]="mostramakeup",
+ ["nl"]="toonopmaak",
+ ["pe"]="نمایش‌آرایش",
+ ["ro"]="afiseazamakeup",
+ },
+ ["showpalet"]={
+ ["cs"]="ukazpaletu",
+ ["de"]="zeigepalette",
+ ["en"]="showpalet",
+ ["fr"]="montrepalette",
+ ["it"]="mostratavolozza",
+ ["nl"]="toonpalet",
+ ["pe"]="نمایش‌لوØ",
+ ["ro"]="afiseazapaleta",
+ },
+ ["showprint"]={
+ ["cs"]="ukazvytisk",
+ ["de"]="zeigedruck",
+ ["en"]="showprint",
+ ["fr"]="montreedition",
+ ["it"]="mostrastampa",
+ ["nl"]="toonprint",
+ ["pe"]="نمایش‌چاپ",
+ ["ro"]="afiseazatiparire",
+ },
+ ["showsetups"]={
+ ["cs"]="ukaznastaveni",
+ ["de"]="zeigeeinstellungen",
+ ["en"]="showsetups",
+ ["fr"]="montrereglages",
+ ["it"]="mostraimpostazioni",
+ ["nl"]="tooninstellingen",
+ ["pe"]="نمایش‌بارگذاریها",
+ ["ro"]="afiseazasetari",
+ },
+ ["showstruts"]={
+ ["cs"]="ukazpodpery",
+ ["de"]="zeigestruts",
+ ["en"]="showstruts",
+ ["fr"]="montrestruts",
+ ["it"]="mostrastruts",
+ ["nl"]="toonstruts",
+ ["pe"]="نمایش‌بستها",
+ ["ro"]="afiseazastruts",
+ },
+ ["showsymbolset"]={
+ ["cs"]="ukazsadusymbolu",
+ ["de"]="showsymbolset",
+ ["en"]="showsymbolset",
+ ["fr"]="montrejeusymboles",
+ ["it"]="mostrasetsimboli",
+ ["nl"]="toonsymboolset",
+ ["pe"]="نمایش‌مجموعه‌علامت",
+ ["ro"]="afiseazasetsimboluri",
+ },
+ ["smallcapped"]={
+ ["cs"]="kap",
+ ["de"]="kap",
+ ["en"]="cap",
+ ["fr"]="cap",
+ ["it"]="cap",
+ ["nl"]="kap",
+ ["pe"]="cap",
+ ["ro"]="kap",
+ },
+ ["someline"]={
+ ["cs"]="nejakyradek",
+ ["de"]="einezeile",
+ ["en"]="someline",
+ ["fr"]="uneligne",
+ ["it"]="qualcheriga",
+ ["nl"]="eenregel",
+ ["pe"]="یک‌خط",
+ ["ro"]="olinie",
+ },
+ ["somewhere"]={
+ ["cs"]="nekde",
+ ["de"]="irgendwo",
+ ["en"]="somewhere",
+ ["fr"]="qqpart",
+ ["it"]="daqualcheparte",
+ ["nl"]="ergens",
+ ["pe"]="یک‌جا",
+ ["ro"]="undeva",
+ },
+ ["space"]={
+ ["cs"]="mezera",
+ ["de"]="spatium",
+ ["en"]="space",
+ ["fr"]="espace",
+ ["it"]="spazio",
+ ["nl"]="spatie",
+ ["pe"]="Ùضا",
+ ["ro"]="spatiu",
+ },
+ ["splitfloat"]={
+ ["cs"]="rozdelplvouciobjekt",
+ ["de"]="teilegleitobjekt",
+ ["en"]="splitfloat",
+ ["fr"]="separeflottant",
+ ["it"]="spezzaoggettomobile",
+ ["nl"]="splitsplaatsblok",
+ ["pe"]="شکاÙتن‌شناور",
+ ["ro"]="impartefloat",
+ },
+ ["startalignment"]={
+ ["cs"]="startzarovnavani",
+ ["de"]="startausrichtung",
+ ["en"]="startalignment",
+ ["fr"]="demarrealignement",
+ ["it"]="iniziaallineamento",
+ ["nl"]="startuitlijnen",
+ ["pe"]="شروع‌تنظیم",
+ ["ro"]="startaliniere",
+ },
+ ["startbackground"]={
+ ["cs"]="startpozadi",
+ ["de"]="starthintergrund",
+ ["en"]="startbackground",
+ ["fr"]="demarrearriereplan",
+ ["it"]="iniziasfondo",
+ ["nl"]="startachtergrond",
+ ["pe"]="شروع‌پس‌زمینه",
+ ["ro"]="startfundal",
+ },
+ ["startcoding"]={
+ ["cs"]="startkodovani",
+ ["de"]="startkodierung",
+ ["en"]="startcoding",
+ ["fr"]="demarrecodage",
+ ["it"]="iniziacodifica",
+ ["nl"]="startcodering",
+ ["pe"]="شروع‌کد",
+ ["ro"]="startcodificare",
+ },
+ ["startcolor"]={
+ ["cs"]="startbarva",
+ ["de"]="startfarbe",
+ ["en"]="startcolor",
+ ["fr"]="demarrecouleur",
+ ["it"]="iniziacolore",
+ ["nl"]="startkleur",
+ ["pe"]="شروع‌رنگ",
+ ["ro"]="startculoare",
+ },
+ ["startcolumnmakeup"]={
+ ["cs"]="startcolumnmakeup",
+ ["de"]="startcolumnmakeup",
+ ["en"]="startcolumnmakeup",
+ ["fr"]="startcolumnmakeup",
+ ["it"]="startcolumnmakeup",
+ ["nl"]="startkolomopmaak",
+ ["pe"]="شروع‌آرایش‌ستون",
+ ["ro"]="startcolumnmakeup",
+ },
+ ["startcolumns"]={
+ ["cs"]="startsloupce",
+ ["de"]="startspalten",
+ ["en"]="startcolumns",
+ ["fr"]="demarrecolonnes",
+ ["it"]="iniziacolonne",
+ ["nl"]="startkolommen",
+ ["pe"]="شروع‌ستونها",
+ ["ro"]="startcoloane",
+ },
+ ["startcolumnset"]={
+ ["cs"]="startcolumnset",
+ ["de"]="startcolumnset",
+ ["en"]="startcolumnset",
+ ["fr"]="demarrejeucolonne",
+ ["it"]="iniziagruppocolonne",
+ ["nl"]="startkolomgroep",
+ ["pe"]="شروع‌مجموعه‌ستون",
+ ["ro"]="startcolumnset",
+ },
+ ["startcombination"]={
+ ["cs"]="startspojeni",
+ ["de"]="startkombination",
+ ["en"]="startcombination",
+ ["fr"]="demarrecombinaison",
+ ["it"]="iniziacombinazione",
+ ["nl"]="startcombinatie",
+ ["pe"]="شروع‌ترکیب",
+ ["ro"]="startcombinare",
+ },
+ ["startcomponent"]={
+ ["cs"]="startkomponenta",
+ ["de"]="startkomponente",
+ ["en"]="startcomponent",
+ ["fr"]="demarrecomposant",
+ ["it"]="iniziacomponente",
+ ["nl"]="startonderdeel",
+ ["pe"]="شروع‌مولÙÙ‡",
+ ["ro"]="startcomponenta",
+ },
+ ["startdocument"]={
+ ["cs"]="startdokument",
+ ["de"]="startdokument",
+ ["en"]="startdocument",
+ ["fr"]="demarredocument",
+ ["it"]="iniziadocumento",
+ ["nl"]="startdocument",
+ ["pe"]="شروع‌نوشتار",
+ ["ro"]="startdocument",
+ },
+ ["startenvironment"]={
+ ["cs"]="startprostredi",
+ ["de"]="startumgebung",
+ ["en"]="startenvironment",
+ ["fr"]="demarreenvironement",
+ ["it"]="iniziaambiente",
+ ["nl"]="startomgeving",
+ ["pe"]="شروع‌مØیط",
+ ["ro"]="startmediu",
+ },
+ ["startfigure"]={
+ ["cs"]="startobraz",
+ ["de"]="startabbildung",
+ ["en"]="startfigure",
+ ["fr"]="demarrefigure",
+ ["it"]="iniziafigura",
+ ["nl"]="startfiguur",
+ ["pe"]="شروع‌شکل",
+ ["ro"]="startfigura",
+ },
+ ["startglobal"]={
+ ["cs"]="startglobalni",
+ ["de"]="startglobal",
+ ["en"]="startglobal",
+ ["fr"]="demarreglobal",
+ ["it"]="iniziaglobale",
+ ["nl"]="startglobaal",
+ ["pe"]="شروع‌سراسری",
+ ["ro"]="startglobal",
+ },
+ ["startline"]={
+ ["cs"]="startradek",
+ ["de"]="startzeile",
+ ["en"]="startline",
+ ["fr"]="demarreligne",
+ ["it"]="iniziariga",
+ ["nl"]="startregel",
+ ["pe"]="شروع‌خط",
+ ["ro"]="startlinie",
+ },
+ ["startlinecorrection"]={
+ ["cs"]="startkorekceradku",
+ ["de"]="startzeilenkorrektur",
+ ["en"]="startlinecorrection",
+ ["fr"]="demarrecorrectionligne",
+ ["it"]="iniziacorrezioneriga",
+ ["nl"]="startregelcorrectie",
+ ["pe"]="شروع‌تصØÛŒØ‌خط",
+ ["ro"]="startcorectielinie",
+ },
+ ["startlinenumbering"]={
+ ["cs"]="startcislovaniradku",
+ ["de"]="startzeilennumerierung",
+ ["en"]="startlinenumbering",
+ ["fr"]="demarrenumerotationligne",
+ ["it"]="inizianumerazionerighe",
+ ["nl"]="startregelnummeren",
+ ["pe"]="شروع‌شماره‌گذاری‌خط",
+ ["ro"]="startnumerotarelinii",
+ },
+ ["startlines"]={
+ ["cs"]="startradky",
+ ["de"]="startzeilen",
+ ["en"]="startlines",
+ ["fr"]="demarrelignes",
+ ["it"]="iniziarighe",
+ ["nl"]="startregels",
+ ["pe"]="شروع‌خطها",
+ ["ro"]="startlinii",
+ },
+ ["startlocal"]={
+ ["cs"]="startlokalni",
+ ["de"]="startlokal",
+ ["en"]="startlocal",
+ ["fr"]="demarrelocal",
+ ["it"]="inizialocale",
+ ["nl"]="startlokaal",
+ ["pe"]="شروع‌موضعی",
+ ["ro"]="startlocal",
+ },
+ ["startlocalfootnotes"]={
+ ["cs"]="startlokalnipoznamkypodcarou",
+ ["de"]="startlokalefussnoten",
+ ["en"]="startlocalfootnotes",
+ ["fr"]="demarrenotespdplocales",
+ ["it"]="inizianotepdplocali",
+ ["nl"]="startlokalevoetnoten",
+ ["pe"]="شروع‌پانوشتهای‌موضعی",
+ ["ro"]="startnotesubsollocale",
+ },
+ ["startmakeup"]={
+ ["cs"]="startuprava",
+ ["de"]="startumbruch",
+ ["en"]="startmakeup",
+ ["fr"]="demarremakeup",
+ ["it"]="iniziamakeup",
+ ["nl"]="startopmaak",
+ ["pe"]="شروع‌آرایش",
+ ["ro"]="startmakeup",
+ },
+ ["startmarginblock"]={
+ ["cs"]="startmarginalniblok",
+ ["de"]="startmarginalblock",
+ ["en"]="startmarginblock",
+ ["fr"]="demarreblocmarge",
+ ["it"]="iniziabloccomargine",
+ ["nl"]="startmargeblok",
+ ["pe"]="شروع‌بلوک‌Øاشیه",
+ ["ro"]="startblocmarginal",
+ },
+ ["startmarginrule"]={
+ ["cs"]="startmarginalnilinka",
+ ["de"]="startmarginallinie",
+ ["en"]="startmarginrule",
+ ["fr"]="demarremargereglee",
+ ["it"]="inizialineamargine",
+ ["nl"]="startkantlijn",
+ ["pe"]="شروع‌خط‌Øاشیه",
+ ["ro"]="startliniemargine",
+ },
+ ["startnarrower"]={
+ ["cs"]="startzuzeni",
+ ["de"]="startenger",
+ ["en"]="startnarrower",
+ ["fr"]="demarrecompoetroite",
+ ["it"]="iniziapiustretto",
+ ["nl"]="startsmaller",
+ ["pe"]="شروع‌باریکتر",
+ ["ro"]="startingust",
+ },
+ ["startopposite"]={
+ ["cs"]="startprotejsek",
+ ["de"]="startgegenueber",
+ ["en"]="startopposite",
+ ["fr"]="demarreopposition",
+ ["it"]="iniziaopposto",
+ ["nl"]="startnaast",
+ ["pe"]="شروع‌مخالÙ",
+ ["ro"]="startopozit",
+ },
+ ["startoverlay"]={
+ ["cs"]="startprekryv",
+ ["de"]="startoverlay",
+ ["en"]="startoverlay",
+ ["fr"]="demarrerevetement",
+ ["it"]="iniziasovrapposizione",
+ ["nl"]="startoverlay",
+ ["pe"]="شروع‌پوشش",
+ ["ro"]="startoverlay",
+ },
+ ["startoverzicht"]={
+ ["cs"]="startprehled",
+ ["de"]="startueberblick",
+ ["en"]="startoverview",
+ ["fr"]="demarrevuedensemble",
+ ["it"]="iniziaoverview",
+ ["nl"]="startoverzicht",
+ ["pe"]="شروع‌بازبینی",
+ ["ro"]="startoverview",
+ },
+ ["startpacked"]={
+ ["cs"]="startzhustene",
+ ["de"]="startkleinerdurchschuss",
+ ["en"]="startpacked",
+ ["fr"]="demarregroupe",
+ ["it"]="iniziaimpaccato",
+ ["nl"]="startopelkaar",
+ ["pe"]="شروع‌Ùشرده",
+ ["ro"]="startimpachetat",
+ },
+ ["startpositioning"]={
+ ["cs"]="startumistovani",
+ ["de"]="startpositionieren",
+ ["en"]="startpositioning",
+ ["fr"]="demarrepositionnement",
+ ["it"]="iniziaposizionamento",
+ ["nl"]="startpositioneren",
+ ["pe"]="شروع‌مکان‌گذاری",
+ ["ro"]="startpozitionare",
+ },
+ ["startproduct"]={
+ ["cs"]="startprodukt",
+ ["de"]="startprodukt",
+ ["en"]="startproduct",
+ ["fr"]="demarreproduit",
+ ["it"]="iniziaprodotto",
+ ["nl"]="startprodukt",
+ ["pe"]="شروع‌تولید",
+ ["ro"]="startprodus",
+ },
+ ["startprofile"]={
+ ["cs"]="startprofil",
+ ["de"]="startprofil",
+ ["en"]="startprofile",
+ ["fr"]="demarreprofil",
+ ["it"]="iniziaprofilo",
+ ["nl"]="startprofiel",
+ ["pe"]="شروع‌پروÙایل",
+ ["ro"]="startprofil",
+ },
+ ["startproject"]={
+ ["cs"]="startprojekt",
+ ["de"]="startprojekt",
+ ["en"]="startproject",
+ ["fr"]="demarreprojet",
+ ["it"]="iniziaprogetto",
+ ["nl"]="startprojekt",
+ ["pe"]="شروع‌پروژه",
+ ["ro"]="startproiect",
+ },
+ ["startquotation"]={
+ ["cs"]="startcitace",
+ ["de"]="startzitat",
+ ["en"]="startquotation",
+ ["fr"]="demarrecitation",
+ ["it"]="iniziacitazione",
+ ["nl"]="startcitaat",
+ ["pe"]="شروع‌نقل‌قول",
+ ["ro"]="startcitat",
+ },
+ ["startraster"]={
+ ["cs"]="startrastr",
+ ["de"]="startraster",
+ ["en"]="startraster",
+ ["fr"]="demarreraster",
+ ["it"]="iniziaraster",
+ ["nl"]="startraster",
+ ["pe"]="startraster",
+ ["ro"]="startraster",
+ },
+ ["startsymbolset"]={
+ ["cs"]="startsadasymbolu",
+ ["de"]="startsymbolset",
+ ["en"]="startsymbolset",
+ ["fr"]="demarrejeusymboles",
+ ["it"]="iniziasetsimboli",
+ ["nl"]="startsymboolset",
+ ["pe"]="شروع‌مجموعه‌نماد",
+ ["ro"]="startsetsimboluri",
+ },
+ ["startsynchronization"]={
+ ["cs"]="startsynchronizace",
+ ["de"]="startsynchronisation",
+ ["en"]="startsynchronization",
+ ["fr"]="demarresynchronisation",
+ ["it"]="iniziasincronizzazione",
+ ["nl"]="startsynchronisatie",
+ ["pe"]="شروع‌تطابق",
+ ["ro"]="startsincronizare",
+ },
+ ["starttable"]={
+ ["cs"]="starttabulka",
+ ["de"]="starttabelle",
+ ["en"]="starttable",
+ ["fr"]="demarretableau",
+ ["it"]="iniziatabella",
+ ["nl"]="starttabel",
+ ["pe"]="شروع‌جدول",
+ ["ro"]="starttabel",
+ },
+ ["starttables"]={
+ ["cs"]="starttabulky",
+ ["de"]="starttabellen",
+ ["en"]="starttables",
+ ["fr"]="demarretableaux",
+ ["it"]="iniziatabelle",
+ ["nl"]="starttabellen",
+ ["pe"]="شروع‌جدولها",
+ ["ro"]="starttabele",
+ },
+ ["starttext"]={
+ ["cs"]="starttext",
+ ["de"]="starttext",
+ ["en"]="starttext",
+ ["fr"]="demarretexte",
+ ["it"]="iniziatesto",
+ ["nl"]="starttekst",
+ ["pe"]="شروع‌متن",
+ ["ro"]="starttext",
+ },
+ ["starttextrule"]={
+ ["cs"]="starttextovalinka",
+ ["de"]="starttextlinie",
+ ["en"]="starttextrule",
+ ["fr"]="demarreligneregleetexte",
+ ["it"]="inizialineatesto",
+ ["nl"]="starttekstlijn",
+ ["pe"]="شروع‌خط‌متن",
+ ["ro"]="startriglatext",
+ },
+ ["startunpacked"]={
+ ["cs"]="startnezhustene",
+ ["de"]="startgrosserdurchschuss",
+ ["en"]="startunpacked",
+ ["fr"]="demarredegroupe",
+ ["it"]="iniziaunpacked",
+ ["nl"]="startvanelkaar",
+ ["pe"]="شروع‌غیر‌Ùشرده",
+ ["ro"]="startneimpachetat",
+ },
+ ["startversion"]={
+ ["cs"]="startverze",
+ ["de"]="startversion",
+ ["en"]="startversion",
+ ["fr"]="demarreversion",
+ ["it"]="iniziaversione",
+ ["nl"]="startversie",
+ ["pe"]="شروع‌نسخه",
+ ["ro"]="startversiune",
+ },
+ ["stopalignment"]={
+ ["cs"]="stopzarovnavani",
+ ["de"]="stopausrichtung",
+ ["en"]="stopalignment",
+ ["fr"]="stoppealignement",
+ ["it"]="terminaallineamento",
+ ["nl"]="stopuitlijnen",
+ ["pe"]="پایان‌تنظیم",
+ ["ro"]="stopaliniere",
+ },
+ ["stopbackground"]={
+ ["cs"]="stoppozadi",
+ ["de"]="stophintergrund",
+ ["en"]="stopbackground",
+ ["fr"]="stoppearriereplan",
+ ["it"]="terminasfondo",
+ ["nl"]="stopachtergrond",
+ ["pe"]="پایان‌پس‌زمینه",
+ ["ro"]="stopfundal",
+ },
+ ["stopcoding"]={
+ ["cs"]="stopkodovani",
+ ["de"]="stopkodierung",
+ ["en"]="stopcoding",
+ ["fr"]="stoppecodage",
+ ["it"]="terminacodifica",
+ ["nl"]="stopcodering",
+ ["pe"]="پایان‌کد",
+ ["ro"]="stopcodificare",
+ },
+ ["stopcolor"]={
+ ["cs"]="stopbarva",
+ ["de"]="stopfarbe",
+ ["en"]="stopcolor",
+ ["fr"]="stoppecouleur",
+ ["it"]="terminacolore",
+ ["nl"]="stopkleur",
+ ["pe"]="پایان‌رنگ",
+ ["ro"]="stopculoare",
+ },
+ ["stopcolumnmakeup"]={
+ ["cs"]="stopcolumnmakeup",
+ ["de"]="stopcolumnmakeup",
+ ["en"]="stopcolumnmakeup",
+ ["fr"]="stopcolumnmakeup",
+ ["it"]="stopcolumnmakeup",
+ ["nl"]="stopkolomopmaak",
+ ["pe"]="پایان‌آرایش‌ستون",
+ ["ro"]="stopcolumnmakeup",
+ },
+ ["stopcolumns"]={
+ ["cs"]="stopsloupce",
+ ["de"]="stopspalten",
+ ["en"]="stopcolumns",
+ ["fr"]="stoppecolonnes",
+ ["it"]="terminacolonne",
+ ["nl"]="stopkolommen",
+ ["pe"]="پایان‌ستونها",
+ ["ro"]="stopcoloane",
+ },
+ ["stopcolumnset"]={
+ ["cs"]="stopcolumnset",
+ ["de"]="stopcolumnset",
+ ["en"]="stopcolumnset",
+ ["fr"]="stoppejeucolonne",
+ ["it"]="terminagruppocolonne",
+ ["nl"]="stopkolomgroep",
+ ["pe"]="پایان‌مجموعه‌ستون",
+ ["ro"]="stopcolumnset",
+ },
+ ["stopcombination"]={
+ ["cs"]="stopspojeni",
+ ["de"]="stopkombination",
+ ["en"]="stopcombination",
+ ["fr"]="stoppecombinaison",
+ ["it"]="terminacombinazione",
+ ["nl"]="stopcombinatie",
+ ["pe"]="پایان‌ترکیب",
+ ["ro"]="stopcombinare",
+ },
+ ["stopcomponent"]={
+ ["cs"]="stopkomponenta",
+ ["de"]="stopkomponente",
+ ["en"]="stopcomponent",
+ ["fr"]="stoppecomposant",
+ ["it"]="terminacomponente",
+ ["nl"]="stoponderdeel",
+ ["pe"]="پایان‌مولÙÙ‡",
+ ["ro"]="stopcomponenta",
+ },
+ ["stopdocument"]={
+ ["cs"]="stopdokument",
+ ["de"]="stopdokument",
+ ["en"]="stopdocument",
+ ["fr"]="stoppedocument",
+ ["it"]="terminadocumento",
+ ["nl"]="stopdocument",
+ ["pe"]="پایان‌نوشتار",
+ ["ro"]="stopdocument",
+ },
+ ["stopenvironment"]={
+ ["cs"]="stopprostredi",
+ ["de"]="stopumgebung",
+ ["en"]="stopenvironment",
+ ["fr"]="stoppeenvironement",
+ ["it"]="terminaambiente",
+ ["nl"]="stopomgeving",
+ ["pe"]="پایان‌مØیط",
+ ["ro"]="stopmediu",
+ },
+ ["stopglobal"]={
+ ["cs"]="stopglobalni",
+ ["de"]="stopglobal",
+ ["en"]="stopglobal",
+ ["fr"]="stoppeglobal",
+ ["it"]="terminaglobale",
+ ["nl"]="stopglobaal",
+ ["pe"]="پایان‌سراسری",
+ ["ro"]="stopblobal",
+ },
+ ["stopline"]={
+ ["cs"]="stopradek",
+ ["de"]="stopzeile",
+ ["en"]="stopline",
+ ["fr"]="stoppeligne",
+ ["it"]="terminariga",
+ ["nl"]="stopregel",
+ ["pe"]="پایان‌خط",
+ ["ro"]="stoplinie",
+ },
+ ["stoplinecorrection"]={
+ ["cs"]="stopkorekceradku",
+ ["de"]="stopzeilenkorrektur",
+ ["en"]="stoplinecorrection",
+ ["fr"]="stoppecorrectionligne",
+ ["it"]="terminacorrezioneriga",
+ ["nl"]="stopregelcorrectie",
+ ["pe"]="پایان‌تصØÛŒØ‌خط",
+ ["ro"]="stopcorectielinie",
+ },
+ ["stoplinenumbering"]={
+ ["cs"]="stopcislovaniradku",
+ ["de"]="stopzeilennumerierung",
+ ["en"]="stoplinenumbering",
+ ["fr"]="stoppenumerotationligne",
+ ["it"]="terminanumerazionerighe",
+ ["nl"]="stopregelnummeren",
+ ["pe"]="پایان‌شماره‌گذاری‌خط",
+ ["ro"]="stopnumerotarelinii",
+ },
+ ["stoplines"]={
+ ["cs"]="stopradky",
+ ["de"]="stopzeilen",
+ ["en"]="stoplines",
+ ["fr"]="stoppelignes",
+ ["it"]="terminarighe",
+ ["nl"]="stopregels",
+ ["pe"]="پایان‌خطها",
+ ["ro"]="stoplinii",
+ },
+ ["stoplocal"]={
+ ["cs"]="stoplokalni",
+ ["de"]="stoplokal",
+ ["en"]="stoplocal",
+ ["fr"]="stoppelocal",
+ ["it"]="terminalocale",
+ ["nl"]="stoplokaal",
+ ["pe"]="پایان‌موضعی",
+ ["ro"]="stoplocal",
+ },
+ ["stoplocalfootnotes"]={
+ ["cs"]="stoplokalnipoznamkypodcarou",
+ ["de"]="stoplokalefussnoten",
+ ["en"]="stoplocalfootnotes",
+ ["fr"]="stoppenotespdplocales",
+ ["it"]="terminanotepdplocali",
+ ["nl"]="stoplokalevoetnoten",
+ ["pe"]="پایان‌پانوشتهای‌موضعی",
+ ["ro"]="stopnotesubsollocale",
+ },
+ ["stopmakeup"]={
+ ["cs"]="stopuprava",
+ ["de"]="stopumbruch",
+ ["en"]="stopmakeup",
+ ["fr"]="stoppemakeup",
+ ["it"]="terminamakeup",
+ ["nl"]="stopopmaak",
+ ["pe"]="پایان‌آرایش",
+ ["ro"]="stopmakeup",
+ },
+ ["stopmarginblock"]={
+ ["cs"]="stopmarginalniblok",
+ ["de"]="stopmarginalblock",
+ ["en"]="stopmarginblock",
+ ["fr"]="stoppeblocmarge",
+ ["it"]="terminabloccomargine",
+ ["nl"]="stopmargeblok",
+ ["pe"]="پایان‌بلوک‌Øاشیه",
+ ["ro"]="stopblocmarginal",
+ },
+ ["stopmarginrule"]={
+ ["cs"]="stopmarginalnilinka",
+ ["de"]="stopmarginallinie",
+ ["en"]="stopmarginrule",
+ ["fr"]="stoppemargereglee",
+ ["it"]="terminalineamargine",
+ ["nl"]="stopkantlijn",
+ ["pe"]="پایان‌خط‌Øاشیه",
+ ["ro"]="stopliniemargine",
+ },
+ ["stopnarrower"]={
+ ["cs"]="stopzuzeni",
+ ["de"]="stopenger",
+ ["en"]="stopnarrower",
+ ["fr"]="stopcompoetroite",
+ ["it"]="terminapiustretto",
+ ["nl"]="stopsmaller",
+ ["pe"]="پایان‌نازکتر",
+ ["ro"]="stopingust",
+ },
+ ["stopopposite"]={
+ ["cs"]="stopprotejsek",
+ ["de"]="stopgegenueber",
+ ["en"]="stopopposite",
+ ["fr"]="stoppeopposition",
+ ["it"]="terminaopposto",
+ ["nl"]="stopnaast",
+ ["pe"]="پایان‌مخالÙ",
+ ["ro"]="stopopozit",
+ },
+ ["stopoverlay"]={
+ ["cs"]="stopprekryv",
+ ["de"]="stopoverlay",
+ ["en"]="stopoverlay",
+ ["fr"]="stopperevetement",
+ ["it"]="terminasovrapposizione",
+ ["nl"]="stopoverlay",
+ ["pe"]="پایان‌پوشش",
+ ["ro"]="stopoverlay",
+ },
+ ["stopoverzicht"]={
+ ["cs"]="stopprehled",
+ ["de"]="stopueberblick",
+ ["en"]="stopoverview",
+ ["fr"]="stoppevuedensemble",
+ ["it"]="terminaoverview",
+ ["nl"]="stopoverzicht",
+ ["pe"]="پایان‌بازبینی",
+ ["ro"]="stopoverview",
+ },
+ ["stoppacked"]={
+ ["cs"]="stopzhustene",
+ ["de"]="stopkleinerdurchschuss",
+ ["en"]="stoppacked",
+ ["fr"]="stoppegroupe",
+ ["it"]="terminaimpaccato",
+ ["nl"]="stopopelkaar",
+ ["pe"]="پایان‌Ùشرده",
+ ["ro"]="stopimpachetat",
+ },
+ ["stoppositioning"]={
+ ["cs"]="stopumistovani",
+ ["de"]="stoppositionieren",
+ ["en"]="stoppositioning",
+ ["fr"]="stoppepositionnement",
+ ["it"]="terminaposizionamento",
+ ["nl"]="stoppositioneren",
+ ["pe"]="پایان‌مکان‌گذاری",
+ ["ro"]="stoppozitionare",
+ },
+ ["stopproduct"]={
+ ["cs"]="stopprodukt",
+ ["de"]="stopprodukt",
+ ["en"]="stopproduct",
+ ["fr"]="stoppeproduit",
+ ["it"]="terminaprodotto",
+ ["nl"]="stopprodukt",
+ ["pe"]="پایان‌تولید",
+ ["ro"]="stopprodus",
+ },
+ ["stopprofile"]={
+ ["cs"]="stopprofil",
+ ["de"]="stopprofil",
+ ["en"]="stopprofile",
+ ["fr"]="stoppeprofil",
+ ["it"]="terminaprofili",
+ ["nl"]="stopprofiel",
+ ["pe"]="پایان‌پروÙایل",
+ ["ro"]="stopprofil",
+ },
+ ["stopproject"]={
+ ["cs"]="stopprojekt",
+ ["de"]="stopprojekt",
+ ["en"]="stopproject",
+ ["fr"]="stoppeprojet",
+ ["it"]="terminaprogetto",
+ ["nl"]="stopprojekt",
+ ["pe"]="پایان‌پروژه",
+ ["ro"]="stopproiect",
+ },
+ ["stopquotation"]={
+ ["cs"]="stopcitace",
+ ["de"]="stopzitat",
+ ["en"]="stopquotation",
+ ["fr"]="stoppecitation",
+ ["it"]="terminacitazione",
+ ["nl"]="stopcitaat",
+ ["pe"]="پایان‌نقل‌قول",
+ ["ro"]="stopcitat",
+ },
+ ["stopraster"]={
+ ["cs"]="stoprastr",
+ ["de"]="stopraster",
+ ["en"]="stopraster",
+ ["fr"]="stopperaster",
+ ["it"]="terminaraster",
+ ["nl"]="stopraster",
+ ["pe"]="stopraster",
+ ["ro"]="stopraster",
+ },
+ ["stopsynchronization"]={
+ ["cs"]="stopsynchronizace",
+ ["de"]="stopsynchronisation",
+ ["en"]="stopsynchronization",
+ ["fr"]="stoppesynchronisation",
+ ["it"]="terminasincronizzazione",
+ ["nl"]="stopsynchronisatie",
+ ["pe"]="پایان‌تطابق",
+ ["ro"]="stopsincronizare",
+ },
+ ["stoptable"]={
+ ["cs"]="stoptabulka",
+ ["de"]="stoptabelle",
+ ["en"]="stoptable",
+ ["fr"]="stoppetableau",
+ ["it"]="terminatabella",
+ ["nl"]="stoptabel",
+ ["pe"]="پایان‌جدول",
+ ["ro"]="stoptabel",
+ },
+ ["stoptables"]={
+ ["cs"]="stoptabulky",
+ ["de"]="stoptabellen",
+ ["en"]="stoptables",
+ ["fr"]="stoppetableaux",
+ ["it"]="terminatabelle",
+ ["nl"]="stoptabellen",
+ ["pe"]="پایان‌جدولها",
+ ["ro"]="stoptabele",
+ },
+ ["stoptext"]={
+ ["cs"]="stoptext",
+ ["de"]="stoptext",
+ ["en"]="stoptext",
+ ["fr"]="stoppetexte",
+ ["it"]="terminatesto",
+ ["nl"]="stoptekst",
+ ["pe"]="پایان‌متن",
+ ["ro"]="stoptext",
+ },
+ ["stoptextrule"]={
+ ["cs"]="stoptextovalinka",
+ ["de"]="stoptextlinie",
+ ["en"]="stoptextrule",
+ ["fr"]="stoppeligneregleetexte",
+ ["it"]="terminalineatesto",
+ ["nl"]="stoptekstlijn",
+ ["pe"]="پایان‌خط‌متن",
+ ["ro"]="stopriglatext",
+ },
+ ["stopunpacked"]={
+ ["cs"]="stopnezhustene",
+ ["de"]="stopgrosserdurchschuss",
+ ["en"]="stopunpacked",
+ ["fr"]="stoppedegroupe",
+ ["it"]="terminaunpacked",
+ ["nl"]="stopvanelkaar",
+ ["pe"]="پایان‌غیرÙشرده",
+ ["ro"]="stopneimpachetat",
+ },
+ ["stopversion"]={
+ ["cs"]="stopverze",
+ ["de"]="stopversion",
+ ["en"]="stopversion",
+ ["fr"]="stoppeversion",
+ ["it"]="terminaversioni",
+ ["nl"]="stopversie",
+ ["pe"]="پایان‌نسخه",
+ ["ro"]="stopversiune",
+ },
+ ["stretched"]={
+ ["cs"]="roztazene",
+ ["de"]="gestreckt",
+ ["en"]="stretched",
+ ["fr"]="etire",
+ ["it"]="stirato",
+ ["nl"]="uitgerekt",
+ ["pe"]="کشیده",
+ ["ro"]="intins",
+ },
+ ["subformulanumber"]={
+ ["cs"]="cislopodrovnice",
+ ["de"]="unterformelnummer",
+ ["en"]="subformulanumber",
+ ["fr"]="numerosousformule",
+ ["it"]="numerosottoformula",
+ ["nl"]="subformulenummer",
+ ["pe"]="شماره‌زیرÙرمول",
+ ["ro"]="numarsubformula",
+ },
+ ["subpagenumber"]={
+ ["cs"]="subpagenumber",
+ ["de"]="subpagenumber",
+ ["en"]="subpagenumber",
+ ["fr"]="sousnumeropage",
+ ["it"]="subpagenumber",
+ ["nl"]="subpaginanummer",
+ ["pe"]="شماره‌زیرصÙØÙ‡",
+ ["ro"]="subpagenumber",
+ },
+ ["switchtobodyfont"]={
+ ["cs"]="prepninazakladnifont",
+ ["de"]="wechselezumfliesstext",
+ ["en"]="switchtobodyfont",
+ ["fr"]="changepolicecorps",
+ ["it"]="cambiaafontdeltesto",
+ ["nl"]="switchnaarkorps",
+ ["pe"]="تغییربه‌قلم‌بدنه",
+ ["ro"]="trecilafonttext",
+ },
+ ["switchtorawfont"]={
+ ["cs"]="switchtorawfont",
+ ["de"]="switchtorawfont",
+ ["en"]="switchtorawfont",
+ ["fr"]="changepolicebrute",
+ ["it"]="passaafontgrezzo",
+ ["nl"]="switchtorawfont",
+ ["pe"]="تغییربه‌قلم‌خام",
+ ["ro"]="trecilafontraw",
+ },
+ ["sym"]={
+ ["cs"]="sym",
+ ["de"]="sym",
+ ["en"]="sym",
+ ["fr"]="sym",
+ ["it"]="sim",
+ ["nl"]="sym",
+ ["pe"]="نم",
+ ["ro"]="sim",
+ },
+ ["symbol"]={
+ ["cs"]="symbol",
+ ["de"]="symbol",
+ ["en"]="symbol",
+ ["fr"]="symbole",
+ ["it"]="simbolo",
+ ["nl"]="symbool",
+ ["pe"]="نماد",
+ ["ro"]="simbol",
+ },
+ ["synchronizationbar"]={
+ ["cs"]="synchronizacnilista",
+ ["de"]="synchronisationsbalken",
+ ["en"]="synchronizationbar",
+ ["fr"]="barresynchronisation",
+ ["it"]="barrasincronizzazione",
+ ["nl"]="synchronisatiebalk",
+ ["pe"]="میله‌تطابق",
+ ["ro"]="barasincronizare",
+ },
+ ["synchronize"]={
+ ["cs"]="synchronizovat",
+ ["de"]="synchronisieren",
+ ["en"]="synchronize",
+ ["fr"]="synchronise",
+ ["it"]="sincronizza",
+ ["nl"]="synchroniseer",
+ ["pe"]="تطابق",
+ ["ro"]="sincronizeaza",
+ },
+ ["tab"]={
+ ["cs"]="tab",
+ ["de"]="tab",
+ ["en"]="tab",
+ ["fr"]="tab",
+ ["it"]="tab",
+ ["nl"]="tab",
+ ["pe"]="تب",
+ ["ro"]="tab",
+ },
+ ["testcolumn"]={
+ ["cs"]="testcolumn",
+ ["de"]="testcolumn",
+ ["en"]="testcolumn",
+ ["fr"]="testcolumn",
+ ["it"]="testcolumn",
+ ["nl"]="testkolom",
+ ["pe"]="ستون‌امتØان",
+ ["ro"]="testcolumn",
+ },
+ ["testpage"]={
+ ["cs"]="testpage",
+ ["de"]="testpage",
+ ["en"]="testpage",
+ ["fr"]="testpage",
+ ["it"]="testpage",
+ ["nl"]="testpagina",
+ ["pe"]="صÙØه‌تست",
+ ["ro"]="testpage",
+ },
+ ["tex"]={
+ ["cs"]="tex",
+ ["de"]="tex",
+ ["en"]="tex",
+ ["fr"]="tex",
+ ["it"]="tex",
+ ["nl"]="tex",
+ ["pe"]="تک",
+ ["ro"]="tex",
+ },
+ ["textheight"]={
+ ["cs"]="vyskatextu",
+ ["de"]="texthoehe",
+ ["en"]="textheight",
+ ["fr"]="hauteurtexte",
+ ["it"]="altezzatesto",
+ ["nl"]="teksthoogte",
+ ["pe"]="ارتÙاع‌متن",
+ ["ro"]="inaltimetext",
+ },
+ ["textreference"]={
+ ["cs"]="odkaznatext",
+ ["de"]="textreferenz",
+ ["en"]="textreference",
+ ["fr"]="referencetexte",
+ ["it"]="riferimentotesto",
+ ["nl"]="tekstreferentie",
+ ["pe"]="مرجع‌متن",
+ ["ro"]="referintatext",
+ },
+ ["textrule"]={
+ ["cs"]="textovalinka",
+ ["de"]="textlinie",
+ ["en"]="textrule",
+ ["fr"]="ligneregleetexte",
+ ["it"]="lineatesto",
+ ["nl"]="tekstlijn",
+ ["pe"]="خط‌متن",
+ ["ro"]="riglatext",
+ },
+ ["textvariable"]={
+ ["cs"]="textvariable",
+ ["de"]="textvariable",
+ ["en"]="textvariable",
+ ["fr"]="variabletexte",
+ ["it"]="variabiletesto",
+ ["nl"]="tekstvariabele",
+ ["pe"]="متغیر متن",
+ ["ro"]="variabilatext",
+ },
+ ["textwidth"]={
+ ["cs"]="sirkatextu",
+ ["de"]="textbreite",
+ ["en"]="textwidth",
+ ["fr"]="largeurtexte",
+ ["it"]="ampiezzatesto",
+ ["nl"]="tekstbreedte",
+ ["pe"]="عرض‌متن",
+ ["ro"]="latimetext",
+ },
+ ["thinrule"]={
+ ["cs"]="tenkalinka",
+ ["de"]="duennelinie",
+ ["en"]="thinrule",
+ ["fr"]="traitfin",
+ ["it"]="lineasottile",
+ ["nl"]="dunnelijn",
+ ["pe"]="خط‌نازک",
+ ["ro"]="liniesubtire",
+ },
+ ["thinrules"]={
+ ["cs"]="tenkelinky",
+ ["de"]="duennerumriss",
+ ["en"]="thinrules",
+ ["fr"]="traitsfins",
+ ["it"]="lineesottili",
+ ["nl"]="dunnelijnen",
+ ["pe"]="خطهای‌نازک",
+ ["ro"]="liniisubtiri",
+ },
+ ["tooltip"]={
+ ["cs"]="bublinkovanapoveda",
+ ["de"]="tooltip",
+ ["en"]="tooltip",
+ ["fr"]="suggestion",
+ ["it"]="tooltip",
+ ["nl"]="suggestie",
+ ["pe"]="tooltip",
+ ["ro"]="tooltip",
+ },
+ ["topdistance"]={
+ ["cs"]="vzdalenosthorejsku",
+ ["de"]="abstandoben",
+ ["en"]="topdistance",
+ ["fr"]="distancesup",
+ ["it"]="distanzacima",
+ ["nl"]="bovenafstand",
+ ["pe"]="Ùاصله‌بالا",
+ ["ro"]="distantasus",
+ },
+ ["topheight"]={
+ ["cs"]="vyskahorejsku",
+ ["de"]="hoeheoben",
+ ["en"]="topheight",
+ ["fr"]="hauteursup",
+ ["it"]="altezzacima",
+ ["nl"]="bovenhoogte",
+ ["pe"]="ارتÙاع‌بالا",
+ ["ro"]="inaltimesus",
+ },
+ ["topspace"]={
+ ["cs"]="odsazenishora",
+ ["de"]="kopfweite",
+ ["en"]="topspace",
+ ["fr"]="espacesup",
+ ["it"]="spaziocima",
+ ["nl"]="kopwit",
+ ["pe"]="Ùضای‌بالا",
+ ["ro"]="spatiusus",
+ },
+ ["totalnumberofpages"]={
+ ["cs"]="celkovypocetstran",
+ ["de"]="gesamtseitenanzahl",
+ ["en"]="totalnumberofpages",
+ ["fr"]="nombretotaldepages",
+ ["it"]="numerototaledipagine",
+ ["nl"]="totaalaantalpaginas",
+ ["pe"]="شماره‌کل‌صÙØه‌ها",
+ ["ro"]="numartotalpagini",
+ },
+ ["translate"]={
+ ["cs"]="prelozit",
+ ["de"]="uebersetzten",
+ ["en"]="translate",
+ ["fr"]="traduire",
+ ["it"]="traduci",
+ ["nl"]="vertaal",
+ ["pe"]="ترجمه",
+ ["ro"]="traduce",
+ },
+ ["txt"]={
+ ["cs"]="txt",
+ ["de"]="txt",
+ ["en"]="txt",
+ ["fr"]="txt",
+ ["it"]="txt",
+ ["nl"]="txt",
+ ["pe"]="txt",
+ ["ro"]="txt",
+ },
+ ["typ"]={
+ ["cs"]="pis",
+ ["de"]="tip",
+ ["en"]="typ",
+ ["fr"]="typ",
+ ["it"]="typ",
+ ["nl"]="typ",
+ ["pe"]="typ",
+ ["ro"]="typ",
+ },
+ ["type"]={
+ ["cs"]="opis",
+ ["de"]="tippen",
+ ["en"]="type",
+ ["fr"]="dactylographier",
+ ["it"]="type",
+ ["nl"]="type",
+ ["pe"]="تایپ",
+ ["ro"]="type",
+ },
+ ["typebuffer"]={
+ ["cs"]="typebuffer",
+ ["de"]="tippepuffer",
+ ["en"]="typebuffer",
+ ["fr"]="tapebuffer",
+ ["it"]="typebuffer",
+ ["nl"]="typebuffer",
+ ["pe"]="تایپ‌باÙر",
+ ["ro"]="scriebuffer",
+ },
+ ["typefile"]={
+ ["cs"]="opissoubor",
+ ["de"]="tippedatei",
+ ["en"]="typefile",
+ ["fr"]="fichierdactylo",
+ ["it"]="typefile",
+ ["nl"]="typefile",
+ ["pe"]="تایپ‌پرونده",
+ ["ro"]="typefile",
+ },
+ ["underbar"]={
+ ["cs"]="podtrzeno",
+ ["de"]="unterstrichen",
+ ["en"]="underbar",
+ ["fr"]="souslignetout",
+ ["it"]="sottolinea",
+ ["nl"]="onderstreep",
+ ["pe"]="میله‌زیر",
+ ["ro"]="sublinie",
+ },
+ ["underbars"]={
+ ["cs"]="podtrzeni",
+ ["de"]="unterstreichen",
+ ["en"]="underbars",
+ ["fr"]="sousligne",
+ ["it"]="sottolinee",
+ ["nl"]="onderstrepen",
+ ["pe"]="میله‌‌های‌زیر",
+ ["ro"]="sublinii",
+ },
+ ["unitmeaning"]={
+ ["cs"]="vyznam",
+ ["de"]="bedeutung",
+ ["en"]="unitmeaning",
+ ["fr"]="sensunite",
+ ["it"]="nomeunita",
+ ["nl"]="betekenis",
+ ["pe"]="معنی‌واØد",
+ ["ro"]="numeunitate",
+ },
+ ["unknown"]={
+ ["cs"]="neznamo",
+ ["de"]="unbekant",
+ ["en"]="unknown",
+ ["fr"]="inconnu",
+ ["it"]="ignoto",
+ ["nl"]="onbekend",
+ ["pe"]="ناشناس",
+ ["ro"]="necunoscut",
+ },
+ ["useJSscripts"]={
+ ["cs"]="uzijJSscripts",
+ ["de"]="verwendeJSscript",
+ ["en"]="useJSscripts",
+ ["fr"]="utiliseJSscripts",
+ ["it"]="usaJSscripts",
+ ["nl"]="gebruikJSscripts",
+ ["pe"]="useJSscripts",
+ ["ro"]="folosestescriptJS",
+ },
+ ["useURL"]={
+ ["cs"]="uzijURL",
+ ["de"]="verwendeURL",
+ ["en"]="useURL",
+ ["fr"]="utiliseURL",
+ ["it"]="usaURL",
+ ["nl"]="gebruikURL",
+ ["pe"]="useURL",
+ ["ro"]="folosesteURL",
+ },
+ ["useXMLfilter"]={
+ ["cs"]="useXMLfilter",
+ ["de"]="useXMLfilter",
+ ["en"]="useXMLfilter",
+ ["fr"]="useXMLfilter",
+ ["it"]="useXMLfilter",
+ ["nl"]="gebruikXMLfilter",
+ ["pe"]="useXMLfilter",
+ ["ro"]="useXMLfilter",
+ },
+ ["useblocks"]={
+ ["cs"]="uzijbloky",
+ ["de"]="verwendebloecke",
+ ["en"]="useblocks",
+ ["fr"]="utiliseblocs",
+ ["it"]="usablocco",
+ ["nl"]="gebruikblokken",
+ ["pe"]="استÙاده‌بلوکها",
+ ["ro"]="folosestebloc",
+ },
+ ["usecommands"]={
+ ["cs"]="uzijprikazy",
+ ["de"]="verwendebefehl",
+ ["en"]="usecommands",
+ ["fr"]="utilisecommandes",
+ ["it"]="usacomandi",
+ ["nl"]="gebruikcommandos",
+ ["pe"]="استÙاده‌Ùرمانها",
+ ["ro"]="folosestecomenzi",
+ },
+ ["useencoding"]={
+ ["cs"]="uzijkodovani",
+ ["de"]="benutzekodierung",
+ ["en"]="useencoding",
+ ["fr"]="utiliseencodage",
+ ["it"]="usacodifica",
+ ["nl"]="usecodering",
+ ["pe"]="استÙاده‌رمزینه",
+ ["ro"]="folosestecodificarea",
+ },
+ ["useexternaldocument"]={
+ ["cs"]="uzijexternidokument",
+ ["de"]="verwendeexteresdokument",
+ ["en"]="useexternaldocument",
+ ["fr"]="utilisedocumentexterne",
+ ["it"]="usadocumentoesterno",
+ ["nl"]="gebruikexterndocument",
+ ["pe"]="استÙاده‌نوشتارخارجی",
+ ["ro"]="folosestedocumentextern",
+ },
+ ["useexternalfigure"]={
+ ["cs"]="uzijexterniobraz",
+ ["de"]="verwendeexterneabbildung",
+ ["en"]="useexternalfigure",
+ ["fr"]="utilisefigureexterne",
+ ["it"]="usafiguraesterna",
+ ["nl"]="gebruikexternfiguur",
+ ["pe"]="استÙاده‌شکل‌خارجی",
+ ["ro"]="folosestefiguraexterna",
+ },
+ ["useexternalfile"]={
+ ["cs"]="uzijexternisoubor",
+ ["de"]="verwendeexternedatei",
+ ["en"]="useexternalfile",
+ ["fr"]="utilisefichierexterne",
+ ["it"]="usafileesterno",
+ ["nl"]="gebruikexternefile",
+ ["pe"]="استÙاده‌پرونده‌خارجی",
+ ["ro"]="folosestefisierextern",
+ },
+ ["useexternalfiles"]={
+ ["cs"]="uzijexternisoubory",
+ ["de"]="verwendeexternedateien",
+ ["en"]="useexternalfiles",
+ ["fr"]="utilisefichiersexternes",
+ ["it"]="usafileesterni",
+ ["nl"]="gebruikexternefiles",
+ ["pe"]="استÙاده‌پرونده‌های‌خارجی",
+ ["ro"]="folosestefisiereexterne",
+ },
+ ["useexternalsoundtrack"]={
+ ["cs"]="uzijexternizvuk",
+ ["de"]="verwendeexternestonstueck",
+ ["en"]="useexternalsoundtrack",
+ ["fr"]="utilisepsiteaudioexterne",
+ ["it"]="usacolonnasonoraesterna",
+ ["nl"]="gebruikexterngeluidsfragment",
+ ["pe"]="استÙاده‌قطعه‌موزیک‌خارجی",
+ ["ro"]="folosestemuzicaexterna",
+ },
+ ["usemodule"]={
+ ["cs"]="uzijmodul",
+ ["de"]="verwendemodul",
+ ["en"]="usemodule",
+ ["fr"]="utilisemodule",
+ ["it"]="usamodulo",
+ ["nl"]="gebruikmodule",
+ ["pe"]="استÙاده‌مدول",
+ ["ro"]="folosestemodul",
+ },
+ ["usemodules"]={
+ ["cs"]="uzijmoduly",
+ ["de"]="verwendemodule",
+ ["en"]="usemodules",
+ ["fr"]="utilisemodules",
+ ["it"]="usamoduli",
+ ["nl"]="gebruikmodules",
+ ["pe"]="استÙاده‌مدولها",
+ ["ro"]="folosestemodule",
+ },
+ ["usepath"]={
+ ["cs"]="uzijadresar",
+ ["de"]="benutzeverzeichnis",
+ ["en"]="usedirectory",
+ ["fr"]="utilisechemin",
+ ["it"]="usacartella",
+ ["nl"]="gebruikgebied",
+ ["pe"]="استÙاده‌مسیر",
+ ["ro"]="folosestedirector",
+ },
+ ["usereferences"]={
+ ["cs"]="uzijodkazy",
+ ["de"]="verwendereferenzen",
+ ["en"]="usereferences",
+ ["fr"]="utilisereferences",
+ ["it"]="usariferimenti",
+ ["nl"]="gebruikreferenties",
+ ["pe"]="استÙاده‌مرجعها",
+ ["ro"]="folosestereferinte",
+ },
+ ["usespecials"]={
+ ["cs"]="uzijspeciality",
+ ["de"]="benutzespezielles",
+ ["en"]="usespecials",
+ ["fr"]="utilisespecialites",
+ ["it"]="usaspecialita",
+ ["nl"]="gebruikspecials",
+ ["pe"]="استÙاده‌ویژگیها",
+ ["ro"]="folosestespeciale",
+ },
+ ["usesymbols"]={
+ ["cs"]="uzijsymbol",
+ ["de"]="verwendesymbole",
+ ["en"]="usesymbols",
+ ["fr"]="utilisesymboles",
+ ["it"]="usasimboli",
+ ["nl"]="gebruiksymbolen",
+ ["pe"]="استÙاده‌نمادها",
+ ["ro"]="folosestesimboluri",
+ },
+ ["usetypescript"]={
+ ["cs"]="usetypescript",
+ ["de"]="usetypescript",
+ ["en"]="usetypescript",
+ ["fr"]="usetypescript",
+ ["it"]="usetypescript",
+ ["nl"]="gebruiktypescript",
+ ["pe"]="استÙاده‌دستخط‌تایپ",
+ ["ro"]="usetypescript",
+ },
+ ["usetypescriptfile"]={
+ ["cs"]="usetypescriptfile",
+ ["de"]="usetypescriptfile",
+ ["en"]="usetypescriptfile",
+ ["it"]="usetypescriptfile",
+ ["nl"]="gebruiktypescriptfile",
+ ["pe"]="استÙاده‌پرونده‌دستخط‌تایپ",
+ ["ro"]="usetypescriptfile",
+ },
+ ["useurl"]={
+ ["cs"]="uzijurl",
+ ["de"]="verwendeurl",
+ ["en"]="useurl",
+ ["fr"]="utiliseurl",
+ ["it"]="usaurl",
+ ["nl"]="gebruikurl",
+ ["pe"]="useurl",
+ ["ro"]="folosesteurl",
+ },
+ ["version"]={
+ ["cs"]="verze",
+ ["de"]="version",
+ ["en"]="version",
+ ["fr"]="version",
+ ["it"]="versione",
+ ["nl"]="versie",
+ ["pe"]="نسخه",
+ ["ro"]="versiune",
+ },
+ ["vl"]={
+ ["cs"]="vl",
+ ["de"]="vl",
+ ["en"]="vl",
+ ["fr"]="vl",
+ ["it"]="vl",
+ ["nl"]="vl",
+ ["pe"]="خ‌ع",
+ ["ro"]="vl",
+ },
+ ["weekday"]={
+ ["cs"]="vsedniden",
+ ["de"]="wochentag",
+ ["en"]="weekday",
+ ["fr"]="joursemaine",
+ ["it"]="giornosettimana",
+ ["nl"]="weekdag",
+ ["pe"]="روزهÙته",
+ ["ro"]="zidinsaptamana",
+ },
+ ["whitespace"]={
+ ["cs"]="bilemisto",
+ ["de"]="zwischenraum",
+ ["en"]="whitespace",
+ ["fr"]="espaceblanc",
+ ["it"]="spaziobianco",
+ ["nl"]="witruimte",
+ ["pe"]="Ùضای‌سÙید",
+ ["ro"]="spatiualb",
+ },
+ ["wordright"]={
+ ["cs"]="slovovpravo",
+ ["de"]="wortrechts",
+ ["en"]="wordright",
+ ["fr"]="motdroit",
+ ["it"]="paroladestra",
+ ["nl"]="woordrechts",
+ ["pe"]="کلمه‌راست",
+ ["ro"]="cuvantdreapta",
+ },
+ ["writebetweenlist"]={
+ ["cs"]="zapismeziseznam",
+ ["de"]="schreibezwischenliste",
+ ["en"]="writebetweenlist",
+ ["fr"]="ecritentreliste",
+ ["it"]="scrividentroelenco",
+ ["nl"]="schrijftussenlijst",
+ ["pe"]="بنویس‌بین‌لیست",
+ ["ro"]="scrieintreliste",
+ },
+ ["writetolist"]={
+ ["cs"]="zapisdoseznamu",
+ ["de"]="schreibezurliste",
+ ["en"]="writetolist",
+ ["fr"]="ecritdansliste",
+ ["it"]="scriviinelenco",
+ ["nl"]="schrijfnaarlijst",
+ ["pe"]="بنویس‌در‌لیست",
+ ["ro"]="scrieinlista",
+ },
+ ["writetoreferencelist"]={
+ ["cs"]="zapisdoseznamuodkazu",
+ ["de"]="schreibezurreferenzliste",
+ ["en"]="writetoreferencelist",
+ ["fr"]="ecritdanslistereference",
+ ["it"]="scriviinlistariferimenti",
+ ["nl"]="schrijfnaarreferentielijst",
+ ["pe"]="بنویس‌درلیست‌مرجع",
+ ["ro"]="scrieinlistareferinte",
+ },
+ ["writetoregister"]={
+ ["cs"]="zapisdorejstriku",
+ ["de"]="schreibezumregister",
+ ["en"]="writetoregister",
+ ["fr"]="ecritregistre",
+ ["it"]="scriviinregistro",
+ ["nl"]="schrijfnaarregister",
+ ["pe"]="بنویس‌درثبت",
+ ["ro"]="scrieinregistru",
+ },
+ },
+ ["constants"]={
+ ["action"]={
+ ["cs"]="akce",
+ ["de"]="aktion",
+ ["en"]="action",
+ ["fr"]="action",
+ ["it"]="azione",
+ ["nl"]="actie",
+ ["pe"]="کنش",
+ ["ro"]="actiune",
+ },
+ ["address"]={
+ ["cs"]="adresa",
+ ["de"]="adresse",
+ ["en"]="address",
+ ["fr"]="adresse",
+ ["it"]="indirizzo",
+ ["nl"]="adres",
+ ["pe"]="نشانی",
+ ["ro"]="adresa",
+ },
+ ["after"]={
+ ["cs"]="po",
+ ["de"]="nach",
+ ["en"]="after",
+ ["fr"]="apres",
+ ["it"]="dopo",
+ ["nl"]="na",
+ ["pe"]="بعداز",
+ ["ro"]="dupa",
+ },
+ ["afterhead"]={
+ ["cs"]="pohlavicce",
+ ["de"]="nachkopf",
+ ["en"]="afterhead",
+ ["fr"]="aprestete",
+ ["it"]="dopotesta",
+ ["nl"]="kopna",
+ ["pe"]="بعدازسر",
+ ["ro"]="dupatitlu",
+ },
+ ["afterkey"]={
+ ["cs"]="klavesapo",
+ ["de"]="nachtaste",
+ ["en"]="afterkey",
+ ["fr"]="aprescle",
+ ["it"]="dopotasto",
+ ["nl"]="natoets",
+ ["pe"]="بعدازکلید",
+ ["ro"]="dupatasta",
+ },
+ ["align"]={
+ ["cs"]="zarovnani",
+ ["de"]="ausrichtung",
+ ["en"]="align",
+ ["fr"]="alignement",
+ ["it"]="allinea",
+ ["nl"]="uitlijnen",
+ ["pe"]="تنظیم",
+ ["ro"]="aliniere",
+ },
+ ["aligncharacter"]={
+ ["cs"]="aligncharacter",
+ ["de"]="aligncharacter",
+ ["en"]="aligncharacter",
+ ["fr"]="caracterealigne",
+ ["it"]="allineacarattere",
+ ["nl"]="karakteruitlijnen",
+ ["pe"]="ØرÙ‌تنظیم",
+ ["ro"]="aliniazacaracter",
+ },
+ ["alignmentcharacter"]={
+ ["cs"]="alignmentcharacter",
+ ["de"]="alignmentcharacter",
+ ["en"]="alignmentcharacter",
+ ["fr"]="alignementcaractere",
+ ["it"]="carattereallineamento",
+ ["nl"]="uitlijnkarakter",
+ ["pe"]="ØرÙ‌تنظیم‌کردن",
+ ["ro"]="alierecaracter",
+ },
+ ["aligntitle"]={
+ ["cs"]="zarovnejtitul",
+ ["de"]="titelausrichten",
+ ["en"]="aligntitle",
+ ["fr"]="alignementtitre",
+ ["it"]="allineatitolo",
+ ["nl"]="titeluitlijnen",
+ ["pe"]="عنوان‌تنظیم",
+ ["ro"]="alinieretitlu",
+ },
+ ["alternative"]={
+ ["cs"]="alternativa",
+ ["de"]="alternative",
+ ["en"]="alternative",
+ ["fr"]="alternative",
+ ["it"]="alternativa",
+ ["nl"]="variant",
+ ["pe"]="جایگزین",
+ ["ro"]="alternativ",
+ },
+ ["apa"]={
+ ["cs"]="apa",
+ ["de"]="apa",
+ ["en"]="apa",
+ ["fr"]="apa",
+ ["it"]="apa",
+ ["nl"]="apa",
+ ["pe"]="apa",
+ ["ro"]="apa",
+ },
+ ["arrow"]={
+ ["cs"]="sipka",
+ ["de"]="pfeil",
+ ["en"]="arrow",
+ ["fr"]="fleche",
+ ["it"]="freccia",
+ ["nl"]="pijl",
+ ["pe"]="پیکان",
+ ["ro"]="sageata",
+ },
+ ["at"]={
+ ["cs"]="u",
+ ["de"]="bei",
+ ["en"]="at",
+ ["fr"]="a",
+ ["it"]="ad",
+ ["nl"]="op",
+ ["pe"]="در",
+ ["ro"]="la",
+ },
+ ["author"]={
+ ["cs"]="autor",
+ ["de"]="autor",
+ ["en"]="author",
+ ["fr"]="auteur",
+ ["it"]="autore",
+ ["nl"]="auteur",
+ ["pe"]="نویسنده",
+ ["ro"]="autor",
+ },
+ ["auto"]={
+ ["cs"]="auto",
+ ["de"]="auto",
+ ["en"]="auto",
+ ["fr"]="auto",
+ ["it"]="auto",
+ ["nl"]="auto",
+ ["pe"]="خودکار",
+ ["ro"]="auto",
+ },
+ ["autofile"]={
+ ["cs"]="autofile",
+ ["de"]="autofile",
+ ["en"]="autofile",
+ ["fr"]="autofile",
+ ["it"]="autofile",
+ ["nl"]="autofile",
+ ["pe"]="پرونده‌خودکار",
+ ["ro"]="autofile",
+ },
+ ["autofocus"]={
+ ["cs"]="autoostreni",
+ ["de"]="autofocus",
+ ["en"]="autofocus",
+ ["fr"]="autofocus",
+ ["it"]="autofocus",
+ ["nl"]="autofocus",
+ ["pe"]="تمرکز‌خودکار",
+ ["ro"]="autofocus",
+ },
+ ["autohang"]={
+ ["cs"]="autohang",
+ ["de"]="autohang",
+ ["en"]="autohang",
+ ["fr"]="autohang",
+ ["it"]="autohang",
+ ["nl"]="autohang",
+ ["pe"]="آویزان‌خودکار",
+ ["ro"]="autohang",
+ },
+ ["autostrut"]={
+ ["cs"]="autostrut",
+ ["de"]="autostrut",
+ ["en"]="autostrut",
+ ["fr"]="autostrut",
+ ["it"]="autostrut",
+ ["nl"]="autostrut",
+ ["pe"]="بست‌خودکار",
+ ["ro"]="autostrut",
+ },
+ ["autowidth"]={
+ ["cs"]="autosirka",
+ ["de"]="autobreite",
+ ["en"]="autowidth",
+ ["fr"]="autolargeur",
+ ["it"]="autoampiezza",
+ ["nl"]="autobreedte",
+ ["pe"]="عرض‌خودکار",
+ ["ro"]="autolatime",
+ },
+ ["axis"]={
+ ["cs"]="osa",
+ ["de"]="achsen",
+ ["en"]="axis",
+ ["fr"]="axe",
+ ["it"]="asse",
+ ["nl"]="assenstelsel",
+ ["pe"]="Ù…Øورها",
+ ["ro"]="axa",
+ },
+ ["background"]={
+ ["cs"]="pozadi",
+ ["de"]="hintergrund",
+ ["en"]="background",
+ ["fr"]="arriereplan",
+ ["it"]="sfondo",
+ ["nl"]="achtergrond",
+ ["pe"]="پس‌زمینه",
+ ["ro"]="fundal",
+ },
+ ["backgroundcolor"]={
+ ["cs"]="barvapozadi",
+ ["de"]="hintergrundfarbe",
+ ["en"]="backgroundcolor",
+ ["fr"]="couleurarriereplan",
+ ["it"]="coloresfondo",
+ ["nl"]="achtergrondkleur",
+ ["pe"]="رنگ‌پس‌زمینه",
+ ["ro"]="culoarefundal",
+ },
+ ["backgroundcorner"]={
+ ["cs"]="rohpozadi",
+ ["de"]="hintergrundwinkel",
+ ["en"]="backgroundcorner",
+ ["fr"]="coinarriereplan",
+ ["it"]="angolosfondo",
+ ["nl"]="achtergrondhoek",
+ ["pe"]="گوشه‌پس‌زمینه",
+ ["ro"]="coltfundal",
+ },
+ ["backgrounddepth"]={
+ ["cs"]="hloubkapozadi",
+ ["de"]="hintergrundtiefe",
+ ["en"]="backgrounddepth",
+ ["fr"]="profondeurarriereplan",
+ ["it"]="profonditasfondo",
+ ["nl"]="achtergronddiepte",
+ ["pe"]="عمق‌پس‌زمینه",
+ ["ro"]="adancimefundal",
+ },
+ ["backgroundoffset"]={
+ ["cs"]="offsetpozadi",
+ ["de"]="hintergrundoffset",
+ ["en"]="backgroundoffset",
+ ["fr"]="decalagearriereplan",
+ ["it"]="offsetsfondo",
+ ["nl"]="achtergrondoffset",
+ ["pe"]="Ø¢Ùست‌پس‌زمینه",
+ ["ro"]="offsetfundal",
+ },
+ ["backgroundradius"]={
+ ["cs"]="polomerpozadi",
+ ["de"]="hintergrundradius",
+ ["en"]="backgroundradius",
+ ["fr"]="rayonarriereplan",
+ ["it"]="raggiosfondo",
+ ["nl"]="achtergrondstraal",
+ ["pe"]="شعاع‌پس‌زمینه",
+ ["ro"]="razafundal",
+ },
+ ["backgroundscreen"]={
+ ["cs"]="rastrpozadi",
+ ["de"]="hintergrundraster",
+ ["en"]="backgroundscreen",
+ ["fr"]="ecranarriereplan",
+ ["it"]="schermosfondo",
+ ["nl"]="achtergrondraster",
+ ["pe"]="پرده‌پس‌زمینه",
+ ["ro"]="ecranfundal",
+ },
+ ["backspace"]={
+ ["cs"]="zpetnamezera",
+ ["de"]="rumpfspatium",
+ ["en"]="backspace",
+ ["fr"]="retour",
+ ["it"]="backspace",
+ ["nl"]="rugwit",
+ ["pe"]="Ùضای‌پس",
+ ["ro"]="spatiuspate",
+ },
+ ["balance"]={
+ ["cs"]="rovnovaha",
+ ["de"]="ausgleichen",
+ ["en"]="balance",
+ ["fr"]="equilibre",
+ ["it"]="bilanciamento",
+ ["nl"]="balanceren",
+ ["pe"]="تعادل",
+ ["ro"]="balanta",
+ },
+ ["before"]={
+ ["cs"]="pred",
+ ["de"]="vor",
+ ["en"]="before",
+ ["fr"]="avant",
+ ["it"]="prima",
+ ["nl"]="voor",
+ ["pe"]="قبل‌از",
+ ["ro"]="inainte",
+ },
+ ["beforehead"]={
+ ["cs"]="predhlavickou",
+ ["de"]="vorkopf",
+ ["en"]="beforehead",
+ ["fr"]="avanttete",
+ ["it"]="primaditesta",
+ ["nl"]="kopvoor",
+ ["pe"]="قبل‌ازسر",
+ ["ro"]="inaintetitlu",
+ },
+ ["bet"]={
+ ["cs"]="bet",
+ ["de"]="bet",
+ ["en"]="bet",
+ ["fr"]="bet",
+ ["it"]="bet",
+ ["nl"]="bet",
+ ["pe"]="bet",
+ ["ro"]="bet",
+ },
+ ["big"]={
+ ["cs"]="velky",
+ ["de"]="gross",
+ ["en"]="big",
+ ["fr"]="grand",
+ ["it"]="grande",
+ ["nl"]="groot",
+ ["pe"]="بزرگ",
+ ["ro"]="mare",
+ },
+ ["blank"]={
+ ["cs"]="prazdny",
+ ["de"]="blanko",
+ ["en"]="blank",
+ ["fr"]="vide",
+ ["it"]="rigovuoto",
+ ["nl"]="blanko",
+ ["pe"]="خالی",
+ ["ro"]="blanc",
+ },
+ ["blockway"]={
+ ["cs"]="dobloku",
+ ["de"]="blockauf",
+ ["en"]="blockway",
+ ["fr"]="blockway",
+ ["it"]="blockway",
+ ["nl"]="blokwijze",
+ ["pe"]="راه‌بلوک",
+ ["ro"]="blockway",
+ },
+ ["bodyfont"]={
+ ["cs"]="zakladnifont",
+ ["de"]="fliesstext",
+ ["en"]="bodyfont",
+ ["fr"]="policecorps",
+ ["it"]="fonttesto",
+ ["nl"]="korps",
+ ["pe"]="قلم‌بدنه",
+ ["ro"]="fonttext",
+ },
+ ["bookmark"]={
+ ["cs"]="zalozka",
+ ["de"]="bookmark",
+ ["en"]="bookmark",
+ ["fr"]="marquepage",
+ ["it"]="segnalibro",
+ ["nl"]="bookmark",
+ ["pe"]="چوبخط",
+ ["ro"]="semncarte",
+ },
+ ["bottom"]={
+ ["cs"]="spodek",
+ ["de"]="unten",
+ ["en"]="bottom",
+ ["fr"]="inf",
+ ["it"]="fondo",
+ ["nl"]="onder",
+ ["pe"]="پایین",
+ ["ro"]="jos",
+ },
+ ["bottomdistance"]={
+ ["cs"]="vzdalenostspodku",
+ ["de"]="abstandunten",
+ ["en"]="bottomdistance",
+ ["fr"]="distanceinf",
+ ["it"]="distanzafondo",
+ ["nl"]="onderafstand",
+ ["pe"]="Ùاصله‌پایین",
+ ["ro"]="distantajos",
+ },
+ ["bottomframe"]={
+ ["cs"]="ramecekdole",
+ ["de"]="untenrahmen",
+ ["en"]="bottomframe",
+ ["fr"]="cadreinf",
+ ["it"]="cornicefondo",
+ ["nl"]="onderkader",
+ ["pe"]="قالب‌پایین",
+ ["ro"]="framejos",
+ },
+ ["bottomoffset"]={
+ ["cs"]="offsetspodku",
+ ["de"]="untenoffset",
+ ["en"]="bottomoffset",
+ ["fr"]="decalageinf",
+ ["it"]="offsetfondo",
+ ["nl"]="onderoffset",
+ ["pe"]="Ø¢Ùست‌پایین",
+ ["ro"]="offsetjos",
+ },
+ ["bottomspace"]={
+ ["cs"]="bottomspace",
+ ["de"]="bottomspace",
+ ["en"]="bottomspace",
+ ["fr"]="espaceinf",
+ ["it"]="spaziofondo",
+ ["nl"]="bodemwit",
+ ["pe"]="Ùضای‌پایین",
+ ["ro"]="spatiujos",
+ },
+ ["bottomstate"]={
+ ["cs"]="statusspodku",
+ ["de"]="untenstatus",
+ ["en"]="bottomstate",
+ ["fr"]="etatinf",
+ ["it"]="statofondo",
+ ["nl"]="onderstatus",
+ ["pe"]="وضعیت‌پایین",
+ ["ro"]="starejos",
+ },
+ ["cache"]={
+ ["cs"]="cache",
+ ["de"]="cache",
+ ["en"]="cache",
+ ["fr"]="cache",
+ ["it"]="cache",
+ ["nl"]="cache",
+ ["pe"]="میانگیر",
+ ["ro"]="cache",
+ },
+ ["calculate"]={
+ ["cs"]="pocitat",
+ ["de"]="berechnen",
+ ["en"]="calculate",
+ ["fr"]="calculer",
+ ["it"]="calcola",
+ ["nl"]="bereken",
+ ["pe"]="Ù…Øاسبه",
+ ["ro"]="calculeaza",
+ },
+ ["ccommand"]={
+ ["cs"]="cprikaz",
+ ["de"]="cbefehl",
+ ["en"]="ccommand",
+ ["fr"]="ccommande",
+ ["it"]="ccomando",
+ ["nl"]="ccommando",
+ ["pe"]="Ùرمان",
+ ["ro"]="comandac",
+ },
+ ["click"]={
+ ["cs"]="klik",
+ ["de"]="klick",
+ ["en"]="click",
+ ["fr"]="clic",
+ ["it"]="click",
+ ["nl"]="klik",
+ ["pe"]="Ùشردن",
+ ["ro"]="click",
+ },
+ ["clickin"]={
+ ["cs"]="klikuvnitr",
+ ["de"]="klickin",
+ ["en"]="clickin",
+ ["fr"]="clicinterieur",
+ ["it"]="clickdentro",
+ ["nl"]="klikin",
+ ["pe"]="Ùشردن‌داخل",
+ ["ro"]="clickintru",
+ },
+ ["clickout"]={
+ ["cs"]="klikvne",
+ ["de"]="klickaus",
+ ["en"]="clickout",
+ ["fr"]="clicexterieur",
+ ["it"]="clickfuori",
+ ["nl"]="klikuit",
+ ["pe"]="Ùشردن‌خارج",
+ ["ro"]="clickies",
+ },
+ ["clipoffset"]={
+ ["cs"]="clipoffset",
+ ["de"]="clipoffset",
+ ["en"]="clipoffset",
+ ["fr"]="clipoffset",
+ ["it"]="clipoffset",
+ ["nl"]="clipoffset",
+ ["pe"]="Ø¢Ùست‌کلیپ",
+ ["ro"]="clipoffset",
+ },
+ ["closeaction"]={
+ ["cs"]="zavriakci",
+ ["de"]="schliessenaktion",
+ ["en"]="closeaction",
+ ["fr"]="actionfermeture",
+ ["it"]="azionechiudi",
+ ["nl"]="sluitactie",
+ ["pe"]="بستن‌کنش",
+ ["ro"]="actiuneinchidere",
+ },
+ ["closecommand"]={
+ ["cs"]="closecommand",
+ ["de"]="closecommand",
+ ["en"]="closecommand",
+ ["fr"]="closecommand",
+ ["it"]="closecommand",
+ ["nl"]="sluitcommando",
+ ["pe"]="بستن‌Ùرمان",
+ ["ro"]="closecommand",
+ },
+ ["closepageaction"]={
+ ["cs"]="akcezavrenistranky",
+ ["de"]="closepageaction",
+ ["en"]="closepageaction",
+ ["fr"]="actionfermeturepage",
+ ["it"]="azionechiudipagina",
+ ["nl"]="sluitpaginaactie",
+ ["pe"]="بستن‌عمل‌صÙØÙ‡",
+ ["ro"]="actiuneinchiderepagina",
+ },
+ ["closesymbol"]={
+ ["cs"]="closesymbol",
+ ["de"]="closesymbol",
+ ["en"]="closesymbol",
+ ["fr"]="closesymbol",
+ ["it"]="closesymbol",
+ ["nl"]="sluitsymbool",
+ ["pe"]="بستن‌نماد",
+ ["ro"]="closesymbol",
+ },
+ ["color"]={
+ ["cs"]="barva",
+ ["de"]="farbe",
+ ["en"]="color",
+ ["fr"]="couleur",
+ ["it"]="colore",
+ ["nl"]="kleur",
+ ["pe"]="رنگ",
+ ["ro"]="culoare",
+ },
+ ["column"]={
+ ["cs"]="sloupec",
+ ["de"]="spalte",
+ ["en"]="column",
+ ["fr"]="colonne",
+ ["it"]="colonna",
+ ["nl"]="kolom",
+ ["pe"]="ستون",
+ ["ro"]="coloana",
+ },
+ ["columndistance"]={
+ ["cs"]="vzdalenostsloupcu",
+ ["de"]="spaltenabstand",
+ ["en"]="columndistance",
+ ["fr"]="distancecolonne",
+ ["it"]="distanzacolonne",
+ ["nl"]="kolomafstand",
+ ["pe"]="Ùاصله‌ستون",
+ ["ro"]="distantacoloane",
+ },
+ ["columns"]={
+ ["cs"]="sloupce",
+ ["de"]="spalten",
+ ["en"]="columns",
+ ["fr"]="colonnes",
+ ["it"]="colonne",
+ ["nl"]="kolommen",
+ ["pe"]="ستونها",
+ ["ro"]="coloane",
+ },
+ ["command"]={
+ ["cs"]="prikaz",
+ ["de"]="befehl",
+ ["en"]="command",
+ ["fr"]="commande",
+ ["it"]="comando",
+ ["nl"]="commando",
+ ["pe"]="Ùرمان",
+ ["ro"]="comanda",
+ },
+ ["commandafter"]={
+ ["cs"]="prikazpo",
+ ["de"]="zumbefehl",
+ ["en"]="commandafter",
+ ["fr"]="commandeapres",
+ ["it"]="comdandodopo",
+ ["nl"]="nacommando",
+ ["pe"]="Ùرمان‌بعداز",
+ ["ro"]="comandadupa",
+ },
+ ["commandbefore"]={
+ ["cs"]="predchoziprikaz",
+ ["de"]="vorbefehl",
+ ["en"]="commandbefore",
+ ["fr"]="commandeavant",
+ ["it"]="comandoprima",
+ ["nl"]="voorcommando",
+ ["pe"]="Ùرمان‌قبل‌از",
+ ["ro"]="comandainainte",
+ },
+ ["commands"]={
+ ["cs"]="prikazy",
+ ["de"]="befehle",
+ ["en"]="commands",
+ ["fr"]="commandes",
+ ["it"]="comandi",
+ ["nl"]="commandos",
+ ["pe"]="Ùرمانها",
+ ["ro"]="comenzi",
+ },
+ ["component"]={
+ ["cs"]="component",
+ ["de"]="component",
+ ["en"]="component",
+ ["fr"]="composant",
+ ["it"]="component",
+ ["nl"]="component",
+ ["pe"]="مولÙÙ‡",
+ ["ro"]="component",
+ },
+ ["compoundhyphen"]={
+ ["cs"]="compoundhyphen",
+ ["de"]="compoundhyphen",
+ ["en"]="compoundhyphen",
+ ["fr"]="compoundhyphen",
+ ["it"]="compoundhyphen",
+ ["nl"]="koppelteken",
+ ["pe"]="compoundhyphen",
+ ["ro"]="compoundhyphen",
+ },
+ ["compress"]={
+ ["cs"]="compress",
+ ["de"]="compress",
+ ["en"]="compress",
+ ["fr"]="compress",
+ ["it"]="compress",
+ ["nl"]="comprimeren",
+ ["pe"]="Ùشردن",
+ ["ro"]="compress",
+ },
+ ["continue"]={
+ ["cs"]="pokracovat",
+ ["de"]="fortsetzen",
+ ["en"]="continue",
+ ["fr"]="continue",
+ ["it"]="continua",
+ ["nl"]="doorgaan",
+ ["pe"]="ادامه",
+ ["ro"]="continua",
+ },
+ ["contrastcolor"]={
+ ["cs"]="kontrastnibarva",
+ ["de"]="kontrastfarbe",
+ ["en"]="contrastcolor",
+ ["fr"]="coleurcontraste",
+ ["it"]="colorecontrasto",
+ ["nl"]="contrastkleur",
+ ["pe"]="contrastcolor",
+ ["ro"]="culoarecontrast",
+ },
+ ["controls"]={
+ ["cs"]="controls",
+ ["de"]="controls",
+ ["en"]="controls",
+ ["fr"]="controles",
+ ["it"]="controlli",
+ ["nl"]="sturing",
+ ["pe"]="کنترلها",
+ ["ro"]="controale",
+ },
+ ["conversion"]={
+ ["cs"]="konverze",
+ ["de"]="konversion",
+ ["en"]="conversion",
+ ["fr"]="conversion",
+ ["it"]="conversione",
+ ["nl"]="conversie",
+ ["pe"]="تبدیل",
+ ["ro"]="conversie",
+ },
+ ["convertfile"]={
+ ["cs"]="konverzesouboru",
+ ["de"]="konvertieredatei",
+ ["en"]="convertfile",
+ ["fr"]="conversionfichier",
+ ["it"]="convertifile",
+ ["nl"]="converteerfile",
+ ["pe"]="پرونده‌تبدیل",
+ ["ro"]="convertestefisier",
+ },
+ ["corner"]={
+ ["cs"]="roh",
+ ["de"]="winkel",
+ ["en"]="corner",
+ ["fr"]="coin",
+ ["it"]="angolo",
+ ["nl"]="hoek",
+ ["pe"]="گوشه",
+ ["ro"]="colt",
+ },
+ ["coupling"]={
+ ["cs"]="propojeni",
+ ["de"]="verknuepfung",
+ ["en"]="coupling",
+ ["fr"]="couplage",
+ ["it"]="accoppiamento",
+ ["nl"]="koppeling",
+ ["pe"]="تزویج",
+ ["ro"]="cuplare",
+ },
+ ["couplingway"]={
+ ["cs"]="zpusobpropojeni",
+ ["de"]="verkopplungsart",
+ ["en"]="couplingway",
+ ["fr"]="modecouplage",
+ ["it"]="modoaccoppiamento",
+ ["nl"]="koppelwijze",
+ ["pe"]="روش‌تزویج",
+ ["ro"]="modcuplare",
+ },
+ ["criterium"]={
+ ["cs"]="kriterium",
+ ["de"]="kriterium",
+ ["en"]="criterium",
+ ["fr"]="critere",
+ ["it"]="criterio",
+ ["nl"]="criterium",
+ ["pe"]="criterium",
+ ["ro"]="criteriu",
+ },
+ ["current"]={
+ ["cs"]="aktualni",
+ ["de"]="aktuell",
+ ["en"]="current",
+ ["fr"]="courant",
+ ["it"]="corrente",
+ ["nl"]="huidige",
+ ["pe"]="جاری",
+ ["ro"]="curent",
+ },
+ ["cutspace"]={
+ ["cs"]="cutspace",
+ ["de"]="cutspace",
+ ["en"]="cutspace",
+ ["fr"]="cutspace",
+ ["it"]="cutspace",
+ ["nl"]="snijwit",
+ ["pe"]="Ùضای‌برش",
+ ["ro"]="cutspace",
+ },
+ ["dash"]={
+ ["cs"]="pomlcka",
+ ["de"]="strich",
+ ["en"]="dash",
+ ["fr"]="pointille",
+ ["it"]="dash",
+ ["nl"]="streep",
+ ["pe"]="دش",
+ ["ro"]="dash",
+ },
+ ["dat"]={
+ ["cs"]="dat",
+ ["de"]="dat",
+ ["en"]="dat",
+ ["fr"]="dat",
+ ["it"]="dat",
+ ["nl"]="dat",
+ ["pe"]="dat",
+ ["ro"]="dat",
+ },
+ ["date"]={
+ ["cs"]="datum",
+ ["de"]="datum",
+ ["en"]="date",
+ ["fr"]="date",
+ ["it"]="data",
+ ["nl"]="datum",
+ ["pe"]="تاریخ",
+ ["ro"]="data",
+ },
+ ["deepnumbercommand"]={
+ ["cs"]="deepnumbercommand",
+ ["de"]="deepnumbercommand",
+ ["en"]="deepnumbercommand",
+ ["fr"]="deepnumbercommand",
+ ["it"]="deepnumbercommand",
+ ["nl"]="diepnummercommando",
+ ["pe"]="Ùرمان‌شماره‌عمیق",
+ ["ro"]="deepnumbercommand",
+ },
+ ["deeptextcommand"]={
+ ["cs"]="deeptextcommand",
+ ["de"]="deeptextcommand",
+ ["en"]="deeptextcommand",
+ ["fr"]="deeptextcommand",
+ ["it"]="deeptextcommand",
+ ["nl"]="dieptekstcommando",
+ ["pe"]="Ùرمان‌متن‌عمیق",
+ ["ro"]="deeptextcommand",
+ },
+ ["default"]={
+ ["cs"]="implicitni",
+ ["de"]="default",
+ ["en"]="default",
+ ["fr"]="defaut",
+ ["it"]="implicito",
+ ["nl"]="default",
+ ["pe"]="پیش‌Ùرض",
+ ["ro"]="implicit",
+ },
+ ["delay"]={
+ ["cs"]="prodleva",
+ ["de"]="wartezeit",
+ ["en"]="delay",
+ ["fr"]="delai",
+ ["it"]="attesa",
+ ["nl"]="wachttijd",
+ ["pe"]="تاخیر",
+ ["ro"]="intarziere",
+ },
+ ["depth"]={
+ ["cs"]="hloubka",
+ ["de"]="tiefe",
+ ["en"]="depth",
+ ["fr"]="profondeur",
+ ["it"]="profondita",
+ ["nl"]="diepte",
+ ["pe"]="عمق",
+ ["ro"]="inaltime",
+ },
+ ["depthcorrection"]={
+ ["cs"]="korekcehloubky",
+ ["de"]="tiefekorrektur",
+ ["en"]="depthcorrection",
+ ["fr"]="correctionprofondeur",
+ ["it"]="correzioneprofondita",
+ ["nl"]="dieptecorrectie",
+ ["pe"]="تصØÛŒØ‌عمق",
+ ["ro"]="corectieadancime",
+ },
+ ["direction"]={
+ ["cs"]="smer",
+ ["de"]="richtung",
+ ["en"]="direction",
+ ["fr"]="direction",
+ ["it"]="direzione",
+ ["nl"]="richting",
+ ["pe"]="جهت",
+ ["ro"]="directie",
+ },
+ ["directory"]={
+ ["cs"]="adresar",
+ ["de"]="verzeichnis",
+ ["en"]="directory",
+ ["fr"]="repertoire",
+ ["it"]="directory",
+ ["nl"]="gebied",
+ ["pe"]="پوشه",
+ ["ro"]="director",
+ },
+ ["display"]={
+ ["cs"]="obrazovka",
+ ["de"]="bildschirm",
+ ["en"]="display",
+ ["fr"]="affichage",
+ ["it"]="display",
+ ["nl"]="scherm",
+ ["pe"]="نمایش",
+ ["ro"]="display",
+ },
+ ["distance"]={
+ ["cs"]="vzdalenost",
+ ["de"]="abstand",
+ ["en"]="distance",
+ ["fr"]="distance",
+ ["it"]="distanza",
+ ["nl"]="afstand",
+ ["pe"]="Ùاصله",
+ ["ro"]="distanta",
+ },
+ ["dot"]={
+ ["cs"]="tecka",
+ ["de"]="punkt",
+ ["en"]="dot",
+ ["fr"]="point",
+ ["it"]="punto",
+ ["nl"]="punt",
+ ["pe"]="نقطه",
+ ["ro"]="punct",
+ },
+ ["doublesided"]={
+ ["cs"]="oboustranne",
+ ["de"]="doppelseitig",
+ ["en"]="doublesided",
+ ["fr"]="rectoverso",
+ ["it"]="doppiafaccia",
+ ["nl"]="dubbelzijdig",
+ ["pe"]="دورو",
+ ["ro"]="douafete",
+ },
+ ["dummy"]={
+ ["cs"]="dummy",
+ ["de"]="dummy",
+ ["en"]="dummy",
+ ["fr"]="dummy",
+ ["it"]="dummy",
+ ["nl"]="dummy",
+ ["pe"]="مصنوعی",
+ ["ro"]="dummy",
+ },
+ ["dx"]={
+ ["cs"]="dx",
+ ["de"]="dx",
+ ["en"]="dx",
+ ["fr"]="dx",
+ ["it"]="dx",
+ ["nl"]="dx",
+ ["pe"]="dx",
+ ["ro"]="dx",
+ },
+ ["dy"]={
+ ["cs"]="dy",
+ ["de"]="dy",
+ ["en"]="dy",
+ ["fr"]="dy",
+ ["it"]="dy",
+ ["nl"]="dy",
+ ["pe"]="dy",
+ ["ro"]="dy",
+ },
+ ["edge"]={
+ ["cs"]="hrana",
+ ["de"]="kante",
+ ["en"]="edge",
+ ["fr"]="bord",
+ ["it"]="bordo",
+ ["nl"]="rand",
+ ["pe"]="لبه",
+ ["ro"]="bordura",
+ },
+ ["edgedistance"]={
+ ["cs"]="vzdalenosthrany",
+ ["de"]="kantenabstand",
+ ["en"]="edgedistance",
+ ["fr"]="distancebord",
+ ["it"]="distanzabordo",
+ ["nl"]="randafstand",
+ ["pe"]="Ùاصله‌لبه",
+ ["ro"]="distantabordura",
+ },
+ ["empty"]={
+ ["cs"]="prazdne",
+ ["de"]="leer",
+ ["en"]="empty",
+ ["fr"]="vide",
+ ["it"]="vuoto",
+ ["nl"]="leeg",
+ ["pe"]="تهی",
+ ["ro"]="gol",
+ },
+ ["equalheight"]={
+ ["cs"]="equalheight",
+ ["de"]="equalheight",
+ ["en"]="equalheight",
+ ["fr"]="equalheight",
+ ["it"]="equalheight",
+ ["nl"]="equalheight",
+ ["pe"]="ارتÙاع‌یکسان",
+ ["ro"]="equalheight",
+ },
+ ["equalwidth"]={
+ ["cs"]="equalwidth",
+ ["de"]="equalwidth",
+ ["en"]="equalwidth",
+ ["fr"]="equalwidth",
+ ["it"]="equalwidth",
+ ["nl"]="equalwidth",
+ ["pe"]="عرض‌یکسان",
+ ["ro"]="equalwidth",
+ },
+ ["escape"]={
+ ["cs"]="escape",
+ ["de"]="escape",
+ ["en"]="escape",
+ ["fr"]="escape",
+ ["it"]="escape",
+ ["nl"]="escape",
+ ["pe"]="Ùرار",
+ ["ro"]="escape",
+ },
+ ["evenmargin"]={
+ ["cs"]="sudamarginalie",
+ ["de"]="geraderand",
+ ["en"]="evenmargin",
+ ["fr"]="margepaire",
+ ["it"]="marginepari",
+ ["nl"]="evenmarge",
+ ["pe"]="Øاشیه‌زوج",
+ ["ro"]="marginepara",
+ },
+ ["expansion"]={
+ ["cs"]="expanzen",
+ ["de"]="expansion",
+ ["en"]="expansion",
+ ["fr"]="expansion",
+ ["it"]="espansione",
+ ["nl"]="expansie",
+ ["pe"]="گسترش",
+ ["ro"]="expansiune",
+ },
+ ["extras"]={
+ ["cs"]="extras",
+ ["de"]="extras",
+ ["en"]="extras",
+ ["fr"]="extras",
+ ["it"]="extras",
+ ["nl"]="extras",
+ ["pe"]="extras",
+ ["ro"]="extras",
+ },
+ ["factor"]={
+ ["cs"]="faktor",
+ ["de"]="faktor",
+ ["en"]="factor",
+ ["fr"]="facteur",
+ ["it"]="fattore",
+ ["nl"]="factor",
+ ["pe"]="عامل",
+ ["ro"]="factor",
+ },
+ ["fallback"]={
+ ["cs"]="fallback",
+ ["de"]="fallback",
+ ["en"]="fallback",
+ ["fr"]="fallback",
+ ["it"]="fallback",
+ ["nl"]="terugval",
+ ["pe"]="عقب‌ریختن",
+ ["ro"]="fallback",
+ },
+ ["family"]={
+ ["cs"]="rodina",
+ ["de"]="familie",
+ ["en"]="family",
+ ["fr"]="famille",
+ ["it"]="famiglia",
+ ["nl"]="soort",
+ ["pe"]="خانواده",
+ ["ro"]="familie",
+ },
+ ["fieldbackgroundcolor"]={
+ ["cs"]="barvapozadipole",
+ ["de"]="feldhintergrundfarbe",
+ ["en"]="fieldbackgroundcolor",
+ ["fr"]="couleurarrierreplanchamp",
+ ["it"]="coloresfondocampo",
+ ["nl"]="veldachtergrondkleur",
+ ["pe"]="رنگ‌پس‌زمینه‌میدان",
+ ["ro"]="culoarefundalcamp",
+ },
+ ["fieldframecolor"]={
+ ["cs"]="barvarameckupole",
+ ["de"]="feldrahmenfarbe",
+ ["en"]="fieldframecolor",
+ ["fr"]="couleurcadrechamp",
+ ["it"]="colorecornicecampo",
+ ["nl"]="veldkaderkleur",
+ ["pe"]="رنگ‌قالب‌میدان",
+ ["ro"]="culoareframecamp",
+ },
+ ["fieldlayer"]={
+ ["cs"]="fieldlayer",
+ ["de"]="fieldlayer",
+ ["en"]="fieldlayer",
+ ["fr"]="calquechamp",
+ ["it"]="fieldlayer",
+ ["nl"]="veldlaag",
+ ["pe"]="لایه‌میدان",
+ ["ro"]="fieldlayer",
+ },
+ ["fieldoffset"]={
+ ["cs"]="offsetpole",
+ ["de"]="feldoffset",
+ ["en"]="fieldoffset",
+ ["fr"]="offsetchamp",
+ ["it"]="offsetcampo",
+ ["nl"]="veldoffset",
+ ["pe"]="Ø¢Ùست‌میدان",
+ ["ro"]="offsetcamp",
+ },
+ ["file"]={
+ ["cs"]="soubor",
+ ["de"]="datei",
+ ["en"]="file",
+ ["fr"]="fichier",
+ ["it"]="file",
+ ["nl"]="file",
+ ["pe"]="پرونده",
+ ["ro"]="fisier",
+ },
+ ["focus"]={
+ ["cs"]="zaostreni",
+ ["de"]="focus",
+ ["en"]="focus",
+ ["fr"]="focus",
+ ["it"]="focus",
+ ["nl"]="focus",
+ ["pe"]="تمرکز",
+ ["ro"]="focus",
+ },
+ ["focusin"]={
+ ["cs"]="focusin",
+ ["de"]="focusin",
+ ["en"]="focusin",
+ ["fr"]="focusin",
+ ["it"]="focusin",
+ ["nl"]="focusin",
+ ["pe"]="تمرکزدرون",
+ ["ro"]="focusin",
+ },
+ ["focusout"]={
+ ["cs"]="focusout",
+ ["de"]="focusout",
+ ["en"]="focusout",
+ ["fr"]="focusout",
+ ["it"]="focusout",
+ ["nl"]="focusuit",
+ ["pe"]="تمرکزبیرون",
+ ["ro"]="focusout",
+ },
+ ["footer"]={
+ ["cs"]="upati",
+ ["de"]="fusszeile",
+ ["en"]="footer",
+ ["fr"]="pdp",
+ ["it"]="piedipagina",
+ ["nl"]="voet",
+ ["pe"]="ته‌برگ",
+ ["ro"]="subsol",
+ },
+ ["footerdistance"]={
+ ["cs"]="vzdalenostupati",
+ ["de"]="fusszeilenabstand",
+ ["en"]="footerdistance",
+ ["fr"]="dsitancepdp",
+ ["it"]="distanzapdp",
+ ["nl"]="voetafstand",
+ ["pe"]="Ùاصله‌ته‌برگ",
+ ["ro"]="distantasubsol",
+ },
+ ["footerstate"]={
+ ["cs"]="statusupati",
+ ["de"]="fusszeilenstatus",
+ ["en"]="footerstate",
+ ["fr"]="etatpdp",
+ ["it"]="statopdp",
+ ["nl"]="voetstatus",
+ ["pe"]="وضعیت‌ته‌برگ",
+ ["ro"]="staresubsol",
+ },
+ ["foregroundcolor"]={
+ ["cs"]="foregroundcolor",
+ ["de"]="foregroundcolor",
+ ["en"]="foregroundcolor",
+ ["fr"]="couleurpremierplan",
+ ["it"]="coloreprimopiano",
+ ["nl"]="voorgrondkleur",
+ ["pe"]="رنگ‌پیش‌زمینه",
+
+ ["ro"]="foregroundcolor",
+ },
+ ["foregroundstyle"]={
+ ["cs"]="foregroundstyle",
+ ["de"]="foregroundstyle",
+ ["en"]="foregroundstyle",
+ ["fr"]="stylepremierplan",
+ ["it"]="foregroundstyle",
+ ["nl"]="voorgrondletter",
+ ["pe"]="سبک‌پیش‌زمینه",
+ ["ro"]="foregroundstyle",
+ },
+ ["format"]={
+ ["cs"]="formatovat",
+ ["de"]="formatieren",
+ ["en"]="format",
+ ["fr"]="formatter",
+ ["it"]="format",
+ ["nl"]="formatteer",
+ ["pe"]="شمایل",
+ ["ro"]="format",
+ },
+ ["frame"]={
+ ["cs"]="ramecek",
+ ["de"]="rahmen",
+ ["en"]="frame",
+ ["fr"]="cadre",
+ ["it"]="cornice",
+ ["nl"]="kader",
+ ["pe"]="قالب",
+ ["ro"]="frame",
+ },
+ ["framecolor"]={
+ ["cs"]="barvaramecku",
+ ["de"]="rahmenfarbe",
+ ["en"]="framecolor",
+ ["fr"]="couleurcadre",
+ ["it"]="colorecornice",
+ ["nl"]="kaderkleur",
+ ["pe"]="رنگ‌قالب",
+ ["ro"]="culoareframe",
+ },
+ ["framecorner"]={
+ ["cs"]="rohramecku",
+ ["de"]="rahmenwinkel",
+ ["en"]="framecorner",
+ ["fr"]="coincadre",
+ ["it"]="angolocornice",
+ ["nl"]="kaderhoek",
+ ["pe"]="گوشه‌قالب",
+ ["ro"]="coltframe",
+ },
+ ["framedepth"]={
+ ["cs"]="hloubkaramecku",
+ ["de"]="rahmentiefe",
+ ["en"]="framedepth",
+ ["fr"]="profondeurcadre",
+ ["it"]="profonditacornice",
+ ["nl"]="kaderdiepte",
+ ["pe"]="عمق‌قالب",
+ ["ro"]="adancimeframe",
+ },
+ ["frameoffset"]={
+ ["cs"]="offsetramecku",
+ ["de"]="rahmenoffset",
+ ["en"]="frameoffset",
+ ["fr"]="decalagecadre",
+ ["it"]="offsetcornice",
+ ["nl"]="kaderoffset",
+ ["pe"]="Ø¢Ùست‌قالب",
+ ["ro"]="offsetframe",
+ },
+ ["frameradius"]={
+ ["cs"]="polomerramecku",
+ ["de"]="rahmenradius",
+ ["en"]="frameradius",
+ ["fr"]="rayoncadre",
+ ["it"]="raggiocornice",
+ ["nl"]="kaderstraal",
+ ["pe"]="شعاع‌قالب",
+ ["ro"]="razaframe",
+ },
+ ["frames"]={
+ ["cs"]="ramecky",
+ ["de"]="umrahmen",
+ ["en"]="frames",
+ ["fr"]="cadres",
+ ["it"]="cornici",
+ ["nl"]="hokjes",
+ ["pe"]="قالبها",
+ ["ro"]="frames",
+ },
+ ["from"]={
+ ["cs"]="z",
+ ["de"]="von",
+ ["en"]="from",
+ ["fr"]="de",
+ ["it"]="da",
+ ["nl"]="van",
+ ["pe"]="از",
+ ["ro"]="dela",
+ },
+ ["get"]={
+ ["cs"]="ziskat",
+ ["de"]="hole",
+ ["en"]="get",
+ ["fr"]="obtient",
+ ["it"]="prendi",
+ ["nl"]="haal",
+ ["pe"]="بگیر",
+ ["ro"]="adu",
+ },
+ ["global"]={
+ ["cs"]="globalne",
+ ["de"]="global",
+ ["en"]="global",
+ ["fr"]="global",
+ ["it"]="globale",
+ ["nl"]="globaal",
+ ["pe"]="سراسری",
+ ["ro"]="global",
+ },
+ ["grid"]={
+ ["cs"]="mrizka",
+ ["de"]="gritter",
+ ["en"]="grid",
+ ["fr"]="grille",
+ ["it"]="griglia",
+ ["nl"]="grid",
+ ["pe"]="توری",
+ ["ro"]="grid",
+ },
+ ["hang"]={
+ ["cs"]="zaveseni",
+ ["de"]="haengend",
+ ["en"]="hang",
+ ["fr"]="suspend",
+ ["it"]="sospendi",
+ ["nl"]="hang",
+ ["pe"]="بیاویز",
+ ["ro"]="suspenda",
+ },
+ ["headcolor"]={
+ ["cs"]="barvahlavicky",
+ ["de"]="kopffarbe",
+ ["en"]="headcolor",
+ ["fr"]="couleurtete",
+ ["it"]="coloretesta",
+ ["nl"]="kopkleur",
+ ["pe"]="رنگ‌سر",
+ ["ro"]="culoaretitlu",
+ },
+ ["headcommand"]={
+ ["cs"]="headcommand",
+ ["de"]="headcommand",
+ ["en"]="headcommand",
+ ["fr"]="commandetete",
+ ["it"]="headcommand",
+ ["nl"]="kopcommando",
+ ["pe"]="Ùرمان‌سر",
+ ["ro"]="headcommand",
+ },
+ ["headconversion"]={
+ ["cs"]="konverzehlavicky",
+ ["de"]="headconversion",
+ ["en"]="headconversion",
+ ["fr"]="conversiontete",
+ ["it"]="conversionetesta",
+ ["nl"]="kopconversie",
+ ["pe"]="تبدیل‌سر",
+ ["ro"]="conversietitlu",
+ },
+ ["header"]={
+ ["cs"]="zahlavi",
+ ["de"]="kopfzeile",
+ ["en"]="header",
+ ["fr"]="entete",
+ ["it"]="intestazione",
+ ["nl"]="hoofd",
+ ["pe"]="سربرگ",
+ ["ro"]="antet",
+ },
+ ["headerdistance"]={
+ ["cs"]="vzdalenostzahlavi",
+ ["de"]="kopfzeilenabstand",
+ ["en"]="headerdistance",
+ ["fr"]="distanceentete",
+ ["it"]="distanzaintestazione",
+ ["nl"]="hoofdafstand",
+ ["pe"]="Ùاصله‌سربرگ",
+ ["ro"]="distantaantet",
+ },
+ ["headerstate"]={
+ ["cs"]="statuszahlavi",
+ ["de"]="kopfzeilenstatus",
+ ["en"]="headerstate",
+ ["fr"]="etatentete",
+ ["it"]="statointestazione",
+ ["nl"]="hoofdstatus",
+ ["pe"]="وضعیت‌سربرگ",
+ ["ro"]="stareantet",
+ },
+ ["headlabel"]={
+ ["cs"]="popisekhlavicky",
+ ["de"]="headlabel",
+ ["en"]="headlabel",
+ ["fr"]="etiquettetete",
+ ["it"]="etichettatesta",
+ ["nl"]="koplabel",
+ ["pe"]="برچسب‌سر",
+ ["ro"]="etichetatitlu",
+ },
+ ["headnumber"]={
+ ["cs"]="cislonadpisu",
+ ["de"]="kopfnummer",
+ ["en"]="headnumber",
+ ["fr"]="numerotete",
+ ["it"]="numerotesta",
+ ["nl"]="kopnummer",
+ ["pe"]="شماره‌سر",
+ ["ro"]="numartitlu",
+ },
+ ["headstyle"]={
+ ["cs"]="stylhlavicky",
+ ["de"]="kopfstil",
+ ["en"]="headstyle",
+ ["fr"]="styletete",
+ ["it"]="stiletesta",
+ ["nl"]="kopletter",
+ ["pe"]="سبک‌سر",
+ ["ro"]="stiltitlu",
+ },
+ ["height"]={
+ ["cs"]="vyska",
+ ["de"]="hoehe",
+ ["en"]="height",
+ ["fr"]="hauteur",
+ ["it"]="altezza",
+ ["nl"]="hoogte",
+ ["pe"]="ارتÙاع",
+ ["ro"]="inaltime",
+ },
+ ["hfactor"]={
+ ["cs"]="vfaktor",
+ ["de"]="hfaktor",
+ ["en"]="hfactor",
+ ["fr"]="facteurhauteur",
+ ["it"]="hfactor",
+ ["nl"]="hfactor",
+ ["pe"]="عامل‌ارتÙاع",
+ ["ro"]="hfactor",
+ },
+ ["hfil"]={
+ ["cs"]="hfil",
+ ["de"]="hfil",
+ ["en"]="hfil",
+ ["fr"]="hfil",
+ ["it"]="hfil",
+ ["nl"]="hfil",
+ ["pe"]="پرکردن‌ارتÙاع",
+ ["ro"]="hfil",
+ },
+ ["hoffset"]={
+ ["cs"]="hoffset",
+ ["de"]="hoffset",
+ ["en"]="hoffset",
+ ["fr"]="decalagehauteur",
+ ["it"]="hoffset",
+ ["nl"]="hoffset",
+ ["pe"]="Ø¢Ùست‌ا",
+ ["ro"]="hoffset",
+ },
+ ["horoffset"]={
+ ["cs"]="horoffset",
+ ["de"]="rumpfabstand",
+ ["en"]="horoffset",
+ ["fr"]="horoffset",
+ ["it"]="horoffset",
+ ["nl"]="rugoffset",
+ ["pe"]="Ø¢Ùست‌اÙÙ‚",
+ ["ro"]="offsetoriz",
+ },
+ ["hyphen"]={
+ ["cs"]="hyphen",
+ ["de"]="hyphen",
+ ["en"]="hyphen",
+ ["fr"]="hyphen",
+ ["it"]="hyphen",
+ ["nl"]="hyphen",
+ ["pe"]="شکستن",
+ ["ro"]="hyphen",
+ },
+ ["icommand"]={
+ ["cs"]="iprikaz",
+ ["de"]="ibefehl",
+ ["en"]="icommand",
+ ["fr"]="icommande",
+ ["it"]="icomando",
+ ["nl"]="icommando",
+ ["pe"]="icommand",
+ ["ro"]="comandai",
+ },
+ ["in"]={
+ ["cs"]="v",
+ ["de"]="in",
+ ["en"]="in",
+ ["fr"]="in",
+ ["it"]="in",
+ ["nl"]="in",
+ ["pe"]="درون",
+ ["ro"]="in",
+ },
+ ["inbetween"]={
+ ["cs"]="mezi",
+ ["de"]="zwischen",
+ ["en"]="inbetween",
+ ["fr"]="entre",
+ ["it"]="tra",
+ ["nl"]="tussen",
+ ["pe"]="دربین",
+ ["ro"]="intre",
+ },
+ ["increment"]={
+ ["cs"]="zvysit",
+ ["de"]="erhoehen",
+ ["en"]="increment",
+ ["fr"]="incremente",
+ ["it"]="incremento",
+ ["nl"]="verhoog",
+ ["pe"]="اÙزایش",
+ ["ro"]="increment",
+ },
+ ["incrementnumber"]={
+ ["cs"]="zvysujicicislo",
+ ["de"]="nummererhoehen",
+ ["en"]="incrementnumber",
+ ["fr"]="incrementenumero",
+ ["it"]="incrementanumero",
+ ["nl"]="verhoognummer",
+ ["pe"]="شماره‌اÙزایش",
+ ["ro"]="numarincrement",
+ },
+ ["indenting"]={
+ ["cs"]="odsazovani",
+ ["de"]="einziehen",
+ ["en"]="indenting",
+ ["fr"]="composeenalinea",
+ ["it"]="rientro",
+ ["nl"]="inspringen",
+ ["pe"]="تورÙتگی",
+ ["ro"]="aliniat",
+ },
+ ["indentnext"]={
+ ["cs"]="odsadpristi",
+ ["de"]="ziehefolgendeein",
+ ["en"]="indentnext",
+ ["fr"]="indentesuivant",
+ ["it"]="rientrasuccessivo",
+ ["nl"]="springvolgendein",
+ ["pe"]="متن‌تورÙته",
+ ["ro"]="aliniaturmator",
+ },
+ ["indicator"]={
+ ["cs"]="indikator",
+ ["de"]="indikator",
+ ["en"]="indicator",
+ ["fr"]="indicateur",
+ ["it"]="indicatore",
+ ["nl"]="aanduiding",
+ ["pe"]="اندیکاتور",
+ ["ro"]="indicator",
+ },
+ ["inner"]={
+ ["cs"]="vnitrni",
+ ["de"]="innen",
+ ["en"]="inner",
+ ["fr"]="interieur",
+ ["it"]="interno",
+ ["nl"]="binnen",
+ ["pe"]="داخلی",
+ ["ro"]="intern",
+ },
+ ["innermargin"]={
+ ["cs"]="innermargin",
+ ["de"]="innermargin",
+ ["en"]="innermargin",
+ ["fr"]="margeinterieure",
+ ["it"]="margineinterno",
+ ["nl"]="binnenmarge",
+ ["pe"]="Øاشیه‌داخلی",
+ ["ro"]="innermargin",
+ },
+ ["inputfile"]={
+ ["cs"]="inputfile",
+ ["de"]="inputfile",
+ ["en"]="inputfile",
+ ["fr"]="fichierentree",
+ ["it"]="inputfile",
+ ["nl"]="inputfile",
+ ["pe"]="پرونده‌ورودی",
+ ["ro"]="inputfile",
+ },
+ ["interaction"]={
+ ["cs"]="interakce",
+ ["de"]="interaktion",
+ ["en"]="interaction",
+ ["fr"]="interaction",
+ ["it"]="interazione",
+ ["nl"]="interactie",
+ ["pe"]="پانل",
+ ["ro"]="interactiune",
+ },
+ ["interlinespace"]={
+ ["cs"]="meziradkovamezera",
+ ["de"]="zeilenabstande",
+ ["en"]="interlinespace",
+ ["fr"]="espaceinterligne",
+ ["it"]="interlinea",
+ ["nl"]="interlinie",
+ ["pe"]="Ùضای‌بین‌خط",
+ ["ro"]="spatiereinterliniara",
+ },
+ ["itemalign"]={
+ ["cs"]="itemalign",
+ ["de"]="itemalign",
+ ["en"]="itemalign",
+ ["fr"]="itemalign",
+ ["it"]="itemalign",
+ ["nl"]="itemuitlijnen",
+ ["pe"]="تنظیم‌آیتم",
+ ["ro"]="itemalign",
+ },
+ ["items"]={
+ ["cs"]="polozky",
+ ["de"]="posten",
+ ["en"]="items",
+ ["fr"]="elements",
+ ["it"]="elementi",
+ ["nl"]="items",
+ ["pe"]="آیتمها",
+ ["ro"]="elemente",
+ },
+ ["ken"]={
+ ["cs"]="ken",
+ ["de"]="ken",
+ ["en"]="ken",
+ ["fr"]="ken",
+ ["it"]="ken",
+ ["nl"]="ken",
+ ["pe"]="ken",
+ ["ro"]="ken",
+ },
+ ["keyexpansion"]={
+ ["cs"]="keyexpansion",
+ ["de"]="keyexpansion",
+ ["en"]="keyexpansion",
+ ["fr"]="keyexpansion",
+ ["it"]="keyexpansion",
+ ["nl"]="sleutelexpansie",
+ ["pe"]="گسترش‌کلید",
+ ["ro"]="keyexpansion",
+ },
+ ["keyword"]={
+ ["cs"]="keyword",
+ ["de"]="keyword",
+ ["en"]="keyword",
+ ["fr"]="motcle",
+ ["it"]="parolachiave",
+ ["nl"]="trefwoord",
+ ["pe"]="کلید‌واژه",
+ ["ro"]="keyword",
+ },
+ ["label"]={
+ ["cs"]="popisek",
+ ["de"]="label",
+ ["en"]="label",
+ ["fr"]="etiquette",
+ ["it"]="etichetta",
+ ["nl"]="label",
+ ["pe"]="برچسب",
+ ["ro"]="eticheta",
+ },
+ ["left"]={
+ ["cs"]="vlevo",
+ ["de"]="links",
+ ["en"]="left",
+ ["fr"]="gauche",
+ ["it"]="sinistra",
+ ["nl"]="links",
+ ["pe"]="Ú†Ù¾",
+ ["ro"]="stanga",
+ },
+ ["leftcolor"]={
+ ["cs"]="barvavlevo",
+ ["de"]="linkerfarbe",
+ ["en"]="leftcolor",
+ ["fr"]="couleurgauche",
+ ["it"]="coloresinistra",
+ ["nl"]="linkerkleur",
+ ["pe"]="رنگ‌چپ",
+ ["ro"]="culoarestanga",
+ },
+ ["leftcompoundhyphen"]={
+ ["cs"]="leftcompoundhyphen",
+ ["de"]="leftcompoundhyphen",
+ ["en"]="leftcompoundhyphen",
+ ["fr"]="leftcompoundhyphen",
+ ["it"]="leftcompoundhyphen",
+ ["nl"]="linkerkoppelteken",
+ ["pe"]="leftcompoundhyphen",
+ ["ro"]="leftcompoundhyphen",
+ },
+ ["leftedge"]={
+ ["cs"]="levahrana",
+ ["de"]="linkekante",
+ ["en"]="leftedge",
+ ["fr"]="bordgauche",
+ ["it"]="bordosinistro",
+ ["nl"]="linkerrand",
+ ["pe"]="لبه‌چپ",
+ ["ro"]="bordurastanga",
+ },
+ ["leftedgedistance"]={
+ ["cs"]="vzdalenostlevehrany",
+ ["de"]="linkerkantenabstand",
+ ["en"]="leftedgedistance",
+ ["fr"]="distancebordgauche",
+ ["it"]="distanzabordosinistro",
+ ["nl"]="linkerrandafstand",
+ ["pe"]="Ùاصله‌لبه‌چپ",
+ ["ro"]="distantabordurastanga",
+ },
+ ["leftframe"]={
+ ["cs"]="ramecekvlevo",
+ ["de"]="linkerrahmen",
+ ["en"]="leftframe",
+ ["fr"]="cadregauche",
+ ["it"]="cornicesinistra",
+ ["nl"]="linkerkader",
+ ["pe"]="قالب‌چپ",
+ ["ro"]="framestanga",
+ },
+ ["lefthyphen"]={
+ ["cs"]="lefthyphen",
+ ["de"]="lefthyphen",
+ ["en"]="lefthyphen",
+ ["fr"]="lefthyphen",
+ ["it"]="lefthyphen",
+ ["nl"]="lefthyphen",
+ ["pe"]="شکست‌چپ",
+ ["ro"]="lefthyphen",
+ },
+ ["leftmargin"]={
+ ["cs"]="levyokraj",
+ ["de"]="linkerrand",
+ ["en"]="leftmargin",
+ ["fr"]="margegauche",
+ ["it"]="marginesinistro",
+ ["nl"]="linkermarge",
+ ["pe"]="Øاشیه‌چپ",
+ ["ro"]="marginestanga",
+ },
+ ["leftmargindistance"]={
+ ["cs"]="vzdalenostlevehookraje",
+ ["de"]="linkerrandabstand",
+ ["en"]="leftmargindistance",
+ ["fr"]="distancemargegauche",
+ ["it"]="distanzamarginesinistro",
+ ["nl"]="linkermargeafstand",
+ ["pe"]="Ùاصله‌Øاشیه‌چپ",
+ ["ro"]="distantamarginestanga",
+ },
+ ["leftoffset"]={
+ ["cs"]="levyoffset",
+ ["de"]="linkeroffset",
+ ["en"]="leftoffset",
+ ["fr"]="decalagegauche",
+ ["it"]="offsetsinistro",
+ ["nl"]="linkeroffset",
+ ["pe"]="Ø¢Ùست‌چپ",
+ ["ro"]="offsetstanga",
+ },
+ ["leftquotation"]={
+ ["cs"]="citacevlevo",
+ ["de"]="linkerzitat",
+ ["en"]="leftquotation",
+ ["fr"]="citationgauche",
+ ["it"]="citazionesinistra",
+ ["nl"]="linkercitaat",
+ ["pe"]="نقل‌قول‌چپ",
+ ["ro"]="citatstanga",
+ },
+ ["leftquote"]={
+ ["cs"]="citovatvlevo",
+ ["de"]="linkerzitieren",
+ ["en"]="leftquote",
+ ["fr"]="citergauche",
+ ["it"]="menzionesinistra",
+ ["nl"]="linkerciteer",
+ ["pe"]="نقل‌چپ",
+ ["ro"]="minicitatstanga",
+ },
+ ["leftsentence"]={
+ ["cs"]="vetavlevo",
+ ["de"]="linkersatz",
+ ["en"]="leftsentence",
+ ["fr"]="phrasegauche",
+ ["it"]="frasesinistra",
+ ["nl"]="linkerzin",
+ ["pe"]="جمله‌چپ",
+ ["ro"]="propozitiestanga",
+ },
+ ["leftspeech"]={
+ ["cs"]="leftspeech",
+ ["de"]="leftspeech",
+ ["en"]="leftspeech",
+ ["fr"]="leftspeech",
+ ["it"]="leftspeech",
+ ["nl"]="linkeruitspraak",
+ ["pe"]="سخنرانی‌چپ",
+ ["ro"]="leftspeech",
+ },
+ ["leftstyle"]={
+ ["cs"]="stylvlevo",
+ ["de"]="linkerstil",
+ ["en"]="leftstyle",
+ ["fr"]="leftstyle",
+ ["it"]="stilesinistra",
+ ["nl"]="linkerletter",
+ ["pe"]="سبک‌چپ",
+ ["ro"]="stilstanga",
+ },
+ ["leftsubsentence"]={
+ ["cs"]="podvetavlevo",
+ ["de"]="linkersubsatz",
+ ["en"]="leftsubsentence",
+ ["fr"]="sousphrasegauche",
+ ["it"]="sottofrasesinistra",
+ ["nl"]="linkersubzin",
+ ["pe"]="زیرجمله‌چپ",
+ ["ro"]="subpropozitiestanga",
+ },
+ ["lefttext"]={
+ ["cs"]="textvlevo",
+ ["de"]="linkertext",
+ ["en"]="lefttext",
+ ["fr"]="textegauche",
+ ["it"]="testosinistro",
+ ["nl"]="linkertekst",
+ ["pe"]="متن‌چپ",
+ ["ro"]="textstanga",
+ },
+ ["leftwidth"]={
+ ["cs"]="sirkavlevo",
+ ["de"]="linkerbreite",
+ ["en"]="leftwidth",
+ ["fr"]="largeurgauche",
+ ["it"]="ampiezzasinistra",
+ ["nl"]="linkerbreedte",
+ ["pe"]="عرض‌خط",
+ ["ro"]="latimestanga",
+ },
+ ["level"]={
+ ["cs"]="uroven",
+ ["de"]="niveau",
+ ["en"]="level",
+ ["fr"]="niveau",
+ ["it"]="livello",
+ ["nl"]="niveau",
+ ["pe"]="مرØله",
+ ["ro"]="nivel",
+ },
+ ["levels"]={
+ ["cs"]="urovne",
+ ["de"]="niveaus",
+ ["en"]="levels",
+ ["fr"]="niveaux",
+ ["it"]="livelli",
+ ["nl"]="niveaus",
+ ["pe"]="مرØله‌ها",
+ ["ro"]="nivele",
+ },
+ ["limittext"]={
+ ["cs"]="limittext",
+ ["de"]="limittext",
+ ["en"]="limittext",
+ ["fr"]="limittext",
+ ["it"]="limittext",
+ ["nl"]="limiettekst",
+ ["pe"]="مرزمتن",
+ ["ro"]="limittext",
+ },
+ ["line"]={
+ ["cs"]="radek",
+ ["de"]="zeile",
+ ["en"]="line",
+ ["fr"]="ligne",
+ ["it"]="riga",
+ ["nl"]="regel",
+ ["pe"]="خط",
+ ["ro"]="linie",
+ },
+ ["linecorrection"]={
+ ["cs"]="korekceradku",
+ ["de"]="zeilekorrektur",
+ ["en"]="linecorrection",
+ ["fr"]="correctionligne",
+ ["it"]="correzioneriga",
+ ["nl"]="regelcorrectie",
+ ["pe"]="تصØÛŒØ‌خط",
+ ["ro"]="corectielinie",
+ },
+ ["lines"]={
+ ["cs"]="radky",
+ ["de"]="zeilen",
+ ["en"]="lines",
+ ["fr"]="lignes",
+ ["it"]="righe",
+ ["nl"]="regels",
+ ["pe"]="خطها",
+ ["ro"]="linii",
+ },
+ ["list"]={
+ ["cs"]="seznam",
+ ["de"]="liste",
+ ["en"]="list",
+ ["fr"]="liste",
+ ["it"]="elenco",
+ ["nl"]="lijst",
+ ["pe"]="لیست",
+ ["ro"]="lista",
+ },
+ ["listtext"]={
+ ["cs"]="listtext",
+ ["de"]="listtext",
+ ["en"]="listtext",
+ ["fr"]="texteliste",
+ ["it"]="listtext",
+ ["nl"]="lijsttekst",
+ ["pe"]="متن‌لیست",
+ ["ro"]="listtext",
+ },
+ ["local"]={
+ ["cs"]="lokalne",
+ ["de"]="lokal",
+ ["en"]="local",
+ ["fr"]="local",
+ ["it"]="locale",
+ ["nl"]="lokaal",
+ ["pe"]="موضعی",
+ ["ro"]="local",
+ },
+ ["location"]={
+ ["cs"]="misto",
+ ["de"]="platz",
+ ["en"]="location",
+ ["fr"]="emplacement",
+ ["it"]="luogo",
+ ["nl"]="plaats",
+ ["pe"]="مکان",
+ ["ro"]="locatie",
+ },
+ ["logo"]={
+ ["cs"]="logo",
+ ["de"]="logo",
+ ["en"]="logo",
+ ["fr"]="logo",
+ ["it"]="logo",
+ ["nl"]="logo",
+ ["pe"]="آرم",
+ ["ro"]="logo",
+ },
+ ["logos"]={
+ ["cs"]="loga",
+ ["de"]="logos",
+ ["en"]="logos",
+ ["fr"]="logos",
+ ["it"]="loghi",
+ ["nl"]="logos",
+ ["pe"]="آرمها",
+ ["ro"]="logos",
+ },
+ ["marcolor"]={
+ ["cs"]="barvaznacky",
+ ["de"]="beschrfarbe",
+ ["en"]="marcolor",
+ ["fr"]="couleurmarquage",
+ ["it"]="coloremarcatura",
+ ["nl"]="markleur",
+ ["pe"]="رنگ‌Øاش",
+ ["ro"]="culoaremarcaj",
+ },
+ ["margin"]={
+ ["cs"]="marginalie",
+ ["de"]="marginalie",
+ ["en"]="margin",
+ ["fr"]="marge",
+ ["it"]="margine",
+ ["nl"]="marge",
+ ["pe"]="Øاشیه",
+ ["ro"]="margine",
+ },
+ ["margindistance"]={
+ ["cs"]="vzdalenostokraje",
+ ["de"]="marginalabstand",
+ ["en"]="margindistance",
+ ["fr"]="distancemarge",
+ ["it"]="distanzamargine",
+ ["nl"]="margeafstand",
+ ["pe"]="Ùاصله‌Øاشیه",
+ ["ro"]="distantamargine",
+ },
+ ["marginedge"]={
+ ["cs"]="textovahrana",
+ ["de"]="marginalkante",
+ ["en"]="marginedge",
+ ["fr"]="bordmarge",
+ ["it"]="bordomargine",
+ ["nl"]="kantlijn",
+ ["pe"]="لبه‌Øاشیه",
+ ["ro"]="coltbordura",
+ },
+ ["marginedgetext"]={
+ ["cs"]="textmarginalnihookraje",
+ ["de"]="marginalkantetext",
+ ["en"]="marginedgetext",
+ ["fr"]="textebordmarge",
+ ["it"]="testobordomargine",
+ ["nl"]="kantlijntekst",
+ ["pe"]="متن‌لبه‌Øاشیه",
+ ["ro"]="textcoltbordura",
+ },
+ ["margintext"]={
+ ["cs"]="textmarginalie",
+ ["de"]="marginaltext",
+ ["en"]="margintext",
+ ["fr"]="textemarge",
+ ["it"]="testomargine",
+ ["nl"]="margetekst",
+ ["pe"]="متن‌Øاشیه",
+ ["ro"]="textmargine",
+ },
+ ["marking"]={
+ ["cs"]="znaceni",
+ ["de"]="beschriftung",
+ ["en"]="marking",
+ ["fr"]="marquage",
+ ["it"]="marcatura",
+ ["nl"]="markering",
+ ["pe"]="نشانه‌گذاری",
+ ["ro"]="marcaje",
+ },
+ ["marstyle"]={
+ ["cs"]="stylsnacky",
+ ["de"]="beschrstil",
+ ["en"]="marstyle",
+ ["fr"]="stylemarquage",
+ ["it"]="stilemarcatura",
+ ["nl"]="marletter",
+ ["pe"]="سبک‌Øاش",
+ ["ro"]="stilmarcaj",
+ },
+ ["max"]={
+ ["cs"]="max",
+ ["de"]="max",
+ ["en"]="max",
+ ["fr"]="max",
+ ["it"]="max",
+ ["nl"]="max",
+ ["pe"]="بیشترین",
+ ["ro"]="max",
+ },
+ ["maxheight"]={
+ ["cs"]="maxvyska",
+ ["de"]="maxhoehe",
+ ["en"]="maxheight",
+ ["fr"]="hauteurmax",
+ ["it"]="altezzamax",
+ ["nl"]="maxhoogte",
+ ["pe"]="بیشترین‌ارتÙاع",
+ ["ro"]="inaltimemaxima",
+ },
+ ["maxwidth"]={
+ ["cs"]="maxsirka",
+ ["de"]="maxbreite",
+ ["en"]="maxwidth",
+ ["fr"]="largeurmax",
+ ["it"]="ampiezzamax",
+ ["nl"]="maxbreedte",
+ ["pe"]="بیشترین‌عرض",
+ ["ro"]="latimemaxima",
+ },
+ ["menu"]={
+ ["cs"]="menu",
+ ["de"]="menue",
+ ["en"]="menu",
+ ["fr"]="menu",
+ ["it"]="menu",
+ ["nl"]="menu",
+ ["pe"]="منو",
+ ["ro"]="meniu",
+ },
+ ["method"]={
+ ["cs"]="metoda",
+ ["de"]="methode",
+ ["en"]="method",
+ ["fr"]="methode",
+ ["it"]="metodo",
+ ["nl"]="methode",
+ ["pe"]="روش",
+ ["ro"]="metoda",
+ },
+ ["middle"]={
+ ["cs"]="stredni",
+ ["de"]="mittig",
+ ["en"]="middle",
+ ["fr"]="milieu",
+ ["it"]="centro",
+ ["nl"]="midden",
+ ["pe"]="میان",
+ ["ro"]="mijloc",
+ },
+ ["middlespeech"]={
+ ["cs"]="middlespeech",
+ ["de"]="middlespeech",
+ ["en"]="middlespeech",
+ ["fr"]="middlespeech",
+ ["it"]="middlespeech",
+ ["nl"]="middenuitspraak",
+ ["pe"]="سخنرانی‌میانی",
+ ["ro"]="middlespeech",
+ },
+ ["middletext"]={
+ ["cs"]="strednitext",
+ ["de"]="mittigertext",
+ ["en"]="middletext",
+ ["fr"]="textecentre",
+ ["it"]="testocentro",
+ ["nl"]="middentekst",
+ ["pe"]="متن‌میانی",
+ ["ro"]="textmijloc",
+ },
+ ["midsentence"]={
+ ["cs"]="midsentence",
+ ["de"]="midsentence",
+ ["en"]="midsentence",
+ ["fr"]="midsentence",
+ ["it"]="midsentence",
+ ["nl"]="middenzin",
+ ["pe"]="جمله‌میانی",
+ ["ro"]="midsentence",
+ },
+ ["min"]={
+ ["cs"]="min",
+ ["de"]="min",
+ ["en"]="min",
+ ["fr"]="min",
+ ["it"]="min",
+ ["nl"]="min",
+ ["pe"]="کمترین",
+ ["ro"]="min",
+ },
+ ["mindepth"]={
+ ["cs"]="mindepth",
+ ["de"]="mindepth",
+ ["en"]="mindepth",
+ ["fr"]="profondeurmin",
+ ["it"]="mindeoth",
+ ["nl"]="mindiepte",
+ ["pe"]="کمترین‌عمق",
+ ["ro"]="mindepth",
+ },
+ ["minheight"]={
+ ["cs"]="minvyska",
+ ["de"]="minhoehe",
+ ["en"]="minheight",
+ ["fr"]="hauteurmin",
+ ["it"]="altezzamin",
+ ["nl"]="minhoogte",
+ ["pe"]="کمترین‌ارتÙاع",
+ ["ro"]="inaltimeminima",
+ },
+ ["minwidth"]={
+ ["cs"]="minsirka",
+ ["de"]="minbreite",
+ ["en"]="minwidth",
+ ["fr"]="largeurmin",
+ ["it"]="ampiezzamin",
+ ["nl"]="minbreedte",
+ ["pe"]="کمترین‌عرض",
+ ["ro"]="latimeminima",
+ },
+ ["n"]={
+ ["cs"]="n",
+ ["de"]="n",
+ ["en"]="n",
+ ["fr"]="n",
+ ["it"]="n",
+ ["nl"]="n",
+ ["pe"]="n",
+ ["ro"]="n",
+ },
+ ["name"]={
+ ["cs"]="jmeno",
+ ["de"]="name",
+ ["en"]="name",
+ ["fr"]="nom",
+ ["it"]="nome",
+ ["nl"]="naam",
+ ["pe"]="نام",
+ ["ro"]="nume",
+ },
+ ["nbottom"]={
+ ["cs"]="nspodek",
+ ["de"]="nunten",
+ ["en"]="nbottom",
+ ["fr"]="ninf",
+ ["it"]="nfondo",
+ ["nl"]="nonder",
+ ["pe"]="nbottom",
+ ["ro"]="njos",
+ },
+ ["nc"]={
+ ["cs"]="nc",
+ ["de"]="nc",
+ ["en"]="nc",
+ ["fr"]="nc",
+ ["it"]="nc",
+ ["nl"]="nc",
+ ["pe"]="nc",
+ ["ro"]="nc",
+ },
+ ["next"]={
+ ["cs"]="dalsi",
+ ["de"]="folgende",
+ ["en"]="next",
+ ["fr"]="suivant",
+ ["it"]="successivo",
+ ["nl"]="volgende",
+ ["pe"]="بعدی",
+ ["ro"]="urmatorul",
+ },
+ ["nl"]={
+ ["cs"]="nl",
+ ["de"]="nl",
+ ["en"]="nl",
+ ["fr"]="nl",
+ ["it"]="nl",
+ ["nl"]="nl",
+ ["pe"]="nl",
+ ["ro"]="nl",
+ },
+ ["nleft"]={
+ ["cs"]="nvlevo",
+ ["de"]="nlinks",
+ ["en"]="nleft",
+ ["fr"]="ngauche",
+ ["it"]="nsinistra",
+ ["nl"]="nlinks",
+ ["pe"]="nleft",
+ ["ro"]="nstanga",
+ },
+ ["nlines"]={
+ ["cs"]="nradky",
+ ["de"]="zzeile",
+ ["en"]="nlines",
+ ["fr"]="nlignes",
+ ["it"]="nrighe",
+ ["nl"]="nregels",
+ ["pe"]="nlines",
+ ["ro"]="nlinii",
+ },
+ ["norm"]={
+ ["cs"]="norm",
+ ["de"]="norm",
+ ["en"]="norm",
+ ["fr"]="norme",
+ ["it"]="norma",
+ ["nl"]="norm",
+ ["pe"]="norm",
+ ["ro"]="norm",
+ },
+ ["nr"]={
+ ["cs"]="nr",
+ ["de"]="nr",
+ ["en"]="nr",
+ ["fr"]="nr",
+ ["it"]="nr",
+ ["nl"]="nr",
+ ["pe"]="nr",
+ ["ro"]="nr",
+ },
+ ["nright"]={
+ ["cs"]="nvpravo",
+ ["de"]="nrechts",
+ ["en"]="nright",
+ ["fr"]="ndroite",
+ ["it"]="ndestra",
+ ["nl"]="nrechts",
+ ["pe"]="nright",
+ ["ro"]="ndreapta",
+ },
+ ["ntop"]={
+ ["cs"]="nvrsek",
+ ["de"]="noben",
+ ["en"]="ntop",
+ ["fr"]="nsup",
+ ["it"]="ncima",
+ ["nl"]="nboven",
+ ["pe"]="ntop",
+ ["ro"]="nsus",
+ },
+ ["number"]={
+ ["cs"]="cislo",
+ ["de"]="nummer",
+ ["en"]="number",
+ ["fr"]="numero",
+ ["it"]="numero",
+ ["nl"]="nummer",
+ ["pe"]="شماره",
+ ["ro"]="numar",
+ },
+ ["numbercolor"]={
+ ["cs"]="barvacisla",
+ ["de"]="nummernfarbe",
+ ["en"]="numbercolor",
+ ["fr"]="couleurnumero",
+ ["it"]="colorenumero",
+ ["nl"]="nummerkleur",
+ ["pe"]="رنگ‌شماره",
+ ["ro"]="culoarenumar",
+ },
+ ["numbercommand"]={
+ ["cs"]="ciselnyprikaz",
+ ["de"]="nummerbefehl",
+ ["en"]="numbercommand",
+ ["fr"]="commandenumero",
+ ["it"]="comandonumero",
+ ["nl"]="nummercommando",
+ ["pe"]="Ùرمان‌شماره",
+ ["ro"]="comandanumar",
+ },
+ ["numberdistance"]={
+ ["cs"]="numberdistance",
+ ["de"]="numberdistance",
+ ["en"]="numberdistance",
+ ["fr"]="numberdistance",
+ ["it"]="numberdistance",
+ ["nl"]="nummerafstand",
+ ["pe"]="Ùاصله‌شماره",
+ ["ro"]="numberdistance",
+ },
+ ["numbering"]={
+ ["cs"]="cislovani",
+ ["de"]="nummerierung",
+ ["en"]="numbering",
+ ["fr"]="numerotation",
+ ["it"]="numerazione",
+ ["nl"]="nummeren",
+ ["pe"]="شماره‌گذاری",
+ ["ro"]="numerotare",
+ },
+ ["numberseparator"]={
+ ["cs"]="oddelovaccisla",
+ ["de"]="nummernseperator",
+ ["en"]="numberseparator",
+ ["fr"]="separateurnumbero",
+ ["it"]="separatorenumero",
+ ["nl"]="nummerscheider",
+ ["pe"]="جداکننده‌شماره",
+ ["ro"]="separatornumar",
+ },
+ ["numberstyle"]={
+ ["cs"]="stylcisla",
+ ["de"]="nummernstil",
+ ["en"]="numberstyle",
+ ["fr"]="stylenumero",
+ ["it"]="stilenumero",
+ ["nl"]="nummerletter",
+ ["pe"]="سبک‌شماره",
+ ["ro"]="stilnumar",
+ },
+ ["numberwidth"]={
+ ["cs"]="numberwidth",
+ ["de"]="numberwidth",
+ ["en"]="numberwidth",
+ ["fr"]="numberwidth",
+ ["it"]="numberwidth",
+ ["nl"]="nummerbreedte",
+ ["pe"]="عرض‌شماره",
+ ["ro"]="numberwidth",
+ },
+ ["nx"]={
+ ["cs"]="nx",
+ ["de"]="nx",
+ ["en"]="nx",
+ ["fr"]="nx",
+ ["it"]="nx",
+ ["nl"]="nx",
+ ["pe"]="nx",
+ ["ro"]="nx",
+ },
+ ["ny"]={
+ ["cs"]="ny",
+ ["de"]="ny",
+ ["en"]="ny",
+ ["fr"]="ny",
+ ["it"]="ny",
+ ["nl"]="ny",
+ ["pe"]="ny",
+ ["ro"]="ny",
+ },
+ ["object"]={
+ ["cs"]="objekt",
+ ["de"]="objekt",
+ ["en"]="object",
+ ["fr"]="objet",
+ ["it"]="oggetto",
+ ["nl"]="object",
+ ["pe"]="شیئ",
+ ["ro"]="obiect",
+ },
+ ["obstruction"]={
+ ["cs"]="prekazka",
+ ["de"]="gesperrt",
+ ["en"]="obstruction",
+ ["fr"]="obstruction",
+ ["it"]="ostruzione",
+ ["nl"]="blokkade",
+ ["pe"]="انسداد",
+ ["ro"]="obstructie",
+ },
+ ["oddmargin"]={
+ ["cs"]="lichyokraj",
+ ["de"]="ungeraderand",
+ ["en"]="oddmargin",
+ ["fr"]="margepaire",
+ ["it"]="marginedispari",
+ ["nl"]="onevenmarge",
+ ["pe"]="Øاشیه‌Ùرد",
+ ["ro"]="margineimpara",
+ },
+ ["offset"]={
+ ["cs"]="offset",
+ ["de"]="offset",
+ ["en"]="offset",
+ ["fr"]="offset",
+ ["it"]="offset",
+ ["nl"]="offset",
+ ["pe"]="Ø¢Ùست",
+ ["ro"]="offset",
+ },
+ ["openaction"]={
+ ["cs"]="otevriakci",
+ ["de"]="oeffenaktion",
+ ["en"]="openaction",
+ ["fr"]="actionouverture",
+ ["it"]="azioneapri",
+ ["nl"]="openactie",
+ ["pe"]="عمل‌باز",
+ ["ro"]="actiunedeschidere",
+ },
+ ["openpageaction"]={
+ ["cs"]="akceotevrenistranky",
+ ["de"]="openpageaction",
+ ["en"]="openpageaction",
+ ["fr"]="actionouverturepage",
+ ["it"]="azioneapripagina",
+ ["nl"]="openpaginaactie",
+ ["pe"]="عمل‌صÙØه‌باز",
+ ["ro"]="actiunedeschiderepagina",
+ },
+ ["option"]={
+ ["cs"]="volba",
+ ["de"]="option",
+ ["en"]="option",
+ ["fr"]="option",
+ ["it"]="opzione",
+ ["nl"]="optie",
+ ["pe"]="گزینه",
+ ["ro"]="optiune",
+ },
+ ["orientation"]={
+ ["cs"]="orientation",
+ ["de"]="orientation",
+ ["en"]="orientation",
+ ["fr"]="orientation",
+ ["it"]="orientation",
+ ["nl"]="orientatie",
+ ["pe"]="جهت‌دهی",
+ ["ro"]="orientation",
+ },
+ ["outermargin"]={
+ ["cs"]="outermargin",
+ ["de"]="outermargin",
+ ["en"]="outermargin",
+ ["fr"]="margeexterieure",
+ ["it"]="margineesterno",
+ ["nl"]="buitenmarge",
+ ["pe"]="Øاشیه‌خارجی",
+ ["ro"]="outermargin",
+ },
+ ["overprint"]={
+ ["cs"]="overprint",
+ ["de"]="overprint",
+ ["en"]="overprint",
+ ["fr"]="overprint",
+ ["it"]="overprint",
+ ["nl"]="overprint",
+ ["pe"]="overprint",
+ ["ro"]="overprint",
+ },
+ ["ownnumber"]={
+ ["cs"]="vlastnicislo",
+ ["de"]="eigenenummer",
+ ["en"]="ownnumber",
+ ["fr"]="numeroproprio",
+ ["it"]="numeroproprio",
+ ["nl"]="eigennummer",
+ ["pe"]="شماره‌خود",
+ ["ro"]="numarpropriu",
+ },
+ ["page"]={
+ ["cs"]="stranka",
+ ["de"]="seite",
+ ["en"]="page",
+ ["fr"]="page",
+ ["it"]="pagina",
+ ["nl"]="pagina",
+ ["pe"]="صÙØÙ‡",
+ ["ro"]="pagina",
+ },
+ ["pageboundaries"]={
+ ["cs"]="hranicestranky",
+ ["de"]="seitenbegrenzung",
+ ["en"]="pageboundaries",
+ ["fr"]="limitespage",
+ ["it"]="limitipagina",
+ ["nl"]="paginaovergangen",
+ ["pe"]="مرزهای‌صÙØÙ‡",
+ ["ro"]="marginipagina",
+ },
+ ["pagecolor"]={
+ ["cs"]="barvastranky",
+ ["de"]="seitenfarbe",
+ ["en"]="pagecolor",
+ ["fr"]="couleurpage",
+ ["it"]="colorepagina",
+ ["nl"]="paginakleur",
+ ["pe"]="رنگ‌صÙØÙ‡",
+ ["ro"]="culoarepagina",
+ },
+ ["pagecommand"]={
+ ["cs"]="strankovyprikaz",
+ ["de"]="seitenbefehl",
+ ["en"]="pagecommand",
+ ["fr"]="commandepage",
+ ["it"]="comandopagina",
+ ["nl"]="paginacommando",
+ ["pe"]="Ùرمان‌صÙØÙ‡",
+ ["ro"]="comandapagina",
+ },
+ ["pagenumber"]={
+ ["cs"]="cislostranky",
+ ["de"]="seitennummer",
+ ["en"]="pagenumber",
+ ["fr"]="numeropage",
+ ["it"]="numeropagina",
+ ["nl"]="paginanummer",
+ ["pe"]="شماره‌صÙØÙ‡",
+ ["ro"]="numarpagina",
+ },
+ ["pagestate"]={
+ ["cs"]="pagestate",
+ ["de"]="pagestate",
+ ["en"]="pagestate",
+ ["fr"]="etatpage",
+ ["it"]="statopagina",
+ ["nl"]="paginastatus",
+ ["pe"]="وضعیت‌صÙØÙ‡",
+ ["ro"]="pagestate",
+ },
+ ["pagestyle"]={
+ ["cs"]="stylstranky",
+ ["de"]="seitenstil",
+ ["en"]="pagestyle",
+ ["fr"]="stylepage",
+ ["it"]="stilepagina",
+ ["nl"]="paginaletter",
+ ["pe"]="سبک‌صÙØÙ‡",
+ ["ro"]="stilpagina",
+ },
+ ["palet"]={
+ ["cs"]="paleta",
+ ["de"]="palette",
+ ["en"]="palet",
+ ["fr"]="palette",
+ ["it"]="tavolozza",
+ ["nl"]="palet",
+ ["pe"]="لوØ",
+ ["ro"]="paleta",
+ },
+ ["paper"]={
+ ["cs"]="papir",
+ ["de"]="papier",
+ ["en"]="paper",
+ ["fr"]="papier",
+ ["it"]="carta",
+ ["nl"]="papier",
+ ["pe"]="برگ",
+ ["ro"]="hartie",
+ },
+ ["paragraph"]={
+ ["cs"]="odstavec",
+ ["de"]="absatz",
+ ["en"]="paragraph",
+ ["fr"]="paragraphe",
+ ["it"]="capoverso",
+ ["nl"]="alinea",
+ ["pe"]="پاراگراÙ",
+ ["ro"]="paragraf",
+ },
+ ["place"]={
+ ["cs"]="umistit",
+ ["de"]="platziere",
+ ["en"]="place",
+ ["fr"]="place",
+ ["it"]="metti",
+ ["nl"]="plaatsen",
+ ["pe"]="بگذار",
+ ["ro"]="pune",
+ },
+ ["placehead"]={
+ ["cs"]="umistihlavicku",
+ ["de"]="setzekopf",
+ ["en"]="placehead",
+ ["fr"]="placetete",
+ ["it"]="mettitesta",
+ ["nl"]="plaatskop",
+ ["pe"]="بگذارسر",
+ ["ro"]="punetitlu",
+ },
+ ["placestopper"]={
+ ["cs"]="predelmista",
+ ["de"]="setzetrenner",
+ ["en"]="placestopper",
+ ["fr"]="emplacementstopper",
+ ["it"]="mettistopper",
+ ["nl"]="plaatsafsluiter",
+ ["pe"]="بگذارایست",
+ ["ro"]="punestopper",
+ },
+ ["position"]={
+ ["cs"]="position",
+ ["de"]="position",
+ ["en"]="position",
+ ["fr"]="position",
+ ["it"]="posizione",
+ ["nl"]="positie",
+ ["pe"]="موقعیت",
+ ["ro"]="pozitie",
+ },
+ ["prefix"]={
+ ["cs"]="prefix",
+ ["de"]="prefix",
+ ["en"]="prefix",
+ ["fr"]="prefixe",
+ ["it"]="prefisso",
+ ["nl"]="prefix",
+ ["pe"]="پیشوند",
+ ["ro"]="prefix",
+ },
+ ["preset"]={
+ ["cs"]="prednastaveni",
+ ["de"]="voreinstellung",
+ ["en"]="preset",
+ ["fr"]="prereglage",
+ ["it"]="preimpostato",
+ ["nl"]="preset",
+ ["pe"]="preset",
+ ["ro"]="preset",
+ },
+ ["preview"]={
+ ["cs"]="nahled",
+ ["de"]="vorschau",
+ ["en"]="preview",
+ ["fr"]="previsualisation",
+ ["it"]="anteprima",
+ ["nl"]="preview",
+ ["pe"]="پیش‌دید",
+ ["ro"]="previzualizare",
+ },
+ ["previous"]={
+ ["cs"]="predchozi",
+ ["de"]="vorige",
+ ["en"]="previous",
+ ["fr"]="precedent",
+ ["it"]="precedente",
+ ["nl"]="vorige",
+ ["pe"]="قبلی",
+ ["ro"]="precendent",
+ },
+ ["previousnumber"]={
+ ["cs"]="predchozicislo",
+ ["de"]="vorigenummer",
+ ["en"]="previousnumber",
+ ["fr"]="numeroprecedent",
+ ["it"]="numeroprecedente",
+ ["nl"]="vorigenummer",
+ ["pe"]="شماره‌قبلی",
+ ["ro"]="numarprecedent",
+ },
+ ["process"]={
+ ["cs"]="process",
+ ["de"]="process",
+ ["en"]="process",
+ ["fr"]="process",
+ ["it"]="process",
+ ["nl"]="proces",
+ ["pe"]="پردازش",
+ ["ro"]="process",
+ },
+ ["radius"]={
+ ["cs"]="polomer",
+ ["de"]="radius",
+ ["en"]="radius",
+ ["fr"]="rayon",
+ ["it"]="raggio",
+ ["nl"]="straal",
+ ["pe"]="شعاع",
+ ["ro"]="raza",
+ },
+ ["random"]={
+ ["cs"]="nahodne",
+ ["de"]="zufaellig",
+ ["en"]="random",
+ ["fr"]="aleatoire",
+ ["it"]="casuale",
+ ["nl"]="willekeur",
+ ["pe"]="تصادÙÛŒ",
+ ["ro"]="aleator",
+ },
+ ["reduction"]={
+ ["cs"]="redukce",
+ ["de"]="reduktion",
+ ["en"]="reduction",
+ ["fr"]="reduction",
+ ["it"]="riduzione",
+ ["nl"]="reductie",
+ ["pe"]="کاهش",
+ ["ro"]="reducere",
+ },
+ ["ref"]={
+ ["cs"]="ref",
+ ["de"]="ref",
+ ["en"]="ref",
+ ["fr"]="ref",
+ ["it"]="ref",
+ ["nl"]="ref",
+ ["pe"]="رج",
+ ["ro"]="ref",
+ },
+ ["reference"]={
+ ["cs"]="odkaz",
+ ["de"]="referenz",
+ ["en"]="reference",
+ ["fr"]="reference",
+ ["it"]="riferimento",
+ ["nl"]="verwijzing",
+ ["pe"]="مرجع",
+ ["ro"]="referinta",
+ },
+ ["referencing"]={
+ ["cs"]="odkazujici",
+ ["de"]="referieren",
+ ["en"]="referencing",
+ ["fr"]="referencing",
+ ["it"]="referencing",
+ ["nl"]="refereren",
+ ["pe"]="مراجعه",
+ ["ro"]="referinta",
+ },
+ ["regionin"]={
+ ["cs"]="oblastuvnitr",
+ ["de"]="regionin",
+ ["en"]="regionin",
+ ["fr"]="entreregion",
+ ["it"]="entraregione",
+ ["nl"]="gebiedin",
+ ["pe"]="ناØیه‌درون",
+ ["ro"]="regiuneintrare",
+ },
+ ["regionout"]={
+ ["cs"]="oblastvne",
+ ["de"]="regionaus",
+ ["en"]="regionout",
+ ["fr"]="regionexterieure",
+ ["it"]="esciregione",
+ ["nl"]="gebieduit",
+ ["pe"]="ناØیه‌بیرون",
+ ["ro"]="regiuneiesire",
+ },
+ ["repeat"]={
+ ["cs"]="opakovat",
+ ["de"]="wiederholen",
+ ["en"]="repeat",
+ ["fr"]="repete",
+ ["it"]="ripeti",
+ ["nl"]="herhaal",
+ ["pe"]="تکرار",
+ ["ro"]="repeta",
+ },
+ ["reset"]={
+ ["cs"]="reset",
+ ["de"]="reset",
+ ["en"]="reset",
+ ["fr"]="reset",
+ ["it"]="reset",
+ ["nl"]="reset",
+ ["pe"]="بازنشانی",
+ ["ro"]="reset",
+ },
+ ["resetnumber"]={
+ ["cs"]="resetnumber",
+ ["de"]="resetnumber",
+ ["en"]="resetnumber",
+ ["fr"]="raznumero",
+ ["it"]="resetnumber",
+ ["nl"]="resetnummer",
+ ["pe"]="بازنشانی‌شماره",
+ ["ro"]="resetnumber",
+ },
+ ["resolution"]={
+ ["cs"]="rozliseni",
+ ["de"]="aufloesung",
+ ["en"]="resolution",
+ ["fr"]="resolution",
+ ["it"]="risoluzione",
+ ["nl"]="resolutie",
+ ["pe"]="Ú©ÛŒÙیت",
+ ["ro"]="rezolutie",
+ },
+ ["right"]={
+ ["cs"]="vpravo",
+ ["de"]="rechts",
+ ["en"]="right",
+ ["fr"]="droite",
+ ["it"]="destra",
+ ["nl"]="rechts",
+ ["pe"]="راست",
+ ["ro"]="dreapta",
+ },
+ ["rightcolor"]={
+ ["cs"]="barvavpravo",
+ ["de"]="rechterfarbe",
+ ["en"]="rightcolor",
+ ["fr"]="couleurdroite",
+ ["it"]="coloredestra",
+ ["nl"]="rechterkleur",
+ ["pe"]="رنگ‌راست",
+ ["ro"]="culoaredreapta",
+ },
+ ["rightcompoundhyphen"]={
+ ["cs"]="rightcompoundhyphen",
+ ["de"]="rightcompoundhyphen",
+ ["en"]="rightcompoundhyphen",
+ ["fr"]="rightcompoundhyphen",
+ ["it"]="rightcompoundhyphen",
+ ["nl"]="rechterkoppelteken",
+ ["pe"]="rightcompoundhyphen",
+ ["ro"]="rightcompoundhyphen",
+ },
+ ["rightedge"]={
+ ["cs"]="pravahrana",
+ ["de"]="rechtekante",
+ ["en"]="rightedge",
+ ["fr"]="borddroit",
+ ["it"]="bordodestro",
+ ["nl"]="rechterrand",
+ ["pe"]="لبه‌راست",
+ ["ro"]="borduradreapta",
+ },
+ ["rightedgedistance"]={
+ ["cs"]="vzdalenostpravehrany",
+ ["de"]="rechterkantenabstand",
+ ["en"]="rightedgedistance",
+ ["fr"]="distanceborddroit",
+ ["it"]="distanzabordodestro",
+ ["nl"]="rechterrandafstand",
+ ["pe"]="Ùاصله‌لبه‌راست",
+ ["ro"]="distantacoltdreapta",
+ },
+ ["rightframe"]={
+ ["cs"]="ramecekvpravo",
+ ["de"]="rechterrahmen",
+ ["en"]="rightframe",
+ ["fr"]="cadredroit",
+ ["it"]="cornicedestra",
+ ["nl"]="rechterkader",
+ ["pe"]="قالب‌راست",
+ ["ro"]="framedreapta",
+ },
+ ["righthyphen"]={
+ ["cs"]="righthyphen",
+ ["de"]="righthyphen",
+ ["en"]="righthyphen",
+ ["fr"]="righthyphen",
+ ["it"]="righthyphen",
+ ["nl"]="righthyphen",
+ ["pe"]="righthyphen",
+ ["ro"]="righthyphen",
+ },
+ ["rightmargin"]={
+ ["cs"]="pravyokraj",
+ ["de"]="rechterrand",
+ ["en"]="rightmargin",
+ ["fr"]="margedroite",
+ ["it"]="marginedestro",
+ ["nl"]="rechtermarge",
+ ["pe"]="Øاشیه‌راست",
+ ["ro"]="marginedreapta",
+ },
+ ["rightmargindistance"]={
+ ["cs"]="vzdalenostpravehookraje",
+ ["de"]="rechterrandabstand",
+ ["en"]="rightmargindistance",
+ ["fr"]="distancemargedroite",
+ ["it"]="distanzamarginedestro",
+ ["nl"]="rechtermargeafstand",
+ ["pe"]="Ùاصله‌Øاشیه‌راست",
+ ["ro"]="distantamarginedreapta",
+ },
+ ["rightoffset"]={
+ ["cs"]="pravyoffset",
+ ["de"]="rechterabstand",
+ ["en"]="rightoffset",
+ ["fr"]="rightoffset",
+ ["it"]="offsetdestro",
+ ["nl"]="rechteroffset",
+ ["pe"]="Ø¢Ùست‌راست",
+ ["ro"]="offsetdreapta",
+ },
+ ["rightquotation"]={
+ ["cs"]="citacevpravo",
+ ["de"]="rechterzitat",
+ ["en"]="rightquotation",
+ ["fr"]="citationdroite",
+ ["it"]="citazionedestra",
+ ["nl"]="rechtercitaat",
+ ["pe"]="نقل‌قول‌راست",
+ ["ro"]="citatdreapta",
+ },
+ ["rightquote"]={
+ ["cs"]="citovatvpravo",
+ ["de"]="rechterzitieren",
+ ["en"]="rightquote",
+ ["fr"]="citerdroite",
+ ["it"]="menzionedestra",
+ ["nl"]="rechterciteer",
+ ["pe"]="نقل‌راست",
+ ["ro"]="minicitatdreapta",
+ },
+ ["rightsentence"]={
+ ["cs"]="vetavpravo",
+ ["de"]="rechtersatz",
+ ["en"]="rightsentence",
+ ["fr"]="phrasedroite",
+ ["it"]="frasedestra",
+ ["nl"]="rechterzin",
+ ["pe"]="جمله‌راست",
+ ["ro"]="propozitiedreapta",
+ },
+ ["rightspeech"]={
+ ["cs"]="rightspeech",
+ ["de"]="rightspeech",
+ ["en"]="rightspeech",
+ ["fr"]="rightspeech",
+ ["it"]="rightspeech",
+ ["nl"]="rechteruitspraak",
+ ["pe"]="سخنرانی‌راست",
+ ["ro"]="rightspeech",
+ },
+ ["rightstyle"]={
+ ["cs"]="stylvpravo",
+ ["de"]="rechterstil",
+ ["en"]="rightstyle",
+ ["fr"]="styledroit",
+ ["it"]="stiledestra",
+ ["nl"]="rechterletter",
+ ["pe"]="سبک‌راست",
+ ["ro"]="stildreapta",
+ },
+ ["rightsubsentence"]={
+ ["cs"]="podvetavpravo",
+ ["de"]="rechtersubsatz",
+ ["en"]="rightsubsentence",
+ ["fr"]="sousphrasedroite",
+ ["it"]="sottofrasedestra",
+ ["nl"]="rechtersubzin",
+ ["pe"]="زیرجمله‌راست",
+ ["ro"]="subpropozitiedreapta",
+ },
+ ["righttext"]={
+ ["cs"]="textvpravo",
+ ["de"]="rechtertext",
+ ["en"]="righttext",
+ ["fr"]="textedroit",
+ ["it"]="testodestro",
+ ["nl"]="rechtertekst",
+ ["pe"]="متن‌راست",
+ ["ro"]="textdreapta",
+ },
+ ["rightwidth"]={
+ ["cs"]="sirkavpravo",
+ ["de"]="rechterbreite",
+ ["en"]="rightwidth",
+ ["fr"]="largeurdroite",
+ ["it"]="ampiezzadestra",
+ ["nl"]="rechterbreedte",
+ ["pe"]="عرض‌راست",
+ ["ro"]="marginedreapta",
+ },
+ ["rotation"]={
+ ["cs"]="rotace",
+ ["de"]="rotation",
+ ["en"]="rotation",
+ ["fr"]="rotation",
+ ["it"]="rotazione",
+ ["nl"]="rotatie",
+ ["pe"]="دوران",
+ ["ro"]="rotatie",
+ },
+ ["rule"]={
+ ["cs"]="linka",
+ ["de"]="linie",
+ ["en"]="rule",
+ ["fr"]="ligne",
+ ["it"]="linea",
+ ["nl"]="lijn",
+ ["pe"]="خط",
+ ["ro"]="rigla",
+ },
+ ["rulecolor"]={
+ ["cs"]="barvalinky",
+ ["de"]="linienfarbe",
+ ["en"]="rulecolor",
+ ["fr"]="couleurligne",
+ ["it"]="colorelinea",
+ ["nl"]="lijnkleur",
+ ["pe"]="رنگ‌خط",
+ ["ro"]="culoarerigla",
+ },
+ ["rulethickness"]={
+ ["cs"]="tloustkalinky",
+ ["de"]="liniendicke",
+ ["en"]="rulethickness",
+ ["fr"]="epaisseurligne",
+ ["it"]="spessorelinea",
+ ["nl"]="lijndikte",
+ ["pe"]="ضخامت‌خط",
+ ["ro"]="grosimerigla",
+ },
+ ["samepage"]={
+ ["cs"]="stejnastranka",
+ ["de"]="selbeseite",
+ ["en"]="samepage",
+ ["fr"]="memepage",
+ ["it"]="stessapagina",
+ ["nl"]="zelfdepagina",
+ ["pe"]="همان‌صÙØÙ‡",
+ ["ro"]="aceeasipagina",
+ },
+ ["sample"]={
+ ["cs"]="vzor",
+ ["de"]="muster",
+ ["en"]="sample",
+ ["fr"]="echantillon",
+ ["it"]="campione",
+ ["nl"]="monster",
+ ["pe"]="نمونه",
+ ["ro"]="exemplu",
+ },
+ ["scale"]={
+ ["cs"]="meritko",
+ ["de"]="format",
+ ["en"]="scale",
+ ["fr"]="echelle",
+ ["it"]="scala",
+ ["nl"]="schaal",
+ ["pe"]="مقیاس",
+ ["ro"]="scala",
+ },
+ ["scope"]={
+ ["cs"]="rozsah",
+ ["de"]="bereich",
+ ["en"]="scope",
+ ["fr"]="scope",
+ ["it"]="scope",
+ ["nl"]="scope",
+ ["pe"]="طرØ",
+ ["ro"]="scop",
+ },
+ ["screen"]={
+ ["cs"]="rastr",
+ ["de"]="raster",
+ ["en"]="screen",
+ ["fr"]="ecran",
+ ["it"]="schermo",
+ ["nl"]="raster",
+ ["pe"]="پرده",
+ ["ro"]="ecran",
+ },
+ ["section"]={
+ ["cs"]="oddil",
+ ["de"]="abschnitt",
+ ["en"]="section",
+ ["fr"]="section",
+ ["it"]="sezione",
+ ["nl"]="sectie",
+ ["pe"]="بخش",
+ ["ro"]="sectiune",
+ },
+ ["sectionnumber"]={
+ ["cs"]="cislooddilu",
+ ["de"]="abschnittsnummer",
+ ["en"]="sectionnumber",
+ ["fr"]="numerosection",
+ ["it"]="numerosezione",
+ ["nl"]="sectienummer",
+ ["pe"]="شماره‌بخش",
+ ["ro"]="numarsectiune",
+ },
+ ["separator"]={
+ ["cs"]="oddelovac",
+ ["de"]="seperator",
+ ["en"]="separator",
+ ["fr"]="separateur",
+ ["it"]="separatore",
+ ["nl"]="scheider",
+ ["pe"]="جداکننده",
+ ["ro"]="separator",
+ },
+ ["set"]={
+ ["cs"]="set",
+ ["de"]="set",
+ ["en"]="set",
+ ["fr"]="set",
+ ["it"]="set",
+ ["nl"]="set",
+ ["pe"]="قراربده",
+ ["ro"]="set",
+ },
+ ["setups"]={
+ ["cs"]="setups",
+ ["de"]="setups",
+ ["en"]="setups",
+ ["fr"]="reglages",
+ ["it"]="setups",
+ ["nl"]="setups",
+ ["pe"]="بارگذاریها",
+ ["ro"]="setups",
+ },
+ ["side"]={
+ ["cs"]="pocitat",
+ ["de"]="objektabstand",
+ ["en"]="side",
+ ["fr"]="cote",
+ ["it"]="lato",
+ ["nl"]="zij",
+ ["pe"]="کنار",
+ ["ro"]="parte",
+ },
+ ["sidealign"]={
+ ["cs"]="sidealign",
+ ["de"]="sidealign",
+ ["en"]="sidealign",
+ ["fr"]="sidealign",
+ ["it"]="sidealign",
+ ["nl"]="zijuitlijnen",
+ ["pe"]="تنظیم‌کنار",
+ ["ro"]="sidealign",
+ },
+ ["sidemethod"]={
+ ["cs"]="sidemethod",
+ ["de"]="sidemethod",
+ ["en"]="sidemethod",
+ ["fr"]="sidemethod",
+ ["it"]="sidemethod",
+ ["nl"]="zijmethode",
+ ["pe"]="روش‌کنار",
+ ["ro"]="sidemethod",
+ },
+ ["sidespaceafter"]={
+ ["cs"]="bocnimezeraza",
+ ["de"]="nebennachspatium",
+ ["en"]="sidespaceafter",
+ ["fr"]="espacelateralapres",
+ ["it"]="spaziolateraledopo",
+ ["nl"]="zijnawit",
+ ["pe"]="Ùضای‌کناری‌بعد",
+ ["ro"]="spatiulateraldupa",
+ },
+ ["sidespacebefore"]={
+ ["cs"]="bocnimezerapred",
+ ["de"]="nebenvorspatium",
+ ["en"]="sidespacebefore",
+ ["fr"]="espacelateralavant",
+ ["it"]="spaziolateraleprima",
+ ["nl"]="zijvoorwit",
+ ["pe"]="Ùضای‌کناری‌قبل",
+ ["ro"]="spatiulateralinainte",
+ },
+ ["sign"]={
+ ["cs"]="znak",
+ ["de"]="zeichen",
+ ["en"]="sign",
+ ["fr"]="signe",
+ ["it"]="segno",
+ ["nl"]="teken",
+ ["pe"]="علامت",
+ ["ro"]="semn",
+ },
+ ["size"]={
+ ["cs"]="velikost",
+ ["de"]="groesse",
+ ["en"]="size",
+ ["fr"]="dimension",
+ ["it"]="dimensione",
+ ["nl"]="formaat",
+ ["pe"]="اندازه",
+ ["ro"]="dimensiune",
+ },
+ ["small"]={
+ ["cs"]="male",
+ ["de"]="klein",
+ ["en"]="small",
+ ["fr"]="petit",
+ ["it"]="piccolo",
+ ["nl"]="klein",
+ ["pe"]="Ú©ÙˆÚ†Ú©",
+ ["ro"]="mic",
+ },
+ ["sorttype"]={
+ ["cs"]="sorttype",
+ ["de"]="sorttype",
+ ["en"]="sorttype",
+ ["fr"]="sorttype",
+ ["it"]="sorttype",
+ ["nl"]="sortering",
+ ["pe"]="ترتیب‌تایپ",
+ ["ro"]="sorttype",
+ },
+ ["source"]={
+ ["cs"]="zdroj",
+ ["de"]="quelle",
+ ["en"]="source",
+ ["fr"]="origine",
+ ["it"]="origine",
+ ["nl"]="bron",
+ ["pe"]="منبع",
+ ["ro"]="sursa",
+ },
+ ["space"]={
+ ["cs"]="mezera",
+ ["de"]="spatium",
+ ["en"]="space",
+ ["fr"]="espace",
+ ["it"]="spazio",
+ ["nl"]="spatie",
+ ["pe"]="Ùضا",
+ ["ro"]="spatiu",
+ },
+ ["spaceafter"]={
+ ["cs"]="mezeraza",
+ ["de"]="nachspatium",
+ ["en"]="spaceafter",
+ ["fr"]="espaceapres",
+ ["it"]="spaziodopo",
+ ["nl"]="nawit",
+ ["pe"]="Ùضا‌بعداز",
+ ["ro"]="spatiudupa",
+ },
+ ["spacebefore"]={
+ ["cs"]="mezerapred",
+ ["de"]="vorspatium",
+ ["en"]="spacebefore",
+ ["fr"]="espaceavant",
+ ["it"]="spazioprima",
+ ["nl"]="voorwit",
+ ["pe"]="Ùضا‌قبل‌از",
+ ["ro"]="spatiuinainte",
+ },
+ ["spaceinbetween"]={
+ ["cs"]="spaceinbetween",
+ ["de"]="spaceinbetween",
+ ["en"]="spaceinbetween",
+ ["fr"]="spaceinbetween",
+ ["it"]="spaceinbetween",
+ ["nl"]="tussenwit",
+ ["pe"]="Ùضا‌دربین",
+ ["ro"]="spaceinbetween",
+ },
+ ["spacing"]={
+ ["cs"]="mezerovani",
+ ["de"]="spatiumausgleich",
+ ["en"]="spacing",
+ ["fr"]="espacement",
+ ["it"]="spaziatura",
+ ["nl"]="spatiering",
+ ["pe"]="Ùضاگذاری",
+ ["ro"]="spatiere",
+ },
+ ["split"]={
+ ["cs"]="split",
+ ["de"]="split",
+ ["en"]="split",
+ ["fr"]="split",
+ ["it"]="separa",
+ ["nl"]="splitsen",
+ ["pe"]="شکاÙتن",
+ ["ro"]="split",
+ },
+ ["splitcolor"]={
+ ["cs"]="splitcolor",
+ ["de"]="splitcolor",
+ ["en"]="splitcolor",
+ ["fr"]="splitcolor",
+ ["it"]="splitcolor",
+ ["nl"]="splitskleur",
+ ["pe"]="شکاÙتن‌رنگ",
+ ["ro"]="splitcolor",
+ },
+ ["splitmethod"]={
+ ["cs"]="splitmethod",
+ ["de"]="splitmethod",
+ ["en"]="splitmethod",
+ ["fr"]="splitmethod",
+ ["it"]="splitmethod",
+ ["nl"]="splitsmethode",
+ ["pe"]="روش‌شکاÙتن",
+ ["ro"]="splitmethod",
+ },
+ ["splitoffset"]={
+ ["cs"]="splitoffset",
+ ["de"]="splitoffset",
+ ["en"]="splitoffset",
+ ["fr"]="splitoffset",
+ ["it"]="splitoffset",
+ ["nl"]="splitsoffset",
+ ["pe"]="شکاÙتن‌آÙست",
+ ["ro"]="splitoffset",
+ },
+ ["spot"]={
+ ["cs"]="spot",
+ ["de"]="spot",
+ ["en"]="spot",
+ ["fr"]="spot",
+ ["it"]="spot",
+ ["nl"]="spot",
+ ["pe"]="Ù„Ú©Ù‡",
+ ["ro"]="spot",
+ },
+ ["stack"]={
+ ["cs"]="stack",
+ ["de"]="stack",
+ ["en"]="stack",
+ ["fr"]="stack",
+ ["it"]="stack",
+ ["nl"]="stapel",
+ ["pe"]="توده",
+ ["ro"]="stack",
+ },
+ ["start"]={
+ ["cs"]="start",
+ ["de"]="start",
+ ["en"]="start",
+ ["fr"]="demarre",
+ ["it"]="inizia",
+ ["nl"]="start",
+ ["pe"]="شروع",
+ ["ro"]="start",
+ },
+ ["state"]={
+ ["cs"]="status",
+ ["de"]="status",
+ ["en"]="state",
+ ["fr"]="etat",
+ ["it"]="stato",
+ ["nl"]="status",
+ ["pe"]="وضعیت",
+ ["ro"]="stare",
+ },
+ ["step"]={
+ ["cs"]="krok",
+ ["de"]="schritt",
+ ["en"]="step",
+ ["fr"]="pas",
+ ["it"]="passo",
+ ["nl"]="stap",
+ ["pe"]="گام",
+ ["ro"]="pas",
+ },
+ ["stop"]={
+ ["cs"]="stop",
+ ["de"]="stop",
+ ["en"]="stop",
+ ["fr"]="stoppe",
+ ["it"]="termina",
+ ["nl"]="stop",
+ ["pe"]="پایان",
+ ["ro"]="stop",
+ },
+ ["stopper"]={
+ ["cs"]="predel",
+ ["de"]="abschnitttrenner",
+ ["en"]="stopper",
+ ["fr"]="taquet",
+ ["it"]="stopper",
+ ["nl"]="afsluiter",
+ ["pe"]="ایست",
+ ["ro"]="stopper",
+ },
+ ["stretch"]={
+ ["cs"]="natahnout",
+ ["de"]="strecken",
+ ["en"]="stretch",
+ ["fr"]="etire",
+ ["it"]="dilata",
+ ["nl"]="rek",
+ ["pe"]="کشیدن",
+ ["ro"]="dilatat",
+ },
+ ["strut"]={
+ ["cs"]="strut",
+ ["de"]="strut",
+ ["en"]="strut",
+ ["fr"]="strut",
+ ["it"]="strut",
+ ["nl"]="strut",
+ ["pe"]="بست",
+ ["ro"]="strut",
+ },
+ ["style"]={
+ ["cs"]="pismeno",
+ ["de"]="stil",
+ ["en"]="style",
+ ["fr"]="style",
+ ["it"]="stile",
+ ["nl"]="letter",
+ ["pe"]="سبک",
+ ["ro"]="stil",
+ },
+ ["sub"]={
+ ["cs"]="pod",
+ ["de"]="unter",
+ ["en"]="sub",
+ ["fr"]="sous",
+ ["it"]="sotto",
+ ["nl"]="sub",
+ ["pe"]="زیر",
+ ["ro"]="sub",
+ },
+ ["subtitle"]={
+ ["cs"]="podtitulek",
+ ["de"]="untertitel",
+ ["en"]="subtitle",
+ ["fr"]="soustitre",
+ ["it"]="sottotitolo",
+ ["nl"]="subtitel",
+ ["pe"]="زیرعنوان",
+ ["ro"]="subtitlu",
+ },
+ ["suffix"]={
+ ["cs"]="suffix",
+ ["de"]="suffix",
+ ["en"]="suffix",
+ ["fr"]="suffix",
+ ["it"]="suffix",
+ ["nl"]="suffix",
+ ["pe"]="پسوند",
+ ["ro"]="suffix",
+ },
+ ["sx"]={
+ ["cs"]="sx",
+ ["de"]="sx",
+ ["en"]="sx",
+ ["fr"]="sx",
+ ["it"]="sx",
+ ["nl"]="sx",
+ ["pe"]="sx",
+ ["ro"]="sx",
+ },
+ ["sy"]={
+ ["cs"]="sy",
+ ["de"]="sy",
+ ["en"]="sy",
+ ["fr"]="sy",
+ ["it"]="sy",
+ ["nl"]="sy",
+ ["pe"]="sy",
+ ["ro"]="sy",
+ },
+ ["symalign"]={
+ ["cs"]="symzarovnani",
+ ["de"]="symausrichtung",
+ ["en"]="symalign",
+ ["fr"]="symalignement",
+ ["it"]="symallinea",
+ ["nl"]="symuitlijnen",
+ ["pe"]="تنظیم‌نماد",
+ ["ro"]="symaliniere",
+ },
+ ["symbol"]={
+ ["cs"]="symbol",
+ ["de"]="symbol",
+ ["en"]="symbol",
+ ["fr"]="symbole",
+ ["it"]="simbolo",
+ ["nl"]="symbool",
+ ["pe"]="نماد",
+ ["ro"]="simbol",
+ },
+ ["symbolset"]={
+ ["cs"]="sadasymbolu",
+ ["de"]="symbolset",
+ ["en"]="symbolset",
+ ["fr"]="jeusymbole",
+ ["it"]="setsimboli",
+ ["nl"]="symboolset",
+ ["pe"]="مجموعه‌نماد",
+ ["ro"]="setsimbol",
+ },
+ ["symcolor"]={
+ ["cs"]="barvasymbolu",
+ ["de"]="symfarbe",
+ ["en"]="symcolor",
+ ["fr"]="couleursym",
+ ["it"]="coloresimbolo",
+ ["nl"]="symkleur",
+ ["pe"]="رنگ‌نماد",
+ ["ro"]="culoaresimbol",
+ },
+ ["symstyle"]={
+ ["cs"]="stylsymboly",
+ ["de"]="symstil",
+ ["en"]="symstyle",
+ ["fr"]="stylesym",
+ ["it"]="stilesimbolo",
+ ["nl"]="symletter",
+ ["pe"]="سبک‌نماد",
+ ["ro"]="stilsimbol",
+ },
+ ["synonym"]={
+ ["cs"]="synonymum",
+ ["de"]="synonym",
+ ["en"]="synonym",
+ ["fr"]="synonyme",
+ ["it"]="sinonimo",
+ ["nl"]="synoniem",
+ ["pe"]="مترادÙ",
+ ["ro"]="sinonim",
+ },
+ ["synonymcolor"]={
+ ["cs"]="barvasynonyma",
+ ["de"]="synonymfarbe",
+ ["en"]="synonymcolor",
+ ["fr"]="couleursynonyme",
+ ["it"]="coloresinonimi",
+ ["nl"]="synoniemkleur",
+ ["pe"]="رنگ‌مترادÙ",
+ ["ro"]="culoaresinonim",
+ },
+ ["synonymstyle"]={
+ ["cs"]="stylsynonyma",
+ ["de"]="synonymstil",
+ ["en"]="synonymstyle",
+ ["fr"]="stylesynonyme",
+ ["it"]="stilesinonimi",
+ ["nl"]="synoniemletter",
+ ["pe"]="سبک‌مترادÙ",
+ ["ro"]="stilsinonim",
+ },
+ ["tab"]={
+ ["cs"]="tab",
+ ["de"]="tab",
+ ["en"]="tab",
+ ["fr"]="tab",
+ ["it"]="tab",
+ ["nl"]="tab",
+ ["pe"]="تب",
+ ["ro"]="tab",
+ },
+ ["text"]={
+ ["cs"]="text",
+ ["de"]="text",
+ ["en"]="text",
+ ["fr"]="texte",
+ ["it"]="testo",
+ ["nl"]="tekst",
+ ["pe"]="متن",
+ ["ro"]="text",
+ },
+ ["textcolor"]={
+ ["cs"]="barvatextu",
+ ["de"]="textfarbe",
+ ["en"]="textcolor",
+ ["fr"]="couleurtexte",
+ ["it"]="coloretesto",
+ ["nl"]="tekstkleur",
+ ["pe"]="رنگ‌متن",
+ ["ro"]="culoaretext",
+ },
+ ["textcommand"]={
+ ["cs"]="textovyprikaz",
+ ["de"]="textbefehl",
+ ["en"]="textcommand",
+ ["fr"]="commandetexte",
+ ["it"]="comandotesto",
+ ["nl"]="tekstcommando",
+ ["pe"]="Ùرمان‌متن",
+ ["ro"]="comandatext",
+ },
+ ["textdistance"]={
+ ["cs"]="textdistance",
+ ["de"]="textdistance",
+ ["en"]="textdistance",
+ ["fr"]="distancetexte",
+ ["it"]="distanzatesto",
+ ["nl"]="tekstafstand",
+ ["pe"]="Ùاصله‌متن",
+ ["ro"]="textdistance",
+ },
+ ["textlayer"]={
+ ["cs"]="textlayer",
+ ["de"]="textlayer",
+ ["en"]="textlayer",
+ ["fr"]="calquetexte",
+ ["it"]="textlayer",
+ ["nl"]="tekstlaag",
+ ["pe"]="لایه‌متن",
+ ["ro"]="textlayer",
+ },
+ ["textmargin"]={
+ ["cs"]="textmargin",
+ ["de"]="textmargin",
+ ["en"]="textmargin",
+ ["fr"]="margetexte",
+ ["it"]="textmargin",
+ ["nl"]="tekstmarge",
+ ["pe"]="Øاشیه‌متن",
+ ["ro"]="textmargin",
+ },
+ ["textmethod"]={
+ ["cs"]="textmethod",
+ ["de"]="textmethod",
+ ["en"]="textmethod",
+ ["fr"]="textmethod",
+ ["it"]="textmethod",
+ ["nl"]="tekstmethode",
+ ["pe"]="روش‌متن",
+ ["ro"]="textmethod",
+ },
+ ["textseparator"]={
+ ["cs"]="oddelovactextu",
+ ["de"]="textseparator",
+ ["en"]="textseparator",
+ ["fr"]="separateurtexte",
+ ["it"]="separatoretesto",
+ ["nl"]="tekstscheider",
+ ["pe"]="جداکننده‌متن",
+ ["ro"]="separatortext",
+ },
+ ["textsize"]={
+ ["cs"]="velikosttextu",
+ ["de"]="textgroesse",
+ ["en"]="textsize",
+ ["fr"]="tailletexte",
+ ["it"]="dimensionetesto",
+ ["nl"]="tekstformaat",
+ ["pe"]="اندازه‌متن",
+ ["ro"]="dimensiunetext",
+ },
+ ["textstate"]={
+ ["cs"]="statustextu",
+ ["de"]="textstatus",
+ ["en"]="textstate",
+ ["fr"]="etattexte",
+ ["it"]="statotesto",
+ ["nl"]="tekststatus",
+ ["pe"]="وضعیت‌متن",
+ ["ro"]="staretext",
+ },
+ ["textstyle"]={
+ ["cs"]="styltextu",
+ ["de"]="textstil",
+ ["en"]="textstyle",
+ ["fr"]="styletexte",
+ ["it"]="stiletesto",
+ ["nl"]="tekstletter",
+ ["pe"]="سبک‌متن",
+ ["ro"]="stiltext",
+ },
+ ["textwidth"]={
+ ["cs"]="sirkatextu",
+ ["de"]="textbreite",
+ ["en"]="textwidth",
+ ["fr"]="largeurtexte",
+ ["it"]="ampiezzatesto",
+ ["nl"]="tekstbreedte",
+ ["pe"]="عرض‌متن",
+ ["ro"]="latimetext",
+ },
+ ["title"]={
+ ["cs"]="titul",
+ ["de"]="titel",
+ ["en"]="title",
+ ["fr"]="titre",
+ ["it"]="titolo",
+ ["nl"]="titel",
+ ["pe"]="عنوان",
+ ["ro"]="titlu",
+ },
+ ["titlecolor"]={
+ ["cs"]="barvatitulek",
+ ["de"]="titelfarbe",
+ ["en"]="titlecolor",
+ ["fr"]="couleurtitre",
+ ["it"]="coloretitolo",
+ ["nl"]="titelkleur",
+ ["pe"]="رنگ‌عنوان",
+ ["ro"]="culoaretitlu",
+ },
+ ["titlecommand"]={
+ ["cs"]="titlecommand",
+ ["de"]="titlecommand",
+ ["en"]="titlecommand",
+ ["fr"]="titlecommand",
+ ["it"]="titlecommand",
+ ["nl"]="titelcommando",
+ ["pe"]="Ùرمان‌عنوان",
+ ["ro"]="titlecommand",
+ },
+ ["titledistance"]={
+ ["cs"]="vzdalenosttitulek",
+ ["de"]="titelabstand",
+ ["en"]="titledistance",
+ ["fr"]="distancetitre",
+ ["it"]="distanzatitolo",
+ ["nl"]="titelafstand",
+ ["pe"]="Ùاصله‌عنوان",
+ ["ro"]="distantatitlu",
+ },
+ ["titleleft"]={
+ ["cs"]="titleleft",
+ ["de"]="titleleft",
+ ["en"]="titleleft",
+ ["fr"]="titleleft",
+ ["it"]="titleleft",
+ ["nl"]="titellinks",
+ ["pe"]="عنوان‌چپ",
+ ["ro"]="titleleft",
+ },
+ ["titleright"]={
+ ["cs"]="titleright",
+ ["de"]="titleright",
+ ["en"]="titleright",
+ ["fr"]="titleright",
+ ["it"]="titleright",
+ ["nl"]="titelrechts",
+ ["pe"]="عنوان‌راست",
+ ["ro"]="titleright",
+ },
+ ["titlestyle"]={
+ ["cs"]="styltitulek",
+ ["de"]="titelstil",
+ ["en"]="titlestyle",
+ ["fr"]="styletitre",
+ ["it"]="stiletitolo",
+ ["nl"]="titelletter",
+ ["pe"]="سبک‌عنوان",
+ ["ro"]="stiltitlu",
+ },
+ ["to"]={
+ ["cs"]="na",
+ ["de"]="zu",
+ ["en"]="to",
+ ["fr"]="vers",
+ ["it"]="verso",
+ ["nl"]="aan",
+ ["pe"]="به",
+ ["ro"]="catre",
+ },
+ ["tolerance"]={
+ ["cs"]="tolerance",
+ ["de"]="toleranz",
+ ["en"]="tolerance",
+ ["fr"]="tolerance",
+ ["it"]="tolleranza",
+ ["nl"]="tolerantie",
+ ["pe"]="بردباری",
+ ["ro"]="toleranta",
+ },
+ ["top"]={
+ ["cs"]="vrsek",
+ ["de"]="oben",
+ ["en"]="top",
+ ["fr"]="sup",
+ ["it"]="cima",
+ ["nl"]="boven",
+ ["pe"]="بالا",
+ ["ro"]="sus",
+ },
+ ["topdistance"]={
+ ["cs"]="vzdalenostvrsku",
+ ["de"]="obenabstand",
+ ["en"]="topdistance",
+ ["fr"]="distancesup",
+ ["it"]="distanzacima",
+ ["nl"]="bovenafstand",
+ ["pe"]="Ùاصله‌بالا",
+ ["ro"]="distantasus",
+ },
+ ["topframe"]={
+ ["cs"]="rameceknahore",
+ ["de"]="obenrahmen",
+ ["en"]="topframe",
+ ["fr"]="cadresup",
+ ["it"]="cornicecima",
+ ["nl"]="bovenkader",
+ ["pe"]="قالب‌راست",
+ ["ro"]="framesus",
+ },
+ ["topoffset"]={
+ ["cs"]="offsetvrsku",
+ ["de"]="obenoffset",
+ ["en"]="topoffset",
+ ["fr"]="decalagesup",
+ ["it"]="offsetcima",
+ ["nl"]="bovenoffset",
+ ["pe"]="Ø¢Ùست‌بالا",
+ ["ro"]="offsetsus",
+ },
+ ["topspace"]={
+ ["cs"]="svrchnimezera",
+ ["de"]="kopfspatium",
+ ["en"]="topspace",
+ ["fr"]="espacesup",
+ ["it"]="spaziocima",
+ ["nl"]="kopwit",
+ ["pe"]="Ùضای‌بالا",
+ ["ro"]="spatiusus",
+ },
+ ["topstate"]={
+ ["cs"]="statusvrsku",
+ ["de"]="statusoben",
+ ["en"]="topstate",
+ ["fr"]="etatsup",
+ ["it"]="statocima",
+ ["nl"]="bovenstatus",
+ ["pe"]="وضعیت‌بالا",
+ ["ro"]="staresus",
+ },
+ ["type"]={
+ ["cs"]="typ",
+ ["de"]="typ",
+ ["en"]="type",
+ ["fr"]="type",
+ ["it"]="type",
+ ["nl"]="type",
+ ["pe"]="تایپ",
+ ["ro"]="type",
+ },
+ ["unit"]={
+ ["cs"]="jednotka",
+ ["de"]="einheit",
+ ["en"]="unit",
+ ["fr"]="unite",
+ ["it"]="unita",
+ ["nl"]="eenheid",
+ ["pe"]="واØد",
+ ["ro"]="unitate",
+ },
+ ["unknownreference"]={
+ ["cs"]="neznamyodkaz",
+ ["de"]="unbekantereferenz",
+ ["en"]="unknownreference",
+ ["fr"]="referenceinconnue",
+ ["it"]="riferimentoingoto",
+ ["nl"]="onbekendeverwijzing",
+ ["pe"]="مرجع‌ناشناس",
+ ["ro"]="referintanecunoscuta",
+ },
+ ["urlalternative"]={
+ ["cs"]="urlalternativa",
+ ["de"]="urlalternative",
+ ["en"]="urlalternative",
+ ["fr"]="alternativeurl",
+ ["it"]="alternativaurl",
+ ["nl"]="urlvariant",
+ ["pe"]="urlalternative",
+ ["ro"]="urlalternativ",
+ },
+ ["urlspace"]={
+ ["cs"]="prostorurl",
+ ["de"]="urlspatium",
+ ["en"]="urlspace",
+ ["fr"]="espaceurl",
+ ["it"]="spaziourl",
+ ["nl"]="urlspatie",
+ ["pe"]="urlspace",
+ ["ro"]="spatiuurl",
+ },
+ ["validate"]={
+ ["cs"]="validovat",
+ ["de"]="validieren",
+ ["en"]="validate",
+ ["fr"]="valider",
+ ["it"]="verifica",
+ ["nl"]="valideer",
+ ["pe"]="تاییداعتبار",
+ ["ro"]="verifica",
+ },
+ ["vcommand"]={
+ ["cs"]="vprikaz",
+ ["de"]="vbefehl",
+ ["en"]="vcommand",
+ ["fr"]="vcommande",
+ ["it"]="vcomando",
+ ["nl"]="vcommando",
+ ["pe"]="vcommand",
+ ["ro"]="comandav",
+ },
+ ["veroffset"]={
+ ["cs"]="offsethlavicky",
+ ["de"]="kopfoffset",
+ ["en"]="veroffset",
+ ["fr"]="veroffset",
+ ["it"]="veroffset",
+ ["nl"]="kopoffset",
+ ["pe"]="Ø¢Ùست‌عم",
+ ["ro"]="veroffset",
+ },
+ ["vfil"]={
+ ["cs"]="vfil",
+ ["de"]="vfil",
+ ["en"]="vfil",
+ ["fr"]="vfil",
+ ["it"]="vfil",
+ ["nl"]="vfil",
+ ["pe"]="vfil",
+ ["ro"]="vfil",
+ },
+ ["voffset"]={
+ ["cs"]="voffset",
+ ["de"]="voffset",
+ ["en"]="voffset",
+ ["fr"]="voffset",
+ ["it"]="voffset",
+ ["nl"]="voffset",
+ ["pe"]="Ø¢Ùست‌ع",
+ ["ro"]="voffset",
+ },
+ ["way"]={
+ ["cs"]="zpusob",
+ ["de"]="art",
+ ["en"]="way",
+ ["fr"]="mode",
+ ["it"]="modo",
+ ["nl"]="wijze",
+ ["pe"]="راه",
+ ["ro"]="mod",
+ },
+ ["wfactor"]={
+ ["cs"]="sfaktor",
+ ["de"]="bfaktor",
+ ["en"]="wfactor",
+ ["fr"]="facteurlargeur",
+ ["it"]="wfactor",
+ ["nl"]="bfactor",
+ ["pe"]="wfactor",
+ ["ro"]="factorw",
+ },
+ ["white"]={
+ ["cs"]="bily",
+ ["de"]="weiss",
+ ["en"]="white",
+ ["fr"]="blanc",
+ ["it"]="bianco",
+ ["nl"]="wit",
+ ["pe"]="سÙید",
+ ["ro"]="alb",
+ },
+ ["width"]={
+ ["cs"]="sirka",
+ ["de"]="breite",
+ ["en"]="width",
+ ["fr"]="largeur",
+ ["it"]="ampiezza",
+ ["nl"]="breedte",
+ ["pe"]="عرض",
+ ["ro"]="latime",
+ },
+ ["xfactor"]={
+ ["cs"]="xfaktor",
+ ["de"]="xfaktor",
+ ["en"]="xfactor",
+ ["fr"]="xfactor",
+ ["it"]="xfactor",
+ ["nl"]="xfactor",
+ ["pe"]="Ùاکتورایکس",
+ ["ro"]="xfactor",
+ },
+ ["xmax"]={
+ ["cs"]="xmax",
+ ["de"]="xmax",
+ ["en"]="xmax",
+ ["fr"]="xmax",
+ ["it"]="xmax",
+ ["nl"]="xmax",
+ ["pe"]="xmax",
+ ["ro"]="xmax",
+ },
+ ["xoffset"]={
+ ["cs"]="xoffset",
+ ["de"]="xoffset",
+ ["en"]="xoffset",
+ ["fr"]="xoffset",
+ ["it"]="xoffset",
+ ["nl"]="xoffset",
+ ["pe"]="Ø¢Ùست‌ایکس",
+ ["ro"]="xoffset",
+ },
+ ["xscale"]={
+ ["cs"]="xmeritko",
+ ["de"]="xformat",
+ ["en"]="xscale",
+ ["fr"]="xscale",
+ ["it"]="xscale",
+ ["nl"]="xschaal",
+ ["pe"]="مقیاس‌ایکس",
+ ["ro"]="xscala",
+ },
+ ["xstep"]={
+ ["cs"]="xkrok",
+ ["de"]="xschritt",
+ ["en"]="xstep",
+ ["fr"]="xstep",
+ ["it"]="xstep",
+ ["nl"]="xstap",
+ ["pe"]="گام‌ایکس",
+ ["ro"]="xstep",
+ },
+ ["yfactor"]={
+ ["cs"]="yfaktor",
+ ["de"]="yfaktor",
+ ["en"]="yfactor",
+ ["fr"]="yfactor",
+ ["it"]="yfactor",
+ ["nl"]="yfactor",
+ ["pe"]="Ùاکتوروای",
+ ["ro"]="yfactor",
+ },
+ ["ymax"]={
+ ["cs"]="ymax",
+ ["de"]="ymax",
+ ["en"]="ymax",
+ ["fr"]="ymax",
+ ["it"]="ymax",
+ ["nl"]="ymax",
+ ["pe"]="ymax",
+ ["ro"]="ymax",
+ },
+ ["yoffset"]={
+ ["cs"]="yoffset",
+ ["de"]="yoffset",
+ ["en"]="yoffset",
+ ["fr"]="yoffset",
+ ["it"]="yoffset",
+ ["nl"]="yoffset",
+ ["pe"]="Ø¢Ùست‌وای",
+ ["ro"]="yoffset",
+ },
+ ["yscale"]={
+ ["cs"]="ymeritko",
+ ["de"]="yformat",
+ ["en"]="yscale",
+ ["fr"]="yscale",
+ ["it"]="yscale",
+ ["nl"]="yschaal",
+ ["pe"]="مقیاس‌وای",
+ ["ro"]="yscala",
+ },
+ ["ystep"]={
+ ["cs"]="ykrok",
+ ["de"]="yschritt",
+ ["en"]="ystep",
+ ["fr"]="ystep",
+ ["it"]="ystep",
+ ["nl"]="ystap",
+ ["pe"]="گام‌وای",
+ ["ro"]="ystep",
+ },
+ },
+ ["elements"]={
+ ["begin"]={
+ ["cs"]="zacatek",
+ ["de"]="anfang",
+ ["en"]="begin",
+ ["fr"]="debut",
+ ["it"]="inizio",
+ ["nl"]="beginvan",
+ ["pe"]="عنصرها",
+ ["ro"]="inceput",
+ },
+ ["complete"]={
+ ["cs"]="uplny",
+ ["de"]="vollende",
+ ["en"]="complete",
+ ["fr"]="complete",
+ ["it"]="completo",
+ ["nl"]="volledige",
+ ["pe"]="کامل",
+ ["ro"]="complet",
+ },
+ ["coupled"]={
+ ["cs"]="propojene",
+ ["de"]="verknuepft",
+ ["en"]="coupled",
+ ["fr"]="couple",
+ ["it"]="accoppiato",
+ ["nl"]="gekoppelde",
+ ["pe"]="مزدوج",
+ ["ro"]="cuplat",
+ },
+ ["currentlocal"]={
+ ["cs"]="aktualnelokalni",
+ ["de"]="aktuelllokal",
+ ["en"]="currentlocal",
+ ["fr"]="localcourant",
+ ["it"]="correntelocale",
+ ["nl"]="huidigelokale",
+ ["pe"]="موضعی‌جاری",
+ ["ro"]="localcurent",
+ },
+ ["emptyone"]={
+ ["cs"]="leer",
+ ["de"]="vuoto",
+ ["en"]="empty",
+ ["fr"]="vide",
+ ["it"]="prazdne",
+ ["nl"]="leeg",
+ ["pe"]="یک‌خالی",
+ ["ro"]="gol",
+ },
+ ["emptytwo"]={
+ ["cs"]="prazdne",
+ ["de"]="leer",
+ ["en"]="empty",
+ ["fr"]="vide",
+ ["it"]="vuoti",
+ ["nl"]="lege",
+ ["pe"]="دوخالی",
+ ["ro"]="gol",
+ },
+ ["end"]={
+ ["cs"]="konec",
+ ["de"]="ende",
+ ["en"]="end",
+ ["fr"]="fin",
+ ["it"]="fine",
+ ["nl"]="eindvan",
+ ["pe"]="انتها",
+ ["ro"]="sfarsit",
+ },
+ ["endsetup"]={
+ ["cs"]="",
+ ["de"]="ein",
+ ["en"]="",
+ ["fr"]="",
+ ["it"]="",
+ ["nl"]="in",
+ ["pe"]="انتهای‌بارگذاری",
+ ["ro"]="",
+ },
+ ["get"]={
+ ["cs"]="ziskat",
+ ["de"]="get",
+ ["en"]="get",
+ ["fr"]="obtient",
+ ["it"]="prendi",
+ ["nl"]="haal",
+ ["pe"]="بگیر",
+ ["ro"]="get",
+ },
+ ["increment"]={
+ ["cs"]="zvysit",
+ ["de"]="erhoehen",
+ ["en"]="increment",
+ ["fr"]="incremente",
+ ["it"]="incrementa",
+ ["nl"]="verhoog",
+ ["pe"]="اÙزایش",
+ ["ro"]="increment",
+ },
+ ["list"]={
+ ["cs"]="seznam",
+ ["de"]="auflisten",
+ ["en"]="list",
+ ["fr"]="liste",
+ ["it"]="elenco",
+ ["nl"]="lijst",
+ ["pe"]="لیست",
+ ["ro"]="lista",
+ },
+ ["listof"]={
+ ["cs"]="seznam",
+ ["de"]="auflistenvon",
+ ["en"]="listof",
+ ["fr"]="listede",
+ ["it"]="elencodi",
+ ["nl"]="lijstmet",
+ ["pe"]="لیست‌از",
+ ["ro"]="listade",
+ },
+ ["load"]={
+ ["cs"]="nacist",
+ ["de"]="laden",
+ ["en"]="load",
+ ["fr"]="charge",
+ ["it"]="carica",
+ ["nl"]="laad",
+ ["pe"]="بارگذاشتن",
+ ["ro"]="incarca",
+ },
+ ["local"]={
+ ["cs"]="lokalne",
+ ["de"]="lokal",
+ ["en"]="local",
+ ["fr"]="local",
+ ["it"]="locale",
+ ["nl"]="lokale",
+ ["pe"]="موضعی",
+ ["ro"]="local",
+ },
+ ["makeup"]={
+ ["cs"]="zlom",
+ ["de"]="umbruch",
+ ["en"]="makeup",
+ ["fr"]="makeup",
+ ["it"]="makeup",
+ ["nl"]="opmaak",
+ ["pe"]="آرایش",
+ ["ro"]="makeup",
+ },
+ ["next"]={
+ ["cs"]="dalsi",
+ ["de"]="folgende",
+ ["en"]="next",
+ ["fr"]="suivant",
+ ["it"]="successivo",
+ ["nl"]="volgende",
+ ["pe"]="بعدی",
+ ["ro"]="urmatorul",
+ },
+ ["place"]={
+ ["cs"]="umisti",
+ ["de"]="platziere",
+ ["en"]="place",
+ ["fr"]="place",
+ ["it"]="metti",
+ ["nl"]="plaats",
+ ["pe"]="مکان",
+ ["ro"]="pune",
+ },
+ ["previous"]={
+ ["cs"]="predchozi",
+ ["de"]="vorige",
+ ["en"]="previous",
+ ["fr"]="precedent",
+ ["it"]="precedente",
+ ["nl"]="vorige",
+ ["pe"]="قبلی",
+ ["ro"]="precedent",
+ },
+ ["previouslocal"]={
+ ["cs"]="predchozilokalni",
+ ["de"]="voriglokal",
+ ["en"]="previouslocal",
+ ["fr"]="localprecedent",
+ ["it"]="precedentelocale",
+ ["nl"]="vorigelokale",
+ ["pe"]="موضع‌قبلی",
+ ["ro"]="precedentlocal",
+ },
+ ["reserve"]={
+ ["cs"]="rezervovat",
+ ["de"]="reservieren",
+ ["en"]="reserve",
+ ["fr"]="reserver",
+ ["it"]="riserva",
+ ["nl"]="reserveer",
+ ["pe"]="رزرو",
+ ["ro"]="rezervat",
+ },
+ ["see"]={
+ ["cs"]="viz",
+ ["de"]="sieh",
+ ["en"]="see",
+ ["fr"]="voit",
+ ["it"]="vedi",
+ ["nl"]="zie",
+ ["pe"]="ببینید",
+ ["ro"]="vezi",
+ },
+ ["setup"]={
+ ["cs"]="nastaveni",
+ ["de"]="stelle",
+ ["en"]="setup",
+ ["fr"]="regle",
+ ["it"]="imposta",
+ ["nl"]="stel",
+ ["pe"]="بارگذاری",
+ ["ro"]="setare",
+ },
+ ["start"]={
+ ["cs"]="start",
+ ["de"]="start",
+ ["en"]="start",
+ ["fr"]="demarre",
+ ["it"]="inizia",
+ ["nl"]="start",
+ ["pe"]="شروع",
+ ["ro"]="start",
+ },
+ ["stop"]={
+ ["cs"]="stop",
+ ["de"]="stop",
+ ["en"]="stop",
+ ["fr"]="stoppe",
+ ["it"]="termina",
+ ["nl"]="stop",
+ ["pe"]="پایان",
+ ["ro"]="stop",
+ },
+ ["text"]={
+ ["cs"]="text",
+ ["de"]="text",
+ ["en"]="text",
+ ["fr"]="texte",
+ ["it"]="testo",
+ ["nl"]="tekst",
+ ["pe"]="متن",
+ ["ro"]="text",
+ },
+ ["type"]={
+ ["cs"]="opis",
+ ["de"]="type",
+ ["en"]="type",
+ ["fr"]="type",
+ ["it"]="type",
+ ["nl"]="type",
+ ["pe"]="تایپ",
+ ["ro"]="type",
+ },
+ },
+ ["variables"]={
+ ["Addition"]={
+ ["cs"]="Pridavek",
+ ["de"]="Zusatz",
+ ["en"]="Addition",
+ ["fr"]="Ajout",
+ ["it"]="Aggiunta",
+ ["nl"]="Toevoeging",
+ ["pe"]="جمع",
+ ["ro"]="Adaugare",
+ },
+ ["Balloon"]={
+ ["cs"]="Bublinka",
+ ["de"]="Ballon",
+ ["en"]="Balloon",
+ ["fr"]="Ballon",
+ ["it"]="Pallone",
+ ["nl"]="Ballon",
+ ["pe"]="بادکنک",
+ ["ro"]="Balon",
+ },
+ ["Character"]={
+ ["cs"]="Pismeno",
+ ["de"]="Buchstabe",
+ ["en"]="Character",
+ ["fr"]="Caratere",
+ ["it"]="Lettera",
+ ["nl"]="Letter",
+ ["pe"]="Character",
+ ["ro"]="Caracter",
+ },
+ ["Characters"]={
+ ["cs"]="Pismena",
+ ["de"]="Buchstaben",
+ ["en"]="Characters",
+ ["fr"]="Caracteres",
+ ["it"]="Lettere",
+ ["nl"]="Letters",
+ ["pe"]="Characters",
+ ["ro"]="Caractere",
+ },
+ ["CloseDocument"]={
+ ["cs"]="ZavritDokument",
+ ["de"]="SchliesseDokument",
+ ["en"]="CloseDocument",
+ ["fr"]="FermeDocument",
+ ["it"]="ChiudiDocumento",
+ ["nl"]="SluitDocument",
+ ["pe"]="بستن‌نوشتار",
+ ["ro"]="InchideDocument",
+ },
+ ["ExitViewer"]={
+ ["cs"]="UkoncitProhlizec",
+ ["de"]="BeendeViewer",
+ ["en"]="ExitViewer",
+ ["fr"]="SortVisualisateur",
+ ["it"]="EsciVisualizzatore",
+ ["nl"]="VerlaatViewer",
+ ["pe"]="خروج‌نمایشگر",
+ ["ro"]="IesireVizualizator",
+ },
+ ["FirstPage"]={
+ ["cs"]="PrvniStrana",
+ ["de"]="ErsteSeite",
+ ["en"]="FirstPage",
+ ["fr"]="PremierePage",
+ ["it"]="PrimaPagina",
+ ["nl"]="EerstePagina",
+ ["pe"]="صÙØه‌اول",
+ ["ro"]="PrimaPagina",
+ },
+ ["FitHeight"]={
+ ["cs"]="FitHeight",
+ ["de"]="HoehePassend",
+ ["en"]="FitHeight",
+ ["fr"]="AjusteHauteur",
+ ["it"]="FitHeight",
+ ["nl"]="HoogtePassend",
+ ["pe"]="پرکردن‌ارتÙاع",
+ ["ro"]="AjustatInaltime",
+ },
+ ["FitWidth"]={
+ ["cs"]="FitWidth",
+ ["de"]="BreitePassend",
+ ["en"]="FitWidth",
+ ["fr"]="AjusteLargeur",
+ ["it"]="FitWidth",
+ ["nl"]="BreedtePassend",
+ ["pe"]="پرکردن‌عرض",
+ ["ro"]="AjustatLatime",
+ },
+ ["GotoPage"]={
+ ["cs"]="JdiNaStranku",
+ ["de"]="GotoPage",
+ ["en"]="GotoPage",
+ ["fr"]="VaalaPage",
+ ["it"]="VaiAPagina",
+ ["nl"]="GaNaarPagina",
+ ["pe"]="برو‌به‌صÙØÙ‡",
+ ["ro"]="LaPagina",
+ },
+ ["Greek"]={
+ ["cs"]="Recky",
+ ["de"]="Griechisch",
+ ["en"]="Greek",
+ ["fr"]="Grec",
+ ["it"]="Greco",
+ ["nl"]="Grieks",
+ ["pe"]="یونانی",
+ ["ro"]="Grec",
+ },
+ ["Help"]={
+ ["cs"]="Napoveda",
+ ["de"]="Hilfe",
+ ["en"]="Help",
+ ["fr"]="Aide",
+ ["it"]="Aiuto",
+ ["nl"]="Help",
+ ["pe"]="Ú©Ù…Ú©",
+ ["ro"]="Ajutor",
+ },
+ ["HideField"]={
+ ["cs"]="SkryjPole",
+ ["de"]="VerbergeFeld",
+ ["en"]="HideField",
+ ["fr"]="CacheChamp",
+ ["it"]="NascondiCampo",
+ ["nl"]="VerbergVeld",
+ ["pe"]="پنهان‌میدان",
+ ["ro"]="AscundeCamp",
+ },
+ ["HideLayer"]={
+ ["cs"]="HideLayer",
+ ["de"]="HideLayer",
+ ["en"]="HideLayer",
+ ["fr"]="CacheCalque",
+ ["it"]="HideLayer",
+ ["nl"]="VerbergLaag",
+ ["pe"]="پنهان‌لایه",
+ ["ro"]="HideLayer",
+ },
+ ["Key"]={
+ ["cs"]="Klavesa",
+ ["de"]="Schluessel",
+ ["en"]="Key",
+ ["fr"]="Cle",
+ ["it"]="Tasto",
+ ["nl"]="Sleutel",
+ ["pe"]="کلید",
+ ["ro"]="Cheie",
+ },
+ ["LastPage"]={
+ ["cs"]="PosledniStrana",
+ ["de"]="LetzteSeite",
+ ["en"]="LastPage",
+ ["fr"]="DernierePage",
+ ["it"]="UltimaPagina",
+ ["nl"]="LaatstePagina",
+ ["pe"]="صÙØه‌آخر",
+ ["ro"]="UltimaPagina",
+ },
+ ["LoadForm"]={
+ ["cs"]="NacistFormular",
+ ["de"]="LadeFormular",
+ ["en"]="LoadForm",
+ ["fr"]="ChargeForm",
+ ["it"]="CaricaForm",
+ ["nl"]="LaadFormulier",
+ ["pe"]="بارگذاشتن‌Ùرم",
+ ["ro"]="IncarcaFormular",
+ },
+ ["MONTH"]={
+ ["cs"]="MESIC",
+ ["de"]="MONAT",
+ ["en"]="MONTH",
+ ["fr"]="MOIS",
+ ["it"]="MESE",
+ ["nl"]="MAAND",
+ ["pe"]="ماه",
+ ["ro"]="LUNA",
+ },
+ ["New"]={
+ ["cs"]="Novy",
+ ["de"]="Neu",
+ ["en"]="New",
+ ["fr"]="Nouveau",
+ ["it"]="Nuovo",
+ ["nl"]="Nieuw",
+ ["pe"]="جدید",
+ ["ro"]="Nou",
+ },
+ ["NextJump"]={
+ ["cs"]="NasledujiciSkok",
+ ["de"]="NaechsterSprung",
+ ["en"]="NextJump",
+ ["fr"]="SautSuivant",
+ ["it"]="SaltoSuccessivo",
+ ["nl"]="VolgendeSprong",
+ ["pe"]="پرش‌بعدی",
+ ["ro"]="SaltUrmator",
+ },
+ ["NextPage"]={
+ ["cs"]="DalsiStrana",
+ ["de"]="FolgendeSeite",
+ ["en"]="NextPage",
+ ["fr"]="PageSuivante",
+ ["it"]="PaginaSuccessiva",
+ ["nl"]="VolgendePagina",
+ ["pe"]="صÙØه‌بعدی",
+ ["ro"]="PaginaUrmatoare",
+ },
+ ["Numbers"]={
+ ["cs"]="Cisla",
+ ["de"]="Ziffern",
+ ["en"]="Numbers",
+ ["fr"]="Numeros",
+ ["it"]="Numeri",
+ ["nl"]="Cijfers",
+ ["pe"]="شماره‌ها",
+ ["ro"]="Numere",
+ },
+ ["OpenNamedDocument"]={
+ ["cs"]="OpenNamedDocument",
+ ["de"]="OpenNamedDocument",
+ ["en"]="OpenNamedDocument",
+ ["fr"]="OuvreDocumentNomme",
+ ["it"]="OpenNamedDocument",
+ ["nl"]="OpenDocumentOpNaam",
+ ["pe"]="بازکردن‌نوشتار‌ذخیره‌شده",
+ ["ro"]="OpenNamedDocument",
+ },
+ ["Paragraph"]={
+ ["cs"]="Odstavec",
+ ["de"]="Absatz",
+ ["en"]="Paragraph",
+ ["fr"]="Paragraphe",
+ ["it"]="Capoverso",
+ ["nl"]="Paragraaf",
+ ["pe"]="پاراگراÙ",
+ ["ro"]="Paragraf",
+ },
+ ["PauseMovie"]={
+ ["cs"]="PozastavitFilm",
+ ["de"]="PauseFilm",
+ ["en"]="PauseMovie",
+ ["fr"]="PauseFilm",
+ ["it"]="PausaFilm",
+ ["nl"]="PauzeerFilm",
+ ["pe"]="ایست‌Ùیلم",
+ ["ro"]="PauzaFilm",
+ },
+ ["PauseRendering"]={
+ ["cs"]="PauseRendering",
+ ["de"]="PauseRendering",
+ ["en"]="PauseRendering",
+ ["fr"]="PauseRendering",
+ ["it"]="PauseRendering",
+ ["nl"]="PauzeerRendering",
+ ["pe"]="توقÙ‌تعبیر",
+ ["ro"]="PauseRendering",
+ },
+ ["PauseSound"]={
+ ["cs"]="PozastavitZvuk",
+ ["de"]="PauseSound",
+ ["en"]="PauseSound",
+ ["fr"]="PauseSon",
+ ["it"]="PausaSuono",
+ ["nl"]="PauzeerGeluid",
+ ["pe"]="ایست‌صدا",
+ ["ro"]="PauzaSunet",
+ },
+ ["PreviousJump"]={
+ ["cs"]="PredchoziSkok",
+ ["de"]="VorigerSprung",
+ ["en"]="PreviousJump",
+ ["fr"]="SautPrecedent",
+ ["it"]="SaltoPrecedente",
+ ["nl"]="VorigeSprong",
+ ["pe"]="پرش‌قبلی",
+ ["ro"]="SaltPrecedent",
+ },
+ ["PreviousPage"]={
+ ["cs"]="PredchoziStrana",
+ ["de"]="VorigeSeite",
+ ["en"]="PreviousPage",
+ ["fr"]="PagePrecedente",
+ ["it"]="PaginaPrecedente",
+ ["nl"]="VorigePagina",
+ ["pe"]="صÙØه‌قبلی",
+ ["ro"]="PaginaPrecedenta",
+ },
+ ["PrintDocument"]={
+ ["cs"]="VytisknoutDokument",
+ ["de"]="DruckeDokument",
+ ["en"]="PrintDocument",
+ ["fr"]="ImprimeDocument",
+ ["it"]="StampaDocumento",
+ ["nl"]="PrintDocument",
+ ["pe"]="چاپ‌نوشتار",
+ ["ro"]="TiparesteDocument",
+ },
+ ["Query"]={
+ ["cs"]="Query",
+ ["de"]="Query",
+ ["en"]="Query",
+ ["fr"]="Query",
+ ["it"]="Richiesta",
+ ["nl"]="RaadpleegDocument",
+ ["pe"]="پرسش",
+ ["ro"]="Query",
+ },
+ ["QueryAgain"]={
+ ["cs"]="QueryAgain",
+ ["de"]="QueryAgain",
+ ["en"]="QueryAgain",
+ ["fr"]="QueryAgain",
+ ["it"]="RinnovaRichiesta",
+ ["nl"]="HerhaalRaadplegen",
+ ["pe"]="پرسش‌دوباره",
+ ["ro"]="QueryAgain",
+ },
+ ["ResetForm"]={
+ ["cs"]="ResetFormulare",
+ ["de"]="ZuruecksetzenFormular",
+ ["en"]="ResetForm",
+ ["fr"]="RazForm",
+ ["it"]="ReimpostaForm",
+ ["nl"]="ResetFormulier",
+ ["pe"]="دوباره‌نشانی‌Ùرم",
+ ["ro"]="ResetareFormular",
+ },
+ ["ResumeMovie"]={
+ ["cs"]="PokracovatFilm",
+ ["de"]="FortsetzenFilm",
+ ["en"]="ResumeMovie",
+ ["fr"]="ReprendFilm",
+ ["it"]="RiprendiFilm",
+ ["nl"]="HervatFilm",
+ ["pe"]="ادامه‌Ùیلم",
+ ["ro"]="RepornesteFilm",
+ },
+ ["ResumeRendering"]={
+ ["cs"]="ResumeRendering",
+ ["de"]="ResumeRendering",
+ ["en"]="ResumeRendering",
+ ["fr"]="ResumeRendering",
+ ["it"]="ResumeRendering",
+ ["nl"]="HervatRendering",
+ ["pe"]="ادامه‌تعبیر",
+ ["ro"]="ResumeRendering",
+ },
+ ["ResumeSound"]={
+ ["cs"]="PokracovatZvuk",
+ ["de"]="ResumeSound",
+ ["en"]="ResumeSound",
+ ["fr"]="ReprendSon",
+ ["it"]="RiprendiSuono",
+ ["nl"]="HervatGeluid",
+ ["pe"]="ادامه‌صدا",
+ ["ro"]="RepornesteSunet",
+ },
+ ["Romannumerals"]={
+ ["cs"]="Rimskecislice",
+ ["de"]="Roemischezahlen",
+ ["en"]="Romannumerals",
+ ["fr"]="Chiffresromains",
+ ["it"]="Numeriromani",
+ ["nl"]="Romeins",
+ ["pe"]="اعداد‌بزرگ‌لاتین",
+ ["ro"]="Numereromane",
+ },
+ ["SaveDocument"]={
+ ["cs"]="UlozitDokument",
+ ["de"]="SpeichereDokument",
+ ["en"]="SaveDocument",
+ ["fr"]="SauvegardeDocument",
+ ["it"]="SalvaDocumento",
+ ["nl"]="BewaarDocument",
+ ["pe"]="ذخیره‌نوشتار",
+ ["ro"]="SalvareDocument",
+ },
+ ["SaveForm"]={
+ ["cs"]="UlozitFormular",
+ ["de"]="SpeicheFormular",
+ ["en"]="SaveForm",
+ ["fr"]="SauvegardeForm",
+ ["it"]="SalvaForm",
+ ["nl"]="BewaarFormulier",
+ ["pe"]="ذخیره‌Ùرم",
+ ["ro"]="SalveazaFormular",
+ },
+ ["SaveNamedDocument"]={
+ ["cs"]="SaveNamedDocument",
+ ["de"]="SaveNamedDocument",
+ ["en"]="SaveNamedDocument",
+ ["fr"]="SauvegardeDocumentNomme",
+ ["it"]="SaveNamedDocument",
+ ["nl"]="BewaarDocumentOpNaam",
+ ["pe"]="ذخیره‌نوشتار‌بانام",
+ ["ro"]="SaveNamedDocument",
+ },
+ ["SearchAgain"]={
+ ["cs"]="HledatZnovu",
+ ["de"]="WeiterSuchen",
+ ["en"]="SearchAgain",
+ ["fr"]="RechercheSuivant",
+ ["it"]="CercaAncora",
+ ["nl"]="HerhaalZoeken",
+ ["pe"]="جستجوی‌دوباره",
+ ["ro"]="CautaDinNou",
+ },
+ ["SearchDocument"]={
+ ["cs"]="ProhledatDokument",
+ ["de"]="DokumentDurchsuchen",
+ ["en"]="SearchDocument",
+ ["fr"]="RechercheDocument",
+ ["it"]="CercaDocumento",
+ ["nl"]="DoorzoekDocument",
+ ["pe"]="جستجوی‌نوشتار",
+ ["ro"]="CautaDocument",
+ },
+ ["ShowBookmarks"]={
+ ["cs"]="UkazZalozky",
+ ["de"]="ShowBookmarks",
+ ["en"]="ShowBookmarks",
+ ["fr"]="ShowBookmarks",
+ ["it"]="MostraSegnalibro",
+ ["nl"]="ShowBookmarks",
+ ["pe"]="نمایش‌چوبخط",
+ ["ro"]="ShowBookmarks",
+ },
+ ["ShowField"]={
+ ["cs"]="UkazPole",
+ ["de"]="ZeigeFeld",
+ ["en"]="ShowField",
+ ["fr"]="MontreChamp",
+ ["it"]="MostraCampo",
+ ["nl"]="ToonVeld",
+ ["pe"]="نمایش‌میدان",
+ ["ro"]="AfiseazaCamp",
+ },
+ ["ShowThumbs"]={
+ ["cs"]="UkazNahledy",
+ ["de"]="ShowThumbs",
+ ["en"]="ShowThumbs",
+ ["fr"]="ShowThumbs",
+ ["it"]="MostraThumbs",
+ ["nl"]="ShowThumbs",
+ ["pe"]="نمایش‌شصت",
+ ["ro"]="ShowThumbs",
+ },
+ ["StartMovie"]={
+ ["cs"]="SpustitFilm",
+ ["de"]="StartFilm",
+ ["en"]="StartMovie",
+ ["fr"]="DemarreFilm",
+ ["it"]="IniziaFilm",
+ ["nl"]="StartFilm",
+ ["pe"]="شروع‌Ùیلم",
+ ["ro"]="StartFilm",
+ },
+ ["StartRendering"]={
+ ["cs"]="StartRendering",
+ ["de"]="StartRendering",
+ ["en"]="StartRendering",
+ ["fr"]="StartRendering",
+ ["it"]="StartRendering",
+ ["nl"]="StartRendering",
+ ["pe"]="شروع‌تعبیر",
+ ["ro"]="StartRendering",
+ },
+ ["StartSound"]={
+ ["cs"]="StartZvuk",
+ ["de"]="StartSound",
+ ["en"]="StartSound",
+ ["fr"]="DemarreSon",
+ ["it"]="IniziaSuono",
+ ["nl"]="StartGeluid",
+ ["pe"]="شروع‌صدا",
+ ["ro"]="StartSunet",
+ },
+ ["StopMovie"]={
+ ["cs"]="ZastavitFilm",
+ ["de"]="StopFilm",
+ ["en"]="StopMovie",
+ ["fr"]="StoppeFilm",
+ ["it"]="FermaFilm",
+ ["nl"]="StopFilm",
+ ["pe"]="پایان‌Ùیلم",
+ ["ro"]="StopFilm",
+ },
+ ["StopRendering"]={
+ ["cs"]="StopRendering",
+ ["de"]="StopRendering",
+ ["en"]="StopRendering",
+ ["fr"]="StopRendering",
+ ["it"]="StopRendering",
+ ["nl"]="StopRendering",
+ ["pe"]="پایان‌تعبیر",
+ ["ro"]="StopRendering",
+ },
+ ["StopSound"]={
+ ["cs"]="StopZvuk",
+ ["de"]="StopSound",
+ ["en"]="StopSound",
+ ["fr"]="StoppeSon",
+ ["it"]="FermaSuono",
+ ["nl"]="StopGeluid",
+ ["pe"]="پایان‌صدا",
+ ["ro"]="StopSunet",
+ },
+ ["SubmitForm"]={
+ ["cs"]="PoslatFormular",
+ ["de"]="VersendeFormular",
+ ["en"]="SubmitForm",
+ ["fr"]="SoumettreForm",
+ ["it"]="MandaForm",
+ ["nl"]="VerzendFormulier",
+ ["pe"]="تسلیم‌Ùرم",
+ ["ro"]="TrimiteFormular",
+ },
+ ["ToggleLayer"]={
+ ["cs"]="ToggleLayer",
+ ["de"]="ToggleLayer",
+ ["en"]="ToggleLayer",
+ ["fr"]="ToggleLayer",
+ ["it"]="ToggleLayer",
+ ["nl"]="WisselLaag",
+ ["pe"]="تغییرلایه",
+ ["ro"]="ToggleLayer",
+ },
+ ["ToggleViewer"]={
+ ["cs"]="ZmenitProhlizec",
+ ["de"]="WechseleViewer",
+ ["en"]="ToggleViewer",
+ ["fr"]="ChangeVisualisateur",
+ ["it"]="ScambiaVisualizzatore",
+ ["nl"]="WisselViewer",
+ ["pe"]="تغییرنمایشگر",
+ ["ro"]="SchimbaVizualizator",
+ },
+ ["URL"]={
+ ["cs"]="URL",
+ ["de"]="URL",
+ ["en"]="URL",
+ ["fr"]="URL",
+ ["it"]="URL",
+ ["nl"]="URL",
+ ["pe"]="URL",
+ ["ro"]="URL",
+ },
+ ["VideLayer"]={
+ ["cs"]="VideLayer",
+ ["de"]="VideLayer",
+ ["en"]="VideLayer",
+ ["fr"]="VideLayer",
+ ["it"]="VideLayer",
+ ["nl"]="ToonLaag",
+ ["pe"]="VideLayer",
+ ["ro"]="VideLayer",
+ },
+ ["ViewerHelp"]={
+ ["cs"]="NapovedaProhlizece",
+ ["de"]="ViewerHilfe",
+ ["en"]="ViewerHelp",
+ ["fr"]="AideVisualisateur",
+ ["it"]="AiutoVisualizzatore",
+ ["nl"]="ViewerHelp",
+ ["pe"]="کمک‌نمایشگر",
+ ["ro"]="AjutorVizualizator",
+ },
+ ["WEEKDAY"]={
+ ["cs"]="VSEDNIDEN",
+ ["de"]="WOCHENTAG",
+ ["en"]="WEEKDAY",
+ ["fr"]="JOURSEMAINE",
+ ["it"]="GIORNOSETTIMANA",
+ ["nl"]="WEEKDAG",
+ ["pe"]="روزهÙته",
+ ["ro"]="ZISAPTAMANA",
+ },
+ ["WORD"]={
+ ["cs"]="SLOVO",
+ ["de"]="WORT",
+ ["en"]="WORD",
+ ["fr"]="MOT",
+ ["it"]="PAROLA",
+ ["nl"]="WOORD",
+ ["pe"]="کلمه",
+ ["ro"]="CUVANT",
+ },
+ ["abbreviation"]={
+ ["cs"]="zkratka",
+ ["de"]="abkuerzung",
+ ["en"]="abbreviation",
+ ["fr"]="abreviation",
+ ["it"]="abbreviazione",
+ ["nl"]="afkorting",
+ ["pe"]="اختصار",
+ ["ro"]="abreviere",
+ },
+ ["abbreviations"]={
+ ["cs"]="zkratky",
+ ["de"]="abkuerzungen",
+ ["en"]="abbreviations",
+ ["fr"]="abreviations",
+ ["it"]="abbreviazioni",
+ ["nl"]="afkortingen",
+ ["pe"]="اختصارات",
+ ["ro"]="abrevieri",
+ },
+ ["absolute"]={
+ ["cs"]="absolutni",
+ ["de"]="absolut",
+ ["en"]="absolute",
+ ["fr"]="absolute",
+ ["it"]="assoluto",
+ ["nl"]="absoluut",
+ ["pe"]="قطعی",
+ ["ro"]="absolut",
+ },
+ ["action"]={
+ ["cs"]="akce",
+ ["de"]="aktion",
+ ["en"]="action",
+ ["fr"]="action",
+ ["it"]="azione",
+ ["nl"]="actie",
+ ["pe"]="کنش",
+ ["ro"]="actiune",
+ },
+ ["after"]={
+ ["cs"]="po",
+ ["de"]="nach",
+ ["en"]="after",
+ ["fr"]="apres",
+ ["it"]="dopo",
+ ["nl"]="na",
+ ["pe"]="بعداز",
+ ["ro"]="dupa",
+ },
+ ["all"]={
+ ["cs"]="vse",
+ ["de"]="alles",
+ ["en"]="all",
+ ["fr"]="tout",
+ ["it"]="tutti",
+ ["nl"]="alles",
+ ["pe"]="همه",
+ ["ro"]="tot",
+ },
+ ["always"]={
+ ["cs"]="vzdy",
+ ["de"]="immer",
+ ["en"]="always",
+ ["fr"]="toujours",
+ ["it"]="sempre",
+ ["nl"]="altijd",
+ ["pe"]="همواره",
+ ["ro"]="totdeauna",
+ },
+ ["appendices"]={
+ ["cs"]="dodatky",
+ ["de"]="anhaenge",
+ ["en"]="appendices",
+ ["fr"]="annexes",
+ ["it"]="appendici",
+ ["nl"]="bijlagen",
+ ["pe"]="پیوستها",
+ ["ro"]="apendixuri",
+ },
+ ["appendix"]={
+ ["cs"]="dodatek",
+ ["de"]="anhang",
+ ["en"]="appendix",
+ ["fr"]="annexe",
+ ["it"]="appendice",
+ ["nl"]="bijlage",
+ ["pe"]="پیوست",
+ ["ro"]="apendix",
+ },
+ ["april"]={
+ ["cs"]="duben",
+ ["de"]="April",
+ ["en"]="April",
+ ["fr"]="avril",
+ ["it"]="aprile",
+ ["nl"]="april",
+ ["pe"]="آوریل",
+ ["ro"]="aprilie",
+ },
+ ["atmargin"]={
+ ["cs"]="naokraji",
+ ["de"]="amrand",
+ ["en"]="atmargin",
+ ["fr"]="alamarge",
+ ["it"]="almargine",
+ ["nl"]="opmarge",
+ ["pe"]="درØاشیه",
+ ["ro"]="lamargine",
+ },
+ ["atpage"]={
+ ["cs"]="nastrance",
+ ["de"]="aufseite",
+ ["en"]="atpage",
+ ["fr"]="alapage",
+ ["it"]="apagina",
+ ["nl"]="oppagina",
+ ["pe"]="درصÙØÙ‡",
+ ["ro"]="lapagina",
+ },
+ ["august"]={
+ ["cs"]="srpen",
+ ["de"]="August",
+ ["en"]="August",
+ ["fr"]="aout",
+ ["it"]="agosto",
+ ["nl"]="augustus",
+ ["pe"]="آگوست",
+ ["ro"]="august",
+ },
+ ["auto"]={
+ ["cs"]="auto",
+ ["de"]="auto",
+ ["en"]="auto",
+ ["fr"]="auto",
+ ["it"]="auto",
+ ["nl"]="auto",
+ ["pe"]="خودکار",
+ ["ro"]="auto",
+ },
+ ["autointro"]={
+ ["cs"]="autouvod",
+ ["de"]="autointro",
+ ["en"]="autointro",
+ ["fr"]="autointro",
+ ["it"]="autointro",
+ ["nl"]="autointro",
+ ["pe"]="پیشگÙتارخودکار",
+ ["ro"]="autointro",
+ },
+ ["back"]={
+ ["cs"]="zpet",
+ ["de"]="zurueck",
+ ["en"]="back",
+ ["fr"]="retour",
+ ["it"]="dietro",
+ ["nl"]="terug",
+ ["pe"]="پشت",
+ ["ro"]="inapot",
+ },
+ ["background"]={
+ ["cs"]="pozadi",
+ ["de"]="hintergrund",
+ ["en"]="background",
+ ["fr"]="arriereplan",
+ ["it"]="sfondo",
+ ["nl"]="achtergrond",
+ ["pe"]="پس‌زمینه",
+ ["ro"]="fundal",
+ },
+ ["backmatter"]={
+ ["cs"]="epilogy",
+ ["de"]="epiloge",
+ ["en"]="backmatter",
+ ["fr"]="epilogue",
+ ["it"]="postambolo",
+ ["nl"]="uitleidingen",
+ ["pe"]="پس‌مطلب",
+ ["ro"]="epilogul",
+ },
+ ["backpart"]={
+ ["cs"]="epilog",
+ ["de"]="epilog",
+ ["en"]="backpart",
+ ["fr"]="postface",
+ ["it"]="postfazione",
+ ["nl"]="uitleiding",
+ ["pe"]="پس‌قسمت",
+ ["ro"]="epilog",
+ },
+ ["backspace"]={
+ ["cs"]="zpetnamezera",
+ ["de"]="rumpfspatium",
+ ["en"]="backspace",
+ ["fr"]="retourarriere",
+ ["it"]="backspace",
+ ["nl"]="rugwit",
+ ["pe"]="Ùضای‌پشت",
+ ["ro"]="spatiuspate",
+ },
+ ["backward"]={
+ ["cs"]="zpet",
+ ["de"]="rueckwaerts",
+ ["en"]="backward",
+ ["fr"]="retourarriere",
+ ["it"]="indietro",
+ ["nl"]="achteruit",
+ ["pe"]="عقب‌گرد",
+ ["ro"]="inapoi",
+ },
+ ["before"]={
+ ["cs"]="pred",
+ ["de"]="vor",
+ ["en"]="before",
+ ["fr"]="avant",
+ ["it"]="prima",
+ ["nl"]="voor",
+ ["pe"]="قبل‌از",
+ ["ro"]="inainte",
+ },
+ ["big"]={
+ ["cs"]="velke",
+ ["de"]="gross",
+ ["en"]="big",
+ ["fr"]="grand",
+ ["it"]="grande",
+ ["nl"]="groot",
+ ["pe"]="بزرگ",
+ ["ro"]="mare",
+ },
+ ["bigbodyfont"]={
+ ["cs"]="bigbodyfont",
+ ["de"]="bigbodyfont",
+ ["en"]="bigbodyfont",
+ ["fr"]="grandepolicecorp",
+ ["it"]="grossofontdeltesto",
+ ["nl"]="grootkorps",
+ ["pe"]="قلم‌بدنه‌بزرگ",
+ ["ro"]="bigbodyfont",
+ },
+ ["bigpreference"]={
+ ["cs"]="vysokapriorita",
+ ["de"]="grosszuegig",
+ ["en"]="bigpreference",
+ ["fr"]="grandepreference",
+ ["it"]="grandepreferenza",
+ ["nl"]="grotevoorkeur",
+ ["pe"]="اولویت‌بزرگ",
+ ["ro"]="preferintamare",
+ },
+ ["blank"]={
+ ["cs"]="prazdny",
+ ["de"]="blanko",
+ ["en"]="blank",
+ ["fr"]="vide",
+ ["it"]="rigovuoto",
+ ["nl"]="blanko",
+ ["pe"]="خالی",
+ ["ro"]="blank",
+ },
+ ["blockquote"]={
+ ["cs"]="blockquote",
+ ["de"]="blockquote",
+ ["en"]="blockquote",
+ ["fr"]="blockquote",
+ ["it"]="blockquote",
+ ["nl"]="blokcitaat",
+ ["pe"]="نقل‌بلوک",
+ ["ro"]="blockquote",
+ },
+ ["bodymatter"]={
+ ["cs"]="hlavnicasti",
+ ["de"]="haupttexte",
+ ["en"]="bodymatter",
+ ["fr"]="texteprincipal",
+ ["it"]="testiprincipali",
+ ["nl"]="hoofdteksten",
+ ["pe"]="مطلب‌بدنه",
+ ["ro"]="principalul",
+ },
+ ["bodypart"]={
+ ["cs"]="hlavnicast",
+ ["de"]="haupttext",
+ ["en"]="bodypart",
+ ["fr"]="corpsdetexte",
+ ["it"]="testoprincipale",
+ ["nl"]="hoofdtekst",
+ ["pe"]="قسمت‌بدنه",
+ ["ro"]="principal",
+ },
+ ["bold"]={
+ ["cs"]="tucne",
+ ["de"]="fett",
+ ["en"]="bold",
+ ["fr"]="gras",
+ ["it"]="grassetto",
+ ["nl"]="vet",
+ ["pe"]="مشکی",
+ ["ro"]="aldin",
+ },
+ ["bolditalic"]={
+ ["cs"]="tucnekurzivni",
+ ["de"]="fettitalic",
+ ["en"]="bolditalic",
+ ["fr"]="italiquegras",
+ ["it"]="grassettocorsivo",
+ ["nl"]="vetitalic",
+ ["pe"]="ایتالیک‌مشکی",
+ ["ro"]="aldinitalic",
+ },
+ ["boldslanted"]={
+ ["cs"]="tucnesklonene",
+ ["de"]="fettgeneigt",
+ ["en"]="boldslanted",
+ ["fr"]="inclinegras",
+ ["it"]="grassettoinclinato",
+ ["nl"]="vetschuin",
+ ["pe"]="خوابیده‌مشکی",
+ ["ro"]="aldininclinat",
+ },
+ ["bookmark"]={
+ ["cs"]="zalozka",
+ ["de"]="bookmark",
+ ["en"]="bookmark",
+ ["fr"]="marquepage",
+ ["it"]="segnalibro",
+ ["nl"]="bookmark",
+ ["pe"]="چوبخط",
+ ["ro"]="semncarte",
+ },
+ ["both"]={
+ ["cs"]="obe",
+ ["de"]="beide",
+ ["en"]="both",
+ ["fr"]="lesdeux",
+ ["it"]="entrambi",
+ ["nl"]="beide",
+ ["pe"]="هردو",
+ ["ro"]="ambele",
+ },
+ ["bottom"]={
+ ["cs"]="spodek",
+ ["de"]="unten",
+ ["en"]="bottom",
+ ["fr"]="inf",
+ ["it"]="fondo",
+ ["nl"]="onder",
+ ["pe"]="پایین",
+ ["ro"]="subsol",
+ },
+ ["brief"]={
+ ["cs"]="brief",
+ ["de"]="brief",
+ ["en"]="brief",
+ ["fr"]="brief",
+ ["it"]="brief",
+ ["nl"]="brief",
+ ["pe"]="مختصر",
+ ["ro"]="brief",
+ },
+ ["broad"]={
+ ["cs"]="siroky",
+ ["de"]="breit",
+ ["en"]="broad",
+ ["fr"]="large",
+ ["it"]="ampio",
+ ["nl"]="ruim",
+ ["pe"]="گسترده",
+ ["ro"]="broad",
+ },
+ ["buffer"]={
+ ["cs"]="buffer",
+ ["de"]="puffer",
+ ["en"]="buffer",
+ ["fr"]="buffer",
+ ["it"]="buffer",
+ ["nl"]="buffer",
+ ["pe"]="باÙر",
+ ["ro"]="buffer",
+ },
+ ["by"]={
+ ["cs"]="skrz",
+ ["de"]="pro",
+ ["en"]="by",
+ ["fr"]="par",
+ ["it"]="da",
+ ["nl"]="per",
+ ["pe"]="بوسیله",
+ ["ro"]="de",
+ },
+ ["calligraphic"]={
+ ["cs"]="kaligraficke",
+ ["de"]="kalligraphie",
+ ["en"]="calligraphic",
+ ["fr"]="calligraphique",
+ ["it"]="calligrafico",
+ ["nl"]="calligrafie",
+ ["pe"]="خوشنویسی",
+ ["ro"]="caligrafic",
+ },
+ ["cap"]={
+ ["cs"]="kap",
+ ["de"]="kap",
+ ["en"]="cap",
+ ["fr"]="cap",
+ ["it"]="cap",
+ ["nl"]="kap",
+ ["pe"]="cap",
+ ["ro"]="cap",
+ },
+ ["capital"]={
+ ["cs"]="kapitalky",
+ ["de"]="versalien",
+ ["en"]="capital",
+ ["fr"]="capitale",
+ ["it"]="maiuscolo",
+ ["nl"]="kapitaal",
+ ["pe"]="capital",
+ ["ro"]="majuscula",
+ },
+ ["center"]={
+ ["cs"]="center",
+ ["de"]="center",
+ ["en"]="center",
+ ["fr"]="center",
+ ["it"]="center",
+ ["nl"]="centreer",
+ ["pe"]="مرکز",
+ ["ro"]="center",
+ },
+ ["chapter"]={
+ ["cs"]="kapitola",
+ ["de"]="kapitel",
+ ["en"]="chapter",
+ ["fr"]="chapitre",
+ ["it"]="capitolo",
+ ["nl"]="hoofdstuk",
+ ["pe"]="Ùصل",
+ ["ro"]="capitol",
+ },
+ ["character"]={
+ ["cs"]="pismeno",
+ ["de"]="buchstabe",
+ ["en"]="character",
+ ["fr"]="caractere",
+ ["it"]="lettera",
+ ["nl"]="letter",
+ ["pe"]="ØرÙ",
+ ["ro"]="caracter",
+ },
+ ["characters"]={
+ ["cs"]="pismena",
+ ["de"]="buchstaben",
+ ["en"]="characters",
+ ["fr"]="caracteres",
+ ["it"]="lettere",
+ ["nl"]="letters",
+ ["pe"]="ØرÙها",
+ ["ro"]="caractere",
+ },
+ ["color"]={
+ ["cs"]="barevne",
+ ["de"]="farbe",
+ ["en"]="color",
+ ["fr"]="couleur",
+ ["it"]="colore",
+ ["nl"]="kleur",
+ ["pe"]="رنگ",
+ ["ro"]="culoare",
+ },
+ ["column"]={
+ ["cs"]="column",
+ ["de"]="column",
+ ["en"]="column",
+ ["fr"]="colonne",
+ ["it"]="colonna",
+ ["nl"]="kolom",
+ ["pe"]="ستون",
+ ["ro"]="coloana",
+ },
+ ["columns"]={
+ ["cs"]="sloupce",
+ ["de"]="spalten",
+ ["en"]="columns",
+ ["fr"]="colonnes",
+ ["it"]="colonne",
+ ["nl"]="kolommen",
+ ["pe"]="ستونها",
+ ["ro"]="coloane",
+ },
+ ["command"]={
+ ["cs"]="prikaz",
+ ["de"]="befehl",
+ ["en"]="command",
+ ["fr"]="commande",
+ ["it"]="comando",
+ ["nl"]="commando",
+ ["pe"]="Ùرمان",
+ ["ro"]="comanda",
+ },
+ ["commands"]={
+ ["cs"]="prikazy",
+ ["de"]="befehle",
+ ["en"]="commands",
+ ["fr"]="commandes",
+ ["it"]="comandi",
+ ["nl"]="commandos",
+ ["pe"]="Ùرمانها",
+ ["ro"]="comenzi",
+ },
+ ["comment"]={
+ ["cs"]="komentar",
+ ["de"]="kommentar",
+ ["en"]="comment",
+ ["fr"]="commentaire",
+ ["it"]="commento",
+ ["nl"]="commentaar",
+ ["pe"]="توضیØ",
+ ["ro"]="comentariu",
+ },
+ ["component"]={
+ ["cs"]="komponenta",
+ ["de"]="komponente",
+ ["en"]="component",
+ ["fr"]="composant",
+ ["it"]="componente",
+ ["nl"]="onderdeel",
+ ["pe"]="مولÙÙ‡",
+ ["ro"]="componenta",
+ },
+ ["concept"]={
+ ["cs"]="koncept",
+ ["de"]="konzept",
+ ["en"]="concept",
+ ["fr"]="concept",
+ ["it"]="concetto",
+ ["nl"]="concept",
+ ["pe"]="Ù…Ùهوم",
+ ["ro"]="concept",
+ },
+ ["content"]={
+ ["cs"]="obsah",
+ ["de"]="inhalt",
+ ["en"]="content",
+ ["fr"]="contenu",
+ ["it"]="indice",
+ ["nl"]="inhoud",
+ ["pe"]="Ù…Øتوا",
+ ["ro"]="cuprins",
+ },
+ ["contents"]={
+ ["cs"]="obsah",
+ ["de"]="inhalte",
+ ["en"]="contents",
+ ["fr"]="contenus",
+ ["it"]="indici",
+ ["nl"]="inhouden",
+ ["pe"]="Ù…Øتویات",
+ ["ro"]="cuprinsuri",
+ },
+ ["continue"]={
+ ["cs"]="pokracovat",
+ ["de"]="fortsetzten",
+ ["en"]="continue",
+ ["fr"]="continue",
+ ["it"]="continua",
+ ["nl"]="verder",
+ ["pe"]="ادامه",
+ ["ro"]="continuu",
+ },
+ ["controls"]={
+ ["cs"]="controls",
+ ["de"]="controls",
+ ["en"]="controls",
+ ["fr"]="controles",
+ ["it"]="controlli",
+ ["nl"]="sturing",
+ ["pe"]="کنترلها",
+ ["ro"]="controale",
+ },
+ ["conversion"]={
+ ["cs"]="konverze",
+ ["de"]="konversion",
+ ["en"]="conversion",
+ ["fr"]="conversion",
+ ["it"]="coversione",
+ ["nl"]="conversie",
+ ["pe"]="تبدیل",
+ ["ro"]="conversie",
+ },
+ ["current"]={
+ ["cs"]="aktualni",
+ ["de"]="aktuell",
+ ["en"]="current",
+ ["fr"]="courant",
+ ["it"]="corrente",
+ ["nl"]="huidige",
+ ["pe"]="جاری",
+ ["ro"]="curent",
+ },
+ ["cutspace"]={
+ ["cs"]="cutspace",
+ ["de"]="cutspace",
+ ["en"]="cutspace",
+ ["fr"]="cutspace",
+ ["it"]="cutspace",
+ ["nl"]="snijwit",
+ ["pe"]="Ùضای‌برش",
+ ["ro"]="cutspace",
+ },
+ ["date"]={
+ ["cs"]="datum",
+ ["de"]="datum",
+ ["en"]="date",
+ ["fr"]="date",
+ ["it"]="data",
+ ["nl"]="datum",
+ ["pe"]="تاریخ",
+ ["ro"]="data",
+ },
+ ["day"]={
+ ["cs"]="den",
+ ["de"]="tag",
+ ["en"]="day",
+ ["fr"]="jour",
+ ["it"]="giorno",
+ ["nl"]="dag",
+ ["pe"]="روز",
+ ["ro"]="zi",
+ },
+ ["december"]={
+ ["cs"]="prosinec",
+ ["de"]="Dezember",
+ ["en"]="December",
+ ["fr"]="decembre",
+ ["it"]="dicembre",
+ ["nl"]="december",
+ ["pe"]="دسامبر",
+ ["ro"]="decembrie",
+ },
+ ["default"]={
+ ["cs"]="implicitni",
+ ["de"]="default",
+ ["en"]="default",
+ ["fr"]="defaut",
+ ["it"]="implicito",
+ ["nl"]="default",
+ ["pe"]="پیش‌Ùرض",
+ ["ro"]="implicit",
+ },
+ ["depth"]={
+ ["cs"]="podlehloubky",
+ ["de"]="tiefe",
+ ["en"]="depth",
+ ["fr"]="profondeur",
+ ["it"]="profondita",
+ ["nl"]="diepte",
+ ["pe"]="عمق",
+ ["ro"]="adancime",
+ },
+ ["description"]={
+ ["cs"]="popis",
+ ["de"]="beschreibung",
+ ["en"]="description",
+ ["fr"]="description",
+ ["it"]="descrizione",
+ ["nl"]="doordefinitie",
+ ["pe"]="شرØ",
+ ["ro"]="descriere",
+ },
+ ["disable"]={
+ ["cs"]="zablokovat",
+ ["de"]="sperren",
+ ["en"]="disable",
+ ["fr"]="desactiver",
+ ["it"]="disattiva",
+ ["nl"]="blokkeer",
+ ["pe"]="ناتوان",
+ ["ro"]="dezactivat",
+ },
+ ["display"]={
+ ["cs"]="obrazovka",
+ ["de"]="bildschirm",
+ ["en"]="display",
+ ["fr"]="affichage",
+ ["it"]="schermo",
+ ["nl"]="scherm",
+ ["pe"]="نمایش",
+ ["ro"]="display",
+ },
+ ["dot"]={
+ ["cs"]="tecka",
+ ["de"]="punkt",
+ ["en"]="dot",
+ ["fr"]="point",
+ ["it"]="punto",
+ ["nl"]="punt",
+ ["pe"]="نقطه",
+ ["ro"]="punct",
+ },
+ ["doublesided"]={
+ ["cs"]="dvoustranny",
+ ["de"]="doppelseitig",
+ ["en"]="doublesided",
+ ["fr"]="rectoverso",
+ ["it"]="doppiafaccia",
+ ["nl"]="dubbelzijdig",
+ ["pe"]="دورو",
+ ["ro"]="douafete",
+ },
+ ["each"]={
+ ["cs"]="kazdy",
+ ["de"]="jede",
+ ["en"]="each",
+ ["fr"]="chaque",
+ ["it"]="ogni",
+ ["nl"]="elk",
+ ["pe"]="هر",
+ ["ro"]="fiecare",
+ },
+ ["edge"]={
+ ["cs"]="hrana",
+ ["de"]="kante",
+ ["en"]="edge",
+ ["fr"]="bord",
+ ["it"]="bordo",
+ ["nl"]="rand",
+ ["pe"]="لبه",
+ ["ro"]="bordura",
+ },
+ ["empty"]={
+ ["cs"]="prazdne",
+ ["de"]="leer",
+ ["en"]="empty",
+ ["fr"]="vide",
+ ["it"]="vuoto",
+ ["nl"]="leeg",
+ ["pe"]="تهی",
+ ["ro"]="gol",
+ },
+ ["endnote"]={
+ ["cs"]="endnote",
+ ["de"]="endnote",
+ ["en"]="endnote",
+ ["fr"]="notefin",
+ ["it"]="endnote",
+ ["nl"]="eindnoot",
+ ["pe"]="ته‌نوشت",
+ ["ro"]="endnote",
+ },
+ ["enumeration"]={
+ ["cs"]="vycet",
+ ["de"]="nummerierung",
+ ["en"]="enumeration",
+ ["fr"]="enumeration",
+ ["it"]="enumerazione",
+ ["nl"]="doornummering",
+ ["pe"]="شماره‌بندی",
+ ["ro"]="enumerare",
+ },
+ ["environment"]={
+ ["cs"]="prostredi",
+ ["de"]="umgebung",
+ ["en"]="environment",
+ ["fr"]="environement",
+ ["it"]="ambiente",
+ ["nl"]="omgeving",
+ ["pe"]="Ù…Øیط",
+ ["ro"]="mediu",
+ },
+ ["even"]={
+ ["cs"]="sude",
+ ["de"]="gerade",
+ ["en"]="even",
+ ["fr"]="paire",
+ ["it"]="pari",
+ ["nl"]="even",
+ ["pe"]="زوج",
+ ["ro"]="par",
+ },
+ ["external"]={
+ ["cs"]="externi",
+ ["de"]="extern",
+ ["en"]="external",
+ ["fr"]="external",
+ ["it"]="esterno",
+ ["nl"]="extern",
+ ["pe"]="خارجی",
+ ["ro"]="extern",
+ },
+ ["fact"]={
+ ["cs"]="fakt",
+ ["de"]="gegeben",
+ ["en"]="fact",
+ ["fr"]="fait",
+ ["it"]="fatto",
+ ["nl"]="gegeven",
+ ["pe"]="fact",
+ ["ro"]="fapt",
+ },
+ ["february"]={
+ ["cs"]="unor",
+ ["de"]="Februar",
+ ["en"]="February",
+ ["fr"]="fevrier",
+ ["it"]="febbraio",
+ ["nl"]="februari",
+ ["pe"]="Ùوریه",
+ ["ro"]="februarie",
+ },
+ ["figure"]={
+ ["cs"]="obrazek",
+ ["de"]="abbildung",
+ ["en"]="figure",
+ ["fr"]="figure",
+ ["it"]="figura",
+ ["nl"]="figuur",
+ ["pe"]="Ø´Ú©Ù„",
+ ["ro"]="figura",
+ },
+ ["figures"]={
+ ["cs"]="obrazky",
+ ["de"]="abbildungen",
+ ["en"]="figures",
+ ["fr"]="figures",
+ ["it"]="figure",
+ ["nl"]="figuren",
+ ["pe"]="شکلها",
+ ["ro"]="figure",
+ },
+ ["file"]={
+ ["cs"]="soubor",
+ ["de"]="datei",
+ ["en"]="file",
+ ["fr"]="fichier",
+ ["it"]="file",
+ ["nl"]="file",
+ ["pe"]="پرونده",
+ ["ro"]="fisier",
+ },
+ ["final"]={
+ ["cs"]="finalni",
+ ["de"]="endfassung",
+ ["en"]="final",
+ ["fr"]="final",
+ ["it"]="finale",
+ ["nl"]="definitief",
+ ["pe"]="نهایی",
+ ["ro"]="final",
+ },
+ ["first"]={
+ ["cs"]="prvni",
+ ["de"]="erste",
+ ["en"]="first",
+ ["fr"]="premier",
+ ["it"]="primo",
+ ["nl"]="eerste",
+ ["pe"]="اولی",
+ ["ro"]="primul",
+ },
+ ["firstcolumn"]={
+ ["cs"]="firstcolumn",
+ ["de"]="firstcolumn",
+ ["en"]="firstcolumn",
+ ["fr"]="premierecolonne",
+ ["it"]="firstcolumn",
+ ["nl"]="eerstekolom",
+ ["pe"]="ستون‌اول",
+ ["ro"]="firstcolumn",
+ },
+ ["firstpage"]={
+ ["cs"]="prvnistranka",
+ ["de"]="ersteseite",
+ ["en"]="firstpage",
+ ["fr"]="premierepage",
+ ["it"]="primapagina",
+ ["nl"]="eerstepagina",
+ ["pe"]="صÙØه‌اول",
+ ["ro"]="primapagina",
+ },
+ ["firstsubpage"]={
+ ["cs"]="prvnipodstranka",
+ ["de"]="ersteunterseite",
+ ["en"]="firstsubpage",
+ ["fr"]="premieresouspage",
+ ["it"]="primasottopagina",
+ ["nl"]="eerstesubpagina",
+ ["pe"]="زیرصÙØه‌اول",
+ ["ro"]="primasubpagina",
+ },
+ ["fit"]={
+ ["cs"]="prizpusobive",
+ ["de"]="passend",
+ ["en"]="fit",
+ ["fr"]="adapte",
+ ["it"]="adatta",
+ ["nl"]="passend",
+ ["pe"]="پرکردن",
+ ["ro"]="ajustat",
+ },
+ ["five"]={
+ ["cs"]="pet",
+ ["de"]="fuenf",
+ ["en"]="five",
+ ["fr"]="cinq",
+ ["it"]="cinque",
+ ["nl"]="vijf",
+ ["pe"]="پنج",
+ ["ro"]="cinci",
+ },
+ ["fix"]={
+ ["cs"]="fixuj",
+ ["de"]="stellewiederher",
+ ["en"]="fix",
+ ["fr"]="fixe",
+ ["it"]="fisso",
+ ["nl"]="herstel",
+ ["pe"]="ثابت‌کن",
+ ["ro"]="fix",
+ },
+ ["fixed"]={
+ ["cs"]="fixne",
+ ["de"]="fest",
+ ["en"]="fixed",
+ ["fr"]="fixe",
+ ["it"]="fisso",
+ ["nl"]="vast",
+ ["pe"]="ثابت",
+ ["ro"]="fixat",
+ },
+ ["flexible"]={
+ ["cs"]="prizpusobive",
+ ["de"]="flexibel",
+ ["en"]="flexible",
+ ["fr"]="flexible",
+ ["it"]="flessibile",
+ ["nl"]="flexibel",
+ ["pe"]="انعطاÙپذیر",
+ ["ro"]="flexibil",
+ },
+ ["float"]={
+ ["cs"]="plvouciobjekt",
+ ["de"]="gleitobjekt",
+ ["en"]="float",
+ ["fr"]="flottant",
+ ["it"]="oggettomobile",
+ ["nl"]="blok",
+ ["pe"]="شناور",
+ ["ro"]="obiectmobil",
+ },
+ ["flushinner"]={
+ ["cs"]="flushinner",
+ ["de"]="flushinner",
+ ["en"]="flushinner",
+ ["fr"]="flushinner",
+ ["it"]="flushinner",
+ ["nl"]="lijnbinnen",
+ ["pe"]="پمپ‌داخلی",
+ ["ro"]="flushinner",
+ },
+ ["flushleft"]={
+ ["cs"]="flushleft",
+ ["de"]="flushleft",
+ ["en"]="flushleft",
+ ["fr"]="flushleft",
+ ["it"]="flushleft",
+ ["nl"]="lijnlinks",
+ ["pe"]="پمپ‌چپ",
+ ["ro"]="flushleft",
+ },
+ ["flushouter"]={
+ ["cs"]="flushouter",
+ ["de"]="flushouter",
+ ["en"]="flushouter",
+ ["fr"]="flushouter",
+ ["it"]="flushouter",
+ ["nl"]="lijnbuiten",
+ ["pe"]="پمپ‌خارجی",
+ ["ro"]="flushouter",
+ },
+ ["flushright"]={
+ ["cs"]="flushright",
+ ["de"]="flushright",
+ ["en"]="flushright",
+ ["fr"]="flushright",
+ ["it"]="flushright",
+ ["nl"]="lijnrechts",
+ ["pe"]="پمپ‌راست",
+ ["ro"]="flushright",
+ },
+ ["footer"]={
+ ["cs"]="upati",
+ ["de"]="fusszeile",
+ ["en"]="footer",
+ ["fr"]="pdp",
+ ["it"]="piedipagina",
+ ["nl"]="voet",
+ ["pe"]="ته‌برگ",
+ ["ro"]="subsol",
+ },
+ ["footnote"]={
+ ["cs"]="poznamkapodcarou",
+ ["de"]="fussnote",
+ ["en"]="footnote",
+ ["fr"]="notepdp",
+ ["it"]="notapdp",
+ ["nl"]="voetnoot",
+ ["pe"]="پانوشت",
+ ["ro"]="notasubsol",
+ },
+ ["force"]={
+ ["cs"]="sila",
+ ["de"]="zwinge",
+ ["en"]="force",
+ ["fr"]="force",
+ ["it"]="forza",
+ ["nl"]="forceer",
+ ["pe"]="اجبار",
+ ["ro"]="fortat",
+ },
+ ["foreground"]={
+ ["cs"]="popredi",
+ ["de"]="vordergrund",
+ ["en"]="foreground",
+ ["fr"]="premierplan",
+ ["it"]="foreground",
+ ["nl"]="voorgrond",
+ ["pe"]="پیش‌زمینه",
+ ["ro"]="primplan",
+ },
+ ["formeel"]={
+ ["cs"]="formeel",
+ ["de"]="formeel",
+ ["en"]="formeel",
+ ["fr"]="formeel",
+ ["it"]="formeel",
+ ["nl"]="formeel",
+ ["pe"]="formeel",
+ ["ro"]="formeel",
+ },
+ ["formula"]={
+ ["cs"]="rovnice",
+ ["de"]="formel",
+ ["en"]="formula",
+ ["fr"]="formule",
+ ["it"]="formula",
+ ["nl"]="formule",
+ ["pe"]="Ùرمول",
+ ["ro"]="formula",
+ },
+ ["formulae"]={
+ ["cs"]="rovnice",
+ ["de"]="formeln",
+ ["en"]="formulae",
+ ["fr"]="formules",
+ ["it"]="formule",
+ ["nl"]="formules",
+ ["pe"]="Ùرمولها",
+ ["ro"]="formule",
+ },
+ ["forward"]={
+ ["cs"]="vpred",
+ ["de"]="vorwaerts",
+ ["en"]="forward",
+ ["fr"]="avance",
+ ["it"]="avanti",
+ ["nl"]="vooruit",
+ ["pe"]="به‌جلو",
+ ["ro"]="avans",
+ },
+ ["four"]={
+ ["cs"]="ctyri",
+ ["de"]="vier",
+ ["en"]="four",
+ ["fr"]="quatre",
+ ["it"]="quattro",
+ ["nl"]="vier",
+ ["pe"]="چهار",
+ ["ro"]="patru",
+ },
+ ["frame"]={
+ ["cs"]="ramecek",
+ ["de"]="rahmen",
+ ["en"]="frame",
+ ["fr"]="cadre",
+ ["it"]="cornice",
+ ["nl"]="kader",
+ ["pe"]="قالب",
+ ["ro"]="incadrat",
+ },
+ ["framedtext"]={
+ ["cs"]="oramovanytext",
+ ["de"]="umrahmtertext",
+ ["en"]="framedtext",
+ ["fr"]="texteencadre",
+ ["it"]="testoincorniciato",
+ ["nl"]="kadertekst",
+ ["pe"]="متن‌قالبی",
+ ["ro"]="textinconjurat",
+ },
+ ["friday"]={
+ ["cs"]="patek",
+ ["de"]="freitag",
+ ["en"]="friday",
+ ["fr"]="vendredi",
+ ["it"]="venerdi",
+ ["nl"]="vrijdag",
+ ["pe"]="جمعه",
+ ["ro"]="vineri",
+ },
+ ["frontmatter"]={
+ ["cs"]="prednicasti",
+ ["de"]="einleitungen",
+ ["en"]="frontmatter",
+ ["fr"]="preambule",
+ ["it"]="preambolo",
+ ["nl"]="inleidingen",
+ ["pe"]="پیش‌مطلب",
+ ["ro"]="prologul",
+ },
+ ["frontpart"]={
+ ["cs"]="prednicast",
+ ["de"]="einleitung",
+ ["en"]="frontpart",
+ ["fr"]="preface",
+ ["it"]="prefazione",
+ ["nl"]="inleiding",
+ ["pe"]="پیش‌قسمت",
+ ["ro"]="prolog",
+ },
+ ["global"]={
+ ["cs"]="globalne",
+ ["de"]="global",
+ ["en"]="global",
+ ["fr"]="global",
+ ["it"]="globale",
+ ["nl"]="globaal",
+ ["pe"]="سراسری",
+ ["ro"]="global",
+ },
+ ["graphic"]={
+ ["cs"]="graf",
+ ["de"]="grafik",
+ ["en"]="graphic",
+ ["fr"]="graphique",
+ ["it"]="grafico",
+ ["nl"]="grafiek",
+ ["pe"]="گراÙیک",
+ ["ro"]="graficul",
+ },
+ ["graphics"]={
+ ["cs"]="grafy",
+ ["de"]="grafiken",
+ ["en"]="graphics",
+ ["fr"]="graphiques",
+ ["it"]="grafici",
+ ["nl"]="grafieken",
+ ["pe"]="گراÙیکها",
+ ["ro"]="graficele",
+ },
+ ["gray"]={
+ ["cs"]="seda",
+ ["de"]="grau",
+ ["en"]="gray",
+ ["fr"]="gris",
+ ["it"]="grigio",
+ ["nl"]="grijs",
+ ["pe"]="خاکستری",
+ ["ro"]="gri",
+ },
+ ["greek"]={
+ ["cs"]="recky",
+ ["de"]="griechisch",
+ ["en"]="greek",
+ ["fr"]="grec",
+ ["it"]="greco",
+ ["nl"]="grieks",
+ ["pe"]="یونانی",
+ ["ro"]="grec",
+ },
+ ["grid"]={
+ ["cs"]="mrizka",
+ ["de"]="gritter",
+ ["en"]="grid",
+ ["fr"]="grille",
+ ["it"]="griglia",
+ ["nl"]="grid",
+ ["pe"]="توری",
+ ["ro"]="grila",
+ },
+ ["halfline"]={
+ ["cs"]="pulradku",
+ ["de"]="halbezeile",
+ ["en"]="halfline",
+ ["fr"]="demiligne",
+ ["it"]="mezzariga",
+ ["nl"]="halveregel",
+ ["pe"]="نیم‌خط",
+ ["ro"]="jumatatelinie",
+ },
+ ["handwritten"]={
+ ["cs"]="rukopisne",
+ ["de"]="handschrift",
+ ["en"]="handwritten",
+ ["fr"]="manuscript",
+ ["it"]="grafiamanuale",
+ ["nl"]="handschrift",
+ ["pe"]="دست‌نوشته",
+ ["ro"]="scrismanual",
+ },
+ ["hang"]={
+ ["cs"]="zaveseni",
+ ["de"]="haengend",
+ ["en"]="hang",
+ ["fr"]="suspend",
+ ["it"]="sospendi",
+ ["nl"]="hang",
+ ["pe"]="بیاویز",
+ ["ro"]="suspenda",
+ },
+ ["hanging"]={
+ ["cs"]="visici",
+ ["de"]="haengend",
+ ["en"]="hanging",
+ ["fr"]="suspend",
+ ["it"]="sospeso",
+ ["nl"]="hangend",
+ ["pe"]="آویزان",
+ ["ro"]="suspendat",
+ },
+ ["head"]={
+ ["cs"]="hlavicka",
+ ["de"]="kopf",
+ ["en"]="head",
+ ["fr"]="tete",
+ ["it"]="testa",
+ ["nl"]="kop",
+ ["pe"]="سر",
+ ["ro"]="antet",
+ },
+ ["header"]={
+ ["cs"]="zahlavi",
+ ["de"]="kopfzeile",
+ ["en"]="header",
+ ["fr"]="entete",
+ ["it"]="intestazione",
+ ["nl"]="hoofd",
+ ["pe"]="سربرگ",
+ ["ro"]="antet",
+ },
+ ["height"]={
+ ["cs"]="vyska",
+ ["de"]="hoehe",
+ ["en"]="height",
+ ["fr"]="hauteur",
+ ["it"]="altezza",
+ ["nl"]="hoogte",
+ ["pe"]="ارتÙاع",
+ ["ro"]="inaltime",
+ },
+ ["helptext"]={
+ ["cs"]="textnapovedy",
+ ["de"]="hilfetext",
+ ["en"]="helptext",
+ ["fr"]="texteaide",
+ ["it"]="testoaiuto",
+ ["nl"]="helptekst",
+ ["pe"]="متن‌کمکی",
+ ["ro"]="textajutator",
+ },
+ ["hencefore"]={
+ ["cs"]="vyse",
+ ["de"]="vorher",
+ ["en"]="hencefore",
+ ["fr"]="precedent",
+ ["it"]="precedente",
+ ["nl"]="hierboven",
+ ["pe"]="hencefore",
+ ["ro"]="precedent",
+ },
+ ["here"]={
+ ["cs"]="zde",
+ ["de"]="hier",
+ ["en"]="here",
+ ["fr"]="ici",
+ ["it"]="qui",
+ ["nl"]="hier",
+ ["pe"]="اینجا",
+ ["ro"]="aici",
+ },
+ ["hereafter"]={
+ ["cs"]="nize",
+ ["de"]="nachher",
+ ["en"]="hereafter",
+ ["fr"]="suivant",
+ ["it"]="seguente",
+ ["nl"]="hieronder",
+ ["pe"]="ازاین‌به‌بعد",
+ ["ro"]="urmator",
+ },
+ ["hidden"]={
+ ["cs"]="skryte",
+ ["de"]="versteckt",
+ ["en"]="hidden",
+ ["fr"]="cache",
+ ["it"]="nascosto",
+ ["nl"]="verborgen",
+ ["pe"]="پنهانی",
+ ["ro"]="ascuns",
+ },
+ ["hiding"]={
+ ["cs"]="skryt",
+ ["de"]="verbergen",
+ ["en"]="hiding",
+ ["fr"]="cache",
+ ["it"]="nascondere",
+ ["nl"]="verbergen",
+ ["pe"]="پنهان‌کردن",
+ ["ro"]="ascundere",
+ },
+ ["high"]={
+ ["cs"]="vysoko",
+ ["de"]="hoch",
+ ["en"]="high",
+ ["fr"]="haut",
+ ["it"]="alto",
+ ["nl"]="hoog",
+ ["pe"]="بلند",
+ ["ro"]="inalt",
+ },
+ ["horizontal"]={
+ ["cs"]="horizontalne",
+ ["de"]="horizontal",
+ ["en"]="horizontal",
+ ["fr"]="horizontale",
+ ["it"]="orizzontale",
+ ["nl"]="horizontaal",
+ ["pe"]="اÙÙ‚ÛŒ",
+ ["ro"]="orizontal",
+ },
+ ["hyphenated"]={
+ ["cs"]="hyphenated",
+ ["de"]="hyphenate",
+ ["en"]="hyphenated",
+ ["fr"]="hyphenated",
+ ["it"]="sillabato",
+ ["nl"]="afgebroken",
+ ["pe"]="شکسته",
+ ["ro"]="despsilabe",
+ },
+ ["hz"]={
+ ["cs"]="hz",
+ ["de"]="hz",
+ ["en"]="hz",
+ ["fr"]="hz",
+ ["it"]="hz",
+ ["nl"]="hz",
+ ["pe"]="hz",
+ ["ro"]="hz",
+ },
+ ["inbetween"]={
+ ["cs"]="mezi",
+ ["de"]="zwischen",
+ ["en"]="inbetween",
+ ["fr"]="entre",
+ ["it"]="tra",
+ ["nl"]="tussen",
+ ["pe"]="دربین",
+ ["ro"]="intre",
+ },
+ ["index"]={
+ ["cs"]="rejstrik",
+ ["de"]="index",
+ ["en"]="index",
+ ["fr"]="index",
+ ["it"]="indiceanalitico",
+ ["nl"]="index",
+ ["pe"]="نمایه",
+ ["ro"]="index",
+ },
+ ["indices"]={
+ ["cs"]="rejstriky",
+ ["de"]="indizies",
+ ["en"]="indices",
+ ["fr"]="indices",
+ ["it"]="indicianalitici",
+ ["nl"]="indices",
+ ["pe"]="نمایه‌ها",
+ ["ro"]="indexuri",
+ },
+ ["informeel"]={
+ ["cs"]="informeel",
+ ["de"]="informeel",
+ ["en"]="informeel",
+ ["fr"]="informeel",
+ ["it"]="informeel",
+ ["nl"]="informeel",
+ ["pe"]="informeel",
+ ["ro"]="informeel",
+ },
+ ["inherit"]={
+ ["cs"]="inherit",
+ ["de"]="inherit",
+ ["en"]="inherit",
+ ["fr"]="herite",
+ ["it"]="inherit",
+ ["nl"]="erf",
+ ["pe"]="ارث‌بردن",
+ ["ro"]="inherit",
+ },
+ ["inleft"]={
+ ["cs"]="vlevo",
+ ["de"]="imlinken",
+ ["en"]="inleft",
+ ["fr"]="dansgauche",
+ ["it"]="insinistra",
+ ["nl"]="inlinker",
+ ["pe"]="درون‌چپ",
+ ["ro"]="instanga",
+ },
+ ["inmargin"]={
+ ["cs"]="naokraji",
+ ["de"]="imrand",
+ ["en"]="inmargin",
+ ["fr"]="dansmarge",
+ ["it"]="inmargine",
+ ["nl"]="inmarge",
+ ["pe"]="درون‌Øاشیه",
+ ["ro"]="inmargine",
+ },
+ ["inner"]={
+ ["cs"]="uvnitr",
+ ["de"]="innen",
+ ["en"]="inner",
+ ["fr"]="interieur",
+ ["it"]="interno",
+ ["nl"]="binnen",
+ ["pe"]="داخلی",
+ ["ro"]="intern",
+ },
+ ["inneredge"]={
+ ["cs"]="inneredge",
+ ["de"]="inneredge",
+ ["en"]="inneredge",
+ ["fr"]="bordinterieur",
+ ["it"]="bordointerno",
+ ["nl"]="binnenrand",
+ ["pe"]="لبه‌داخلی",
+ ["ro"]="inneredge",
+ },
+ ["innermargin"]={
+ ["cs"]="innermargin",
+ ["de"]="innermargin",
+ ["en"]="innermargin",
+ ["fr"]="margeinterieure",
+ ["it"]="margineinterno",
+ ["nl"]="binnenmarge",
+ ["pe"]="Øاشیه‌داخلی",
+ ["ro"]="innermargin",
+ },
+ ["inright"]={
+ ["cs"]="vpravo",
+ ["de"]="imrechten",
+ ["en"]="inright",
+ ["fr"]="dansdroit",
+ ["it"]="indestra",
+ ["nl"]="inrechter",
+ ["pe"]="درون‌راست",
+ ["ro"]="indreapta",
+ },
+ ["interaction"]={
+ ["cs"]="interakce",
+ ["de"]="interaktion",
+ ["en"]="interaction",
+ ["fr"]="interaction",
+ ["it"]="interazione",
+ ["nl"]="interactie",
+ ["pe"]="پانل",
+ ["ro"]="interactiune",
+ },
+ ["interactionmenu"]={
+ ["cs"]="interaktivnimenu",
+ ["de"]="interaktionsmenue",
+ ["en"]="interactionmenu",
+ ["fr"]="menuinteraction",
+ ["it"]="menuinterattivo",
+ ["nl"]="interactiemenu",
+ ["pe"]="منوی‌پانل",
+ ["ro"]="meniuinteractiune",
+ },
+ ["intermezzi"]={
+ ["cs"]="intermezzi",
+ ["de"]="intermezzi",
+ ["en"]="intermezzi",
+ ["fr"]="intermezzi",
+ ["it"]="intermezzi",
+ ["nl"]="intermezzos",
+ ["pe"]="میان‌پرده‌ها",
+ ["ro"]="intermezzi",
+ },
+ ["intermezzo"]={
+ ["cs"]="intermezzo",
+ ["de"]="intermezzo",
+ ["en"]="intermezzo",
+ ["fr"]="intermezzo",
+ ["it"]="intermezzo",
+ ["nl"]="intermezzo",
+ ["pe"]="میان‌پرده",
+ ["ro"]="intermezzo",
+ },
+ ["intext"]={
+ ["cs"]="dotextu",
+ ["de"]="imtext",
+ ["en"]="intext",
+ ["fr"]="danstexte",
+ ["it"]="intesto",
+ ["nl"]="intekst",
+ ["pe"]="درون‌متن",
+ ["ro"]="intext",
+ },
+ ["intro"]={
+ ["cs"]="uvod",
+ ["de"]="intro",
+ ["en"]="intro",
+ ["fr"]="intro",
+ ["it"]="intro",
+ ["nl"]="intro",
+ ["pe"]="پیشگÙتار",
+ ["ro"]="intro",
+ },
+ ["italic"]={
+ ["cs"]="kurziva",
+ ["de"]="italic",
+ ["en"]="italic",
+ ["fr"]="italique",
+ ["it"]="corsivo",
+ ["nl"]="italic",
+ ["pe"]="ایتالیک",
+ ["ro"]="italic",
+ },
+ ["italicbold"]={
+ ["cs"]="kurzivnitucne",
+ ["de"]="italicfett",
+ ["en"]="italicbold",
+ ["fr"]="grasitalique",
+ ["it"]="corsivograssetto",
+ ["nl"]="italicvet",
+ ["pe"]="مشکی‌ایتالیک",
+ ["ro"]="italicaldin",
+ },
+ ["item"]={
+ ["cs"]="polozka",
+ ["de"]="pos",
+ ["en"]="item",
+ ["fr"]="element",
+ ["it"]="elemento",
+ ["nl"]="som",
+ ["pe"]="آیتم",
+ ["ro"]="element",
+ },
+ ["itemize"]={
+ ["cs"]="vycet",
+ ["de"]="aufzaehlung",
+ ["en"]="itemize",
+ ["fr"]="lister",
+ ["it"]="elenco",
+ ["nl"]="opsomming",
+ ["pe"]="آیتم‌بندی",
+ ["ro"]="enumerare",
+ },
+ ["its"]={
+ ["cs"]="pol",
+ ["de"]="its",
+ ["en"]="its",
+ ["fr"]="its",
+ ["it"]="its",
+ ["nl"]="its",
+ ["pe"]="آیم",
+ ["ro"]="propriu",
+ },
+ ["january"]={
+ ["cs"]="leden",
+ ["de"]="Januar",
+ ["en"]="January",
+ ["fr"]="janvier",
+ ["it"]="gennaio",
+ ["nl"]="januari",
+ ["pe"]="ژانویه",
+ ["ro"]="ianuarie",
+ },
+ ["joinedup"]={
+ ["cs"]="spojeno",
+ ["de"]="keinabstand",
+ ["en"]="joinedup",
+ ["fr"]="joinedup",
+ ["it"]="unito",
+ ["nl"]="aansluitend",
+ ["pe"]="متصل‌بالا",
+ ["ro"]="unit",
+ },
+ ["july"]={
+ ["cs"]="cervenec",
+ ["de"]="Juli",
+ ["en"]="July",
+ ["fr"]="juillet",
+ ["it"]="luglio",
+ ["nl"]="juli",
+ ["pe"]="ژولای",
+ ["ro"]="iulie",
+ },
+ ["june"]={
+ ["cs"]="cerven",
+ ["de"]="Juni",
+ ["en"]="June",
+ ["fr"]="juin",
+ ["it"]="giugno",
+ ["nl"]="juni",
+ ["pe"]="ژوئن",
+ ["ro"]="iunie",
+ },
+ ["keep"]={
+ ["cs"]="drzet",
+ ["de"]="behalte",
+ ["en"]="keep",
+ ["fr"]="maintient",
+ ["it"]="mantieni",
+ ["nl"]="handhaaf",
+ ["pe"]="نگهدار",
+ ["ro"]="mentine",
+ },
+ ["knockout"]={
+ ["cs"]="knockout",
+ ["de"]="knockout",
+ ["en"]="knockout",
+ ["fr"]="knockout",
+ ["it"]="knockout",
+ ["nl"]="knockout",
+ ["pe"]="knockout",
+ ["ro"]="knockout",
+ },
+ ["label"]={
+ ["cs"]="popisek",
+ ["de"]="label",
+ ["en"]="label",
+ ["fr"]="etiquette",
+ ["it"]="etichetta",
+ ["nl"]="label",
+ ["pe"]="برچسب",
+ ["ro"]="eticheta",
+ },
+ ["landscape"]={
+ ["cs"]="nasirku",
+ ["de"]="querformat",
+ ["en"]="landscape",
+ ["fr"]="paysage",
+ ["it"]="orizzontale",
+ ["nl"]="liggend",
+ ["pe"]="صÙØه‌گسترده",
+ ["ro"]="vedere",
+ },
+ ["last"]={
+ ["cs"]="posledni",
+ ["de"]="letzte",
+ ["en"]="last",
+ ["fr"]="dernier",
+ ["it"]="ultimo",
+ ["nl"]="laatste",
+ ["pe"]="آخرین",
+ ["ro"]="ultim",
+ },
+ ["lastcolumn"]={
+ ["cs"]="lastcolumn",
+ ["de"]="lastcolumn",
+ ["en"]="lastcolumn",
+ ["fr"]="dernierecolonne",
+ ["it"]="lastcolumn",
+ ["nl"]="laatstekolom",
+ ["pe"]="آخرین‌ستون",
+ ["ro"]="lastcolumn",
+ },
+ ["lastpage"]={
+ ["cs"]="poslednistrana",
+ ["de"]="letzteseite",
+ ["en"]="lastpage",
+ ["fr"]="dernierepage",
+ ["it"]="ultimapagina",
+ ["nl"]="laatstepagina",
+ ["pe"]="صÙØه‌آخر",
+ ["ro"]="ultimapagina",
+ },
+ ["lastpagenumber"]={
+ ["cs"]="lastpagenumber",
+ ["de"]="lastpagenumber",
+ ["en"]="lastpagenumber",
+ ["fr"]="derniernumeropage",
+ ["it"]="lastpagenumber",
+ ["nl"]="laatstepaginanummer",
+ ["pe"]="شماه‌صÙØه‌آخر",
+ ["ro"]="lastpagenumber",
+ },
+ ["lastsubpage"]={
+ ["cs"]="poslaednipodstranka",
+ ["de"]="letzteunterseite",
+ ["en"]="lastsubpage",
+ ["fr"]="dernieresouspage",
+ ["it"]="ultimasottopagina",
+ ["nl"]="laatstesubpagina",
+ ["pe"]="زیرصÙØه‌آخر",
+ ["ro"]="ultimasubpagina",
+ },
+ ["left"]={
+ ["cs"]="vlevo",
+ ["de"]="links",
+ ["en"]="left",
+ ["fr"]="gauche",
+ ["it"]="sinistra",
+ ["nl"]="links",
+ ["pe"]="Ú†Ù¾",
+ ["ro"]="stanga",
+ },
+ ["leftedge"]={
+ ["cs"]="levahrana",
+ ["de"]="linkekante",
+ ["en"]="leftedge",
+ ["fr"]="bordgauche",
+ ["it"]="bordosinistro",
+ ["nl"]="linkerrand",
+ ["pe"]="لبه‌چپ",
+ ["ro"]="bordurastanga",
+ },
+ ["lefthanging"]={
+ ["cs"]="lefthanging",
+ ["de"]="lefthanging",
+ ["en"]="lefthanging",
+ ["fr"]="lefthanging",
+ ["it"]="lefthanging",
+ ["nl"]="linkshangend",
+ ["pe"]="آویزان‌چپ",
+ ["ro"]="lefthanging",
+ },
+ ["leftmargin"]={
+ ["cs"]="levyokraj",
+ ["de"]="linkerrand",
+ ["en"]="leftmargin",
+ ["fr"]="margegauche",
+ ["it"]="marginesinistro",
+ ["nl"]="linkermarge",
+ ["pe"]="Øاشیه‌چپ",
+ ["ro"]="marginestanga",
+ },
+ ["leftpage"]={
+ ["cs"]="levastranka",
+ ["de"]="linkerseite",
+ ["en"]="leftpage",
+ ["fr"]="pagegauche",
+ ["it"]="paginasinistra",
+ ["nl"]="linkerpagina",
+ ["pe"]="صÙØه‌چپ",
+ ["ro"]="paginastanga",
+ },
+ ["legend"]={
+ ["cs"]="legenda",
+ ["de"]="legende",
+ ["en"]="legend",
+ ["fr"]="legende",
+ ["it"]="legenda",
+ ["nl"]="legenda",
+ ["pe"]="راهنما",
+ ["ro"]="legenda",
+ },
+ ["lesshyphenation"]={
+ ["cs"]="lesshyphenation",
+ ["de"]="lesshyphenation",
+ ["en"]="lesshyphenation",
+ ["fr"]="lesshyphenation",
+ ["it"]="lesshyphenation",
+ ["nl"]="lesshyphenation",
+ ["pe"]="شکست‌کلمات‌کمتر",
+ ["ro"]="lesshyphenation",
+ },
+ ["line"]={
+ ["cs"]="radek",
+ ["de"]="zeile",
+ ["en"]="line",
+ ["fr"]="ligne",
+ ["it"]="riga",
+ ["nl"]="regel",
+ ["pe"]="خط",
+ ["ro"]="linie",
+ },
+ ["linenote"]={
+ ["cs"]="linenote",
+ ["de"]="linenote",
+ ["en"]="linenote",
+ ["fr"]="noteligne",
+ ["it"]="linenote",
+ ["nl"]="regelnoot",
+ ["pe"]="خط‌نوشت",
+ ["ro"]="linenote",
+ },
+ ["lines"]={
+ ["cs"]="radky",
+ ["de"]="zeilen",
+ ["en"]="lines",
+ ["fr"]="lignes",
+ ["it"]="righe",
+ ["nl"]="regels",
+ ["pe"]="خطها",
+ ["ro"]="linii",
+ },
+ ["list"]={
+ ["cs"]="seznam",
+ ["de"]="liste",
+ ["en"]="list",
+ ["fr"]="liste",
+ ["it"]="elenco",
+ ["nl"]="lijst",
+ ["pe"]="لیست",
+ ["ro"]="lista",
+ },
+ ["local"]={
+ ["cs"]="lokalne",
+ ["de"]="lokal",
+ ["en"]="local",
+ ["fr"]="local",
+ ["it"]="locale",
+ ["nl"]="lokaal",
+ ["pe"]="موضعی",
+ ["ro"]="local",
+ },
+ ["localenvironment"]={
+ ["cs"]="lokalnihoprostredi",
+ ["de"]="lokaleumgebung",
+ ["en"]="localenvironment",
+ ["fr"]="environementlocal",
+ ["it"]="ambientelocale",
+ ["nl"]="deelomgeving",
+ ["pe"]="Ù…Øیط‌موضعی",
+ ["ro"]="mediulocal",
+ },
+ ["logo"]={
+ ["cs"]="logo",
+ ["de"]="logo",
+ ["en"]="logo",
+ ["fr"]="logo",
+ ["it"]="logo",
+ ["nl"]="logo",
+ ["pe"]="آرم",
+ ["ro"]="logo",
+ },
+ ["logos"]={
+ ["cs"]="loga",
+ ["de"]="logos",
+ ["en"]="logos",
+ ["fr"]="logos",
+ ["it"]="loghi",
+ ["nl"]="logos",
+ ["pe"]="آرمها",
+ ["ro"]="logos",
+ },
+ ["lohi"]={
+ ["cs"]="nivy",
+ ["de"]="hoti",
+ ["en"]="lohi",
+ ["fr"]="baha",
+ ["it"]="pedap",
+ ["nl"]="laho",
+ ["pe"]="پابا",
+ ["ro"]="lohi",
+ },
+ ["loose"]={
+ ["cs"]="uvolnene",
+ ["de"]="lose",
+ ["en"]="loose",
+ ["fr"]="perte",
+ ["it"]="lento",
+ ["nl"]="los",
+ ["pe"]="شل",
+ ["ro"]="larg",
+ },
+ ["low"]={
+ ["cs"]="nizko",
+ ["de"]="tief",
+ ["en"]="low",
+ ["fr"]="bas",
+ ["it"]="basso",
+ ["nl"]="laag",
+ ["pe"]="پایین",
+ ["ro"]="jos",
+ },
+ ["ls"]={
+ ["cs"]="ls",
+ ["de"]="ls",
+ ["en"]="ls",
+ ["fr"]="ls",
+ ["it"]="ls",
+ ["nl"]="ls",
+ ["pe"]="ls",
+ ["ro"]="ls",
+ },
+ ["makeup"]={
+ ["cs"]="zlom",
+ ["de"]="umbruch",
+ ["en"]="makeup",
+ ["fr"]="makeup",
+ ["it"]="makeup",
+ ["nl"]="opmaak",
+ ["pe"]="آرایش",
+ ["ro"]="marcaj",
+ },
+ ["mar"]={
+ ["cs"]="mar",
+ ["de"]="mar",
+ ["en"]="mar",
+ ["fr"]="mar",
+ ["it"]="mar",
+ ["nl"]="mar",
+ ["pe"]="Øاش",
+ ["ro"]="mar",
+ },
+ ["march"]={
+ ["cs"]="brezen",
+ ["de"]="Maerz",
+ ["en"]="March",
+ ["fr"]="mars",
+ ["it"]="marzo",
+ ["nl"]="maart",
+ ["pe"]="مارس",
+ ["ro"]="martie",
+ },
+ ["margin"]={
+ ["cs"]="marginalie",
+ ["de"]="marginalie",
+ ["en"]="margin",
+ ["fr"]="marge",
+ ["it"]="margine",
+ ["nl"]="marge",
+ ["pe"]="Øاشیه",
+ ["ro"]="margine",
+ },
+ ["marginedge"]={
+ ["cs"]="textovahrana",
+ ["de"]="marginalkante",
+ ["en"]="marginedge",
+ ["fr"]="bordmarge",
+ ["it"]="bordomargine",
+ ["nl"]="kantlijn",
+ ["pe"]="لبه‌Øاشیه",
+ ["ro"]="marginebordura",
+ },
+ ["margintitle"]={
+ ["cs"]="titulmarginalie",
+ ["de"]="marginaltitel",
+ ["en"]="margintitle",
+ ["fr"]="titremarge",
+ ["it"]="titoloinmargine",
+ ["nl"]="margetitel",
+ ["pe"]="عنوان‌Øاشیه",
+ ["ro"]="titlumarginal",
+ },
+ ["marking"]={
+ ["cs"]="znaceni",
+ ["de"]="beschriftung",
+ ["en"]="marking",
+ ["fr"]="marquage",
+ ["it"]="marcatura",
+ ["nl"]="markering",
+ ["pe"]="نشانه‌گذاری",
+ ["ro"]="marcaje",
+ },
+ ["mathalignment"]={
+ ["cs"]="mathalignment",
+ ["de"]="mathalignment",
+ ["en"]="mathalignment",
+ ["fr"]="mathalignment",
+ ["it"]="mathalignment",
+ ["nl"]="wiskundeuitlijnen",
+ ["pe"]="تنظیم‌ریاضی",
+ ["ro"]="mathalignment",
+ },
+ ["mathcases"]={
+ ["cs"]="mathcases",
+ ["de"]="mathcases",
+ ["en"]="mathcases",
+ ["fr"]="mathcases",
+ ["it"]="mathcases",
+ ["nl"]="mathcases",
+ ["pe"]="Øالتهای‌ریاضی",
+ ["ro"]="mathcases",
+ },
+ ["mathmatrix"]={
+ ["cs"]="mathmatrix",
+ ["de"]="mathmatrix",
+ ["en"]="mathmatrix",
+ ["fr"]="mathmatrix",
+ ["it"]="mathmatrix",
+ ["nl"]="wiskundematrix",
+ ["pe"]="ماتریش‌ریاضی",
+ ["ro"]="mathmatrix",
+ },
+ ["max"]={
+ ["cs"]="max",
+ ["de"]="max",
+ ["en"]="max",
+ ["fr"]="max",
+ ["it"]="max",
+ ["nl"]="max",
+ ["pe"]="بیشترین",
+ ["ro"]="max",
+ },
+ ["may"]={
+ ["cs"]="kveten",
+ ["de"]="Mai",
+ ["en"]="May",
+ ["fr"]="mai",
+ ["it"]="maggio",
+ ["nl"]="mei",
+ ["pe"]="مه",
+ ["ro"]="mai",
+ },
+ ["mediaeval"]={
+ ["cs"]="stredoveky",
+ ["de"]="mittelalterlich",
+ ["en"]="mediaeval",
+ ["fr"]="medieval",
+ ["it"]="medievale",
+ ["nl"]="mediaeval",
+ ["pe"]="mediaeval",
+ ["ro"]="medieval",
+ },
+ ["medium"]={
+ ["cs"]="stredni",
+ ["de"]="mittel",
+ ["en"]="medium",
+ ["fr"]="moyen",
+ ["it"]="medio",
+ ["nl"]="middel",
+ ["pe"]="متوسط",
+ ["ro"]="mediu",
+ },
+ ["middle"]={
+ ["cs"]="nastred",
+ ["de"]="mittig",
+ ["en"]="middle",
+ ["fr"]="milieu",
+ ["it"]="centro",
+ ["nl"]="midden",
+ ["pe"]="میان",
+ ["ro"]="centru",
+ },
+ ["min"]={
+ ["cs"]="min",
+ ["de"]="min",
+ ["en"]="min",
+ ["fr"]="min",
+ ["it"]="min",
+ ["nl"]="min",
+ ["pe"]="کمترین",
+ ["ro"]="min",
+ },
+ ["minheight"]={
+ ["cs"]="minvyska",
+ ["de"]="minhoehe",
+ ["en"]="minheight",
+ ["fr"]="hauteurmin",
+ ["it"]="altezzamin",
+ ["nl"]="minhoogte",
+ ["pe"]="کمترین‌ارتÙاع",
+ ["ro"]="inaltimeminima",
+ },
+ ["minwidth"]={
+ ["cs"]="minsirka",
+ ["de"]="minbreite",
+ ["en"]="minwidth",
+ ["fr"]="largeurmin",
+ ["it"]="ampiezzamin",
+ ["nl"]="minbreedte",
+ ["pe"]="کمترین‌عرض",
+ ["ro"]="latimeminima",
+ },
+ ["mirrored"]={
+ ["cs"]="zrcadleno",
+ ["de"]="gespiegelt",
+ ["en"]="mirrored",
+ ["fr"]="reflete",
+ ["it"]="riflesso",
+ ["nl"]="gespiegeld",
+ ["pe"]="منعکس",
+ ["ro"]="oglindit",
+ },
+ ["monday"]={
+ ["cs"]="pondeli",
+ ["de"]="montag",
+ ["en"]="monday",
+ ["fr"]="lundi",
+ ["it"]="lunedi",
+ ["nl"]="maandag",
+ ["pe"]="دوشنبه",
+ ["ro"]="luni",
+ },
+ ["mono"]={
+ ["cs"]="mono",
+ ["de"]="mono",
+ ["en"]="mono",
+ ["fr"]="mono",
+ ["it"]="mono",
+ ["nl"]="mono",
+ ["pe"]="مونو",
+ ["ro"]="mono",
+ },
+ ["month"]={
+ ["cs"]="mesic",
+ ["de"]="monat",
+ ["en"]="month",
+ ["fr"]="mois",
+ ["it"]="mese",
+ ["nl"]="maand",
+ ["pe"]="ماه",
+ ["ro"]="luna",
+ },
+ ["morehyphenation"]={
+ ["cs"]="morehyphenation",
+ ["de"]="morehyphenation",
+ ["en"]="morehyphenation",
+ ["fr"]="morehyphenation",
+ ["it"]="morehyphenation",
+ ["nl"]="morehyphenation",
+ ["pe"]="شکست‌کلمات‌بیشتر",
+ ["ro"]="morehyphenation",
+ },
+ ["name"]={
+ ["cs"]="jmeno",
+ ["de"]="name",
+ ["en"]="name",
+ ["fr"]="nom",
+ ["it"]="nome",
+ ["nl"]="naam",
+ ["pe"]="نام",
+ ["ro"]="nume",
+ },
+ ["narrow"]={
+ ["cs"]="uzky",
+ ["de"]="schmall",
+ ["en"]="narrow",
+ ["fr"]="etroit",
+ ["it"]="stretto",
+ ["nl"]="smal",
+ ["pe"]="نازک",
+ ["ro"]="ingust",
+ },
+ ["negative"]={
+ ["cs"]="negativ",
+ ["de"]="negativ",
+ ["en"]="negative",
+ ["fr"]="negatif",
+ ["it"]="negativo",
+ ["nl"]="negatief",
+ ["pe"]="منÙÛŒ",
+ ["ro"]="negativ",
+ },
+ ["never"]={
+ ["cs"]="nikdy",
+ ["de"]="nie",
+ ["en"]="never",
+ ["fr"]="jamais",
+ ["it"]="mai",
+ ["nl"]="nooit",
+ ["pe"]="هیچگاه",
+ ["ro"]="niciodata",
+ },
+ ["new"]={
+ ["cs"]="novy",
+ ["de"]="neu",
+ ["en"]="new",
+ ["fr"]="nouveau",
+ ["it"]="nuovo",
+ ["nl"]="nieuw",
+ ["pe"]="جدید",
+ ["ro"]="nou",
+ },
+ ["next"]={
+ ["cs"]="dalsi",
+ ["de"]="folgende",
+ ["en"]="next",
+ ["fr"]="prochain",
+ ["it"]="successivo",
+ ["nl"]="volgende",
+ ["pe"]="بعدی",
+ ["ro"]="urmatorul",
+ },
+ ["nextevenpage"]={
+ ["cs"]="dalsisudastranka",
+ ["de"]="naechstegeradeseite",
+ ["en"]="nextevenpage",
+ ["fr"]="pagepairesuivante",
+ ["it"]="paginaparisuccessiva",
+ ["nl"]="volgendeevenpagina",
+ ["pe"]="صÙØه‌زوج‌بعدی",
+ ["ro"]="paginaparaurmatoarea",
+ },
+ ["nextoddpage"]={
+ ["cs"]="dalsilichastranka",
+ ["de"]="naechsteungeradeseite",
+ ["en"]="nextoddpage",
+ ["fr"]="pageimpairesuivante",
+ ["it"]="paginadisparisuccessiva",
+ ["nl"]="volgendeonevenpagina",
+ ["pe"]="صÙØه‌Ùردبعدی",
+ ["ro"]="paginaimparaurmatoarea",
+ },
+ ["nextpage"]={
+ ["cs"]="dalsistranka",
+ ["de"]="folgendeseite",
+ ["en"]="nextpage",
+ ["fr"]="pagesuivante",
+ ["it"]="paginasuccessiva",
+ ["nl"]="volgendepagina",
+ ["pe"]="صÙØه‌بعدی",
+ ["ro"]="paginaurmatoare",
+ },
+ ["nextsubpage"]={
+ ["cs"]="dalsipodstranka",
+ ["de"]="folgendeunterseite",
+ ["en"]="nextsubpage",
+ ["fr"]="souspagesuivante",
+ ["it"]="sottopaginasuccessiva",
+ ["nl"]="volgendesubpagina",
+ ["pe"]="زیرصÙØه‌بعدی",
+ ["ro"]="urmatoareasubpagina",
+ },
+ ["no"]={
+ ["cs"]="ne",
+ ["de"]="nein",
+ ["en"]="no",
+ ["fr"]="non",
+ ["it"]="no",
+ ["nl"]="nee",
+ ["pe"]="نه",
+ ["ro"]="nu",
+ },
+ ["nocheck"]={
+ ["cs"]="nocheck",
+ ["de"]="nocheck",
+ ["en"]="nocheck",
+ ["fr"]="nonverifie",
+ ["it"]="nocheck",
+ ["nl"]="geencontrole",
+ ["pe"]="بدون‌بررسی",
+ ["ro"]="nocheck",
+ },
+ ["nofit"]={
+ ["cs"]="nofit",
+ ["de"]="nofit",
+ ["en"]="nofit",
+ ["fr"]="nofit",
+ ["it"]="nofit",
+ ["nl"]="nietpassend",
+ ["pe"]="بدون‌پرکردن",
+ ["ro"]="nofit",
+ },
+ ["nogrid"]={
+ ["cs"]="nogrid",
+ ["de"]="nogrid",
+ ["en"]="nogrid",
+ ["fr"]="nogrid",
+ ["it"]="nogrid",
+ ["nl"]="geengrid",
+ ["pe"]="بدون‌توری",
+ ["ro"]="nogrid",
+ },
+ ["nohz"]={
+ ["cs"]="nohz",
+ ["de"]="nohz",
+ ["en"]="nohz",
+ ["fr"]="nohz",
+ ["it"]="nohz",
+ ["nl"]="geenhz",
+ ["pe"]="nohz",
+ ["ro"]="nohz",
+ },
+ ["nomarking"]={
+ ["cs"]="zadneznaceni",
+ ["de"]="keinebeschriftung",
+ ["en"]="nomarking",
+ ["fr"]="sansmarquage",
+ ["it"]="nomarcature",
+ ["nl"]="geenmarkering",
+ ["pe"]="بدون‌نشانه‌گذاری",
+ ["ro"]="faramarcare",
+ },
+ ["none"]={
+ ["cs"]="zadny",
+ ["de"]="kein",
+ ["en"]="none",
+ ["fr"]="rien",
+ ["it"]="nessuno",
+ ["nl"]="geen",
+ ["pe"]="هیچکدام",
+ ["ro"]="niciunul",
+ },
+ ["nonumber"]={
+ ["cs"]="nonumber",
+ ["de"]="nonumber",
+ ["en"]="nonumber",
+ ["fr"]="sansnumero",
+ ["it"]="nonumber",
+ ["nl"]="geennummer",
+ ["pe"]="بدون‌شماره",
+ ["ro"]="nonumber",
+ },
+ ["normal"]={
+ ["cs"]="normalni",
+ ["de"]="normal",
+ ["en"]="normal",
+ ["fr"]="normal",
+ ["it"]="normale",
+ ["nl"]="normaal",
+ ["pe"]="نرمال",
+ ["ro"]="normal",
+ },
+ ["nospacing"]={
+ ["cs"]="nospacing",
+ ["de"]="nospacing",
+ ["en"]="nospacing",
+ ["fr"]="sansespacement",
+ ["it"]="nospacing",
+ ["nl"]="geenspatiering",
+ ["pe"]="بدون‌Ùضاگذاری",
+ ["ro"]="nospacing",
+ },
+ ["not"]={
+ ["cs"]="ne",
+ ["de"]="nicht",
+ ["en"]="not",
+ ["fr"]="pas",
+ ["it"]="non",
+ ["nl"]="niet",
+ ["pe"]="بدون",
+ ["ro"]="nu",
+ },
+ ["nothanging"]={
+ ["cs"]="nothanging",
+ ["de"]="nothanging",
+ ["en"]="nothanging",
+ ["fr"]="nonsuspendu",
+ ["it"]="nonsospeso",
+ ["nl"]="niethangend",
+ ["pe"]="بدون‌آویزان‌کردن",
+ ["ro"]="nothanging",
+ },
+ ["nothyphenated"]={
+ ["cs"]="nothyphenated",
+ ["de"]="nothyphenated",
+ ["en"]="nothyphenated",
+ ["fr"]="nothyphenated",
+ ["it"]="nonsillabato",
+ ["nl"]="nietafgebroken",
+ ["pe"]="بدون‌شکست",
+ ["ro"]="nedespsilabe",
+ },
+ ["november"]={
+ ["cs"]="listopad",
+ ["de"]="November",
+ ["en"]="November",
+ ["fr"]="novembre",
+ ["it"]="novembre",
+ ["nl"]="november",
+ ["pe"]="نوامبر",
+ ["ro"]="noiembrie",
+ },
+ ["nowhere"]={
+ ["cs"]="nikde",
+ ["de"]="nirgens",
+ ["en"]="nowhere",
+ ["fr"]="nulpart",
+ ["it"]="danessunaparte",
+ ["nl"]="nergens",
+ ["pe"]="هیچ‌Øا",
+ ["ro"]="niciunde",
+ },
+ ["nowhite"]={
+ ["cs"]="zadnabila",
+ ["de"]="keinweiss",
+ ["en"]="nowhite",
+ ["fr"]="sansblanc",
+ ["it"]="nobianco",
+ ["nl"]="geenwit",
+ ["pe"]="سÙید‌نه",
+ ["ro"]="faraalb",
+ },
+ ["number"]={
+ ["cs"]="cislo",
+ ["de"]="nummer",
+ ["en"]="number",
+ ["fr"]="numero",
+ ["it"]="numero",
+ ["nl"]="nummer",
+ ["pe"]="شماره",
+ ["ro"]="numar",
+ },
+ ["numbers"]={
+ ["cs"]="cisla",
+ ["de"]="ziffern",
+ ["en"]="numbers",
+ ["fr"]="numeros",
+ ["it"]="numeri",
+ ["nl"]="cijfers",
+ ["pe"]="شماره‌ها",
+ ["ro"]="numere",
+ },
+ ["october"]={
+ ["cs"]="rijen",
+ ["de"]="Oktober",
+ ["en"]="October",
+ ["fr"]="octobre",
+ ["it"]="ottobre",
+ ["nl"]="oktober",
+ ["pe"]="اکتبر",
+ ["ro"]="octombrie",
+ },
+ ["odd"]={
+ ["cs"]="liche",
+ ["de"]="ungerade",
+ ["en"]="odd",
+ ["fr"]="impair",
+ ["it"]="dispari",
+ ["nl"]="oneven",
+ ["pe"]="Ùرد",
+ ["ro"]="impar",
+ },
+ ["off"]={
+ ["cs"]="vyp",
+ ["de"]="aus",
+ ["en"]="off",
+ ["fr"]="desactive",
+ ["it"]="disattivo",
+ ["nl"]="uit",
+ ["pe"]="خاموش",
+ ["ro"]="dezactivat",
+ },
+ ["offset"]={
+ ["cs"]="offset",
+ ["de"]="offset",
+ ["en"]="offset",
+ ["fr"]="offset",
+ ["it"]="offset",
+ ["nl"]="offset",
+ ["pe"]="Ø¢Ùست",
+ ["ro"]="offset",
+ },
+ ["old"]={
+ ["cs"]="old",
+ ["de"]="old",
+ ["en"]="old",
+ ["fr"]="old",
+ ["it"]="old",
+ ["nl"]="oud",
+ ["pe"]="قدیمی",
+ ["ro"]="old",
+ },
+ ["on"]={
+ ["cs"]="zap",
+ ["de"]="an",
+ ["en"]="on",
+ ["fr"]="actif",
+ ["it"]="attivo",
+ ["nl"]="aan",
+ ["pe"]="روی",
+ ["ro"]="on",
+ },
+ ["one"]={
+ ["cs"]="jedna",
+ ["de"]="eins",
+ ["en"]="one",
+ ["fr"]="un",
+ ["it"]="uno",
+ ["nl"]="een",
+ ["pe"]="یک",
+ ["ro"]="unu",
+ },
+ ["opposite"]={
+ ["cs"]="naproti",
+ ["de"]="gegenueber",
+ ["en"]="opposite",
+ ["fr"]="opposition",
+ ["it"]="opposto",
+ ["nl"]="naast",
+ ["pe"]="مخالÙ",
+ ["ro"]="opus",
+ },
+ ["outer"]={
+ ["cs"]="vnejsi",
+ ["de"]="aussen",
+ ["en"]="outer",
+ ["fr"]="exterieur",
+ ["it"]="esterno",
+ ["nl"]="buiten",
+ ["pe"]="خارجی",
+ ["ro"]="extern",
+ },
+ ["outeredge"]={
+ ["cs"]="outeredge",
+ ["de"]="outeredge",
+ ["en"]="outeredge",
+ ["fr"]="bordexterieur",
+ ["it"]="bordoesterno",
+ ["nl"]="buitenrand",
+ ["pe"]="لبه‌خارجی",
+ ["ro"]="outeredge",
+ },
+ ["outermargin"]={
+ ["cs"]="outermargin",
+ ["de"]="outermargin",
+ ["en"]="outermargin",
+ ["fr"]="margeexterieure",
+ ["it"]="margineesterno",
+ ["nl"]="buitenmarge",
+ ["pe"]="Øاشیه‌خارجی",
+ ["ro"]="outermargin",
+ },
+ ["overlay"]={
+ ["cs"]="prekryv",
+ ["de"]="overlay",
+ ["en"]="overlay",
+ ["fr"]="revetement",
+ ["it"]="sovrapponi",
+ ["nl"]="overlay",
+ ["pe"]="پوشش",
+ ["ro"]="overlay",
+ },
+ ["overprint"]={
+ ["cs"]="overprint",
+ ["de"]="overprint",
+ ["en"]="overprint",
+ ["fr"]="overprint",
+ ["it"]="overprint",
+ ["nl"]="overprint",
+ ["pe"]="overprint",
+ ["ro"]="overprint",
+ },
+ ["packed"]={
+ ["cs"]="zhustene",
+ ["de"]="gepackt",
+ ["en"]="packed",
+ ["fr"]="groupe",
+ ["it"]="impaccato",
+ ["nl"]="opelkaar",
+ ["pe"]="Ùشرده",
+ ["ro"]="impachetat",
+ },
+ ["page"]={
+ ["cs"]="stranka",
+ ["de"]="seite",
+ ["en"]="page",
+ ["fr"]="page",
+ ["it"]="pagina",
+ ["nl"]="pagina",
+ ["pe"]="صÙØÙ‡",
+ ["ro"]="pagina",
+ },
+ ["pagecomment"]={
+ ["cs"]="komentarstranky",
+ ["de"]="pagecomment",
+ ["en"]="pagecomment",
+ ["fr"]="commentairepage",
+ ["it"]="commentopagina",
+ ["nl"]="paginacommentaar",
+ ["pe"]="توضیØ‌صÙØÙ‡",
+ ["ro"]="comentariupagina",
+ },
+ ["pagenumber"]={
+ ["cs"]="cislostranky",
+ ["de"]="seitennummer",
+ ["en"]="pagenumber",
+ ["fr"]="numeropage",
+ ["it"]="numeropagina",
+ ["nl"]="paginanummer",
+ ["pe"]="شماره‌صÙØÙ‡",
+ ["ro"]="numarpagina",
+ },
+ ["paper"]={
+ ["cs"]="papir",
+ ["de"]="papier",
+ ["en"]="paper",
+ ["fr"]="papier",
+ ["it"]="carta",
+ ["nl"]="papier",
+ ["pe"]="برگ",
+ ["ro"]="foaie",
+ },
+ ["paragraph"]={
+ ["cs"]="odstavec",
+ ["de"]="absatz",
+ ["en"]="paragraph",
+ ["fr"]="paragraphe",
+ ["it"]="capoverso",
+ ["nl"]="alinea",
+ ["pe"]="پاراگراÙ",
+ ["ro"]="paragraf",
+ },
+ ["part"]={
+ ["cs"]="cast",
+ ["de"]="teil",
+ ["en"]="part",
+ ["fr"]="partie",
+ ["it"]="parte",
+ ["nl"]="deel",
+ ["pe"]="قسمت",
+ ["ro"]="parte",
+ },
+ ["positive"]={
+ ["cs"]="positiv",
+ ["de"]="positiv",
+ ["en"]="positive",
+ ["fr"]="positif",
+ ["it"]="positivo",
+ ["nl"]="positief",
+ ["pe"]="مثبت",
+ ["ro"]="positiv",
+ },
+ ["postponing"]={
+ ["cs"]="odlozit",
+ ["de"]="verschieben",
+ ["en"]="postponing",
+ ["fr"]="postponing",
+ ["it"]="posporre",
+ ["nl"]="uitstellen",
+ ["pe"]="تاخیر",
+ ["ro"]="postponing",
+ },
+ ["postscript"]={
+ ["cs"]="postscript",
+ ["de"]="postscript",
+ ["en"]="postscript",
+ ["fr"]="postscript",
+ ["it"]="postscript",
+ ["nl"]="postscript",
+ ["pe"]="پست‌اسکریپت",
+ ["ro"]="postscript",
+ },
+ ["preference"]={
+ ["cs"]="nastaveni",
+ ["de"]="einstellung",
+ ["en"]="preference",
+ ["fr"]="preference",
+ ["it"]="preferenza",
+ ["nl"]="voorkeur",
+ ["pe"]="ترجیØ",
+ ["ro"]="preferinta",
+ },
+ ["preview"]={
+ ["cs"]="nahled",
+ ["de"]="vorschau",
+ ["en"]="preview",
+ ["fr"]="previsualisation",
+ ["it"]="anteprima",
+ ["nl"]="preview",
+ ["pe"]="پیش‌دید",
+ ["ro"]="previzualizare",
+ },
+ ["previous"]={
+ ["cs"]="predchozi",
+ ["de"]="vorig",
+ ["en"]="previous",
+ ["fr"]="precedent",
+ ["it"]="precedente",
+ ["nl"]="vorige",
+ ["pe"]="قبلی",
+ ["ro"]="precedent",
+ },
+ ["previousevenpage"]={
+ ["cs"]="predchozisudastranka",
+ ["de"]="vorigegeradeseite",
+ ["en"]="previousevenpage",
+ ["fr"]="pagepaireprecedente",
+ ["it"]="paginapariprecedente",
+ ["nl"]="vorigeevenpagina",
+ ["pe"]="صÙØه‌زوج‌قبلی",
+ ["ro"]="paginaparaprecedenta",
+ },
+ ["previousoddpage"]={
+ ["cs"]="predchozilichastranka",
+ ["de"]="vorigeungeradeseite",
+ ["en"]="previousoddpage",
+ ["fr"]="pageimpaireprecedente",
+ ["it"]="paginadispariprecedente",
+ ["nl"]="vorigeonevenpagina",
+ ["pe"]="صÙØه‌Ùردقبلی",
+ ["ro"]="paginaimparaprecedenta",
+ },
+ ["previouspage"]={
+ ["cs"]="predchozistranka",
+ ["de"]="vorigeseite",
+ ["en"]="previouspage",
+ ["fr"]="pageprecedente",
+ ["it"]="paginaprecedente",
+ ["nl"]="vorigepagina",
+ ["pe"]="صÙØه‌قبلی",
+ ["ro"]="paginaanterioara",
+ },
+ ["previoussubpage"]={
+ ["cs"]="predchozipodstranka",
+ ["de"]="vorigeunterseite",
+ ["en"]="previoussubpage",
+ ["fr"]="souspageprecedente",
+ ["it"]="sottopaginaprecedente",
+ ["nl"]="vorigesubpagina",
+ ["pe"]="زیرصÙØه‌قبلی",
+ ["ro"]="subpaginaanterioara",
+ },
+ ["printable"]={
+ ["cs"]="tisknutelne",
+ ["de"]="druckbar",
+ ["en"]="printable",
+ ["fr"]="editable",
+ ["it"]="stampabile",
+ ["nl"]="printbaar",
+ ["pe"]="قابل‌چاپ",
+ ["ro"]="tiparibil",
+ },
+ ["process"]={
+ ["cs"]="process",
+ ["de"]="process",
+ ["en"]="process",
+ ["fr"]="process",
+ ["it"]="process",
+ ["nl"]="proces",
+ ["pe"]="پردازش",
+ ["ro"]="process",
+ },
+ ["product"]={
+ ["cs"]="produkt",
+ ["de"]="produkt",
+ ["en"]="product",
+ ["fr"]="produit",
+ ["it"]="prodotto",
+ ["nl"]="produkt",
+ ["pe"]="Ù…Øصول",
+ ["ro"]="produs",
+ },
+ ["program"]={
+ ["cs"]="program",
+ ["de"]="programm",
+ ["en"]="program",
+ ["fr"]="programme",
+ ["it"]="programma",
+ ["nl"]="programma",
+ ["pe"]="برنامه",
+ ["ro"]="program",
+ },
+ ["project"]={
+ ["cs"]="projekt",
+ ["de"]="projekt",
+ ["en"]="project",
+ ["fr"]="projet",
+ ["it"]="progetto",
+ ["nl"]="project",
+ ["pe"]="پروژه",
+ ["ro"]="proiect",
+ },
+ ["protected"]={
+ ["cs"]="chranene",
+ ["de"]="geschuetzt",
+ ["en"]="protected",
+ ["fr"]="protege",
+ ["it"]="protetto",
+ ["nl"]="beschermd",
+ ["pe"]="ØÙاظت‌شده",
+ ["ro"]="protejat",
+ },
+ ["quadruple"]={
+ ["cs"]="ctyrnasobny",
+ ["de"]="viertel",
+ ["en"]="quadruple",
+ ["fr"]="quadruple",
+ ["it"]="quadruplo",
+ ["nl"]="viertal",
+ ["pe"]="quadruple",
+ ["ro"]="cvadrupul",
+ },
+ ["quotation"]={
+ ["cs"]="citace",
+ ["de"]="zitat",
+ ["en"]="quotation",
+ ["fr"]="citation",
+ ["it"]="citazione",
+ ["nl"]="citaat",
+ ["pe"]="نقل‌قول",
+ ["ro"]="citat",
+ },
+ ["quote"]={
+ ["cs"]="citovat",
+ ["de"]="zitieren",
+ ["en"]="quote",
+ ["fr"]="citer",
+ ["it"]="menzione",
+ ["nl"]="citeer",
+ ["pe"]="نقل",
+ ["ro"]="minicitat",
+ },
+ ["ran"]={
+ ["cs"]="rozsah",
+ ["de"]="ran",
+ ["en"]="ran",
+ ["fr"]="cours",
+ ["it"]="corse",
+ ["nl"]="ran",
+ ["pe"]="برد",
+ ["ro"]="rulat",
+ },
+ ["random"]={
+ ["cs"]="nahodny",
+ ["de"]="zufaellig",
+ ["en"]="random",
+ ["fr"]="aleatoire",
+ ["it"]="casuale",
+ ["nl"]="willekeurig",
+ ["pe"]="تصادÙÛŒ",
+ ["ro"]="aleator",
+ },
+ ["readonly"]={
+ ["cs"]="pouzeprocteni",
+ ["de"]="nurlesbar",
+ ["en"]="readonly",
+ ["fr"]="lectureseule",
+ ["it"]="solalettura",
+ ["nl"]="alleenleesbaar",
+ ["pe"]="تنهاخواندنی",
+ ["ro"]="readonly",
+ },
+ ["rectangular"]={
+ ["cs"]="pravouhly",
+ ["de"]="rechteckig",
+ ["en"]="rectangular",
+ ["fr"]="rectangulaire",
+ ["it"]="rettangolare",
+ ["nl"]="recht",
+ ["pe"]="چهارگوشه",
+ ["ro"]="rectangular",
+ },
+ ["referral"]={
+ ["cs"]="znacka",
+ ["de"]="merkmal",
+ ["en"]="referral",
+ ["fr"]="referral",
+ ["it"]="referral",
+ ["nl"]="kenmerk",
+ ["pe"]="مراجعه",
+ ["ro"]="referinta",
+ },
+ ["register"]={
+ ["cs"]="rejstrik",
+ ["de"]="register",
+ ["en"]="register",
+ ["fr"]="registre",
+ ["it"]="registro",
+ ["nl"]="register",
+ ["pe"]="ثبت",
+ ["ro"]="registru",
+ },
+ ["regular"]={
+ ["cs"]="pravidelne",
+ ["de"]="regular",
+ ["en"]="regular",
+ ["fr"]="regulier",
+ ["it"]="regolare",
+ ["nl"]="regular",
+ ["pe"]="منظم",
+ ["ro"]="regular",
+ },
+ ["rekening"]={
+ ["cs"]="rekening",
+ ["de"]="rekening",
+ ["en"]="rekening",
+ ["fr"]="rekening",
+ ["it"]="rekening",
+ ["nl"]="rekening",
+ ["pe"]="rekening",
+ ["ro"]="rekening",
+ },
+ ["relative"]={
+ ["cs"]="relativni",
+ ["de"]="relativ",
+ ["en"]="relative",
+ ["fr"]="relatif",
+ ["it"]="relativo",
+ ["nl"]="relatief",
+ ["pe"]="نسبی",
+ ["ro"]="relativ",
+ },
+ ["repeat"]={
+ ["cs"]="opakovat",
+ ["de"]="wiederholen",
+ ["en"]="repeat",
+ ["fr"]="repete",
+ ["it"]="ripeti",
+ ["nl"]="herhaal",
+ ["pe"]="تکرار",
+ ["ro"]="repetat",
+ },
+ ["required"]={
+ ["cs"]="pozadovane",
+ ["de"]="obligatorisch",
+ ["en"]="required",
+ ["fr"]="recquis",
+ ["it"]="richiestp",
+ ["nl"]="verplicht",
+ ["pe"]="موردنیاز",
+ ["ro"]="obligatoriu",
+ },
+ ["reset"]={
+ ["cs"]="reset",
+ ["de"]="zuruecksetzten",
+ ["en"]="reset",
+ ["fr"]="raz",
+ ["it"]="reimposta",
+ ["nl"]="reset",
+ ["pe"]="بازنشانی",
+ ["ro"]="reset",
+ },
+ ["reverse"]={
+ ["cs"]="reverse",
+ ["de"]="reverse",
+ ["en"]="reverse",
+ ["fr"]="inverse",
+ ["it"]="invertito",
+ ["nl"]="omgekeerd",
+ ["pe"]="برعکس",
+ ["ro"]="reverse",
+ },
+ ["right"]={
+ ["cs"]="vpravo",
+ ["de"]="rechts",
+ ["en"]="right",
+ ["fr"]="droite",
+ ["it"]="destra",
+ ["nl"]="rechts",
+ ["pe"]="راست",
+ ["ro"]="dreapta",
+ },
+ ["rightedge"]={
+ ["cs"]="pravahrana",
+ ["de"]="rechterkante",
+ ["en"]="rightedge",
+ ["fr"]="borddroit",
+ ["it"]="bordodestro",
+ ["nl"]="rechterrand",
+ ["pe"]="لبه‌راست",
+ ["ro"]="borduradreapta",
+ },
+ ["righthanging"]={
+ ["cs"]="righthanging",
+ ["de"]="righthanging",
+ ["en"]="righthanging",
+ ["fr"]="righthanging",
+ ["it"]="righthanging",
+ ["nl"]="rechtshangend",
+ ["pe"]="آویزان‌کردن‌راست",
+ ["ro"]="righthanging",
+ },
+ ["rightmargin"]={
+ ["cs"]="pravyokraj",
+ ["de"]="rechterrand",
+ ["en"]="rightmargin",
+ ["fr"]="margedroite",
+ ["it"]="marginedestro",
+ ["nl"]="rechtermarge",
+ ["pe"]="Øاشیه‌راست",
+ ["ro"]="marginedreapta",
+ },
+ ["rightpage"]={
+ ["cs"]="pravastranka",
+ ["de"]="rechterseite",
+ ["en"]="rightpage",
+ ["fr"]="pagedroite",
+ ["it"]="paginadestra",
+ ["nl"]="rechterpagina",
+ ["pe"]="صÙØه‌راست",
+ ["ro"]="paginadreapta",
+ },
+ ["roman"]={
+ ["cs"]="antikva",
+ ["de"]="antiqua",
+ ["en"]="roman",
+ ["fr"]="roman",
+ ["it"]="roman",
+ ["nl"]="romaan",
+ ["pe"]="رومن",
+ ["ro"]="roman",
+ },
+ ["romannumerals"]={
+ ["cs"]="rimskecislice",
+ ["de"]="roemischezahlen",
+ ["en"]="romannumerals",
+ ["fr"]="chiffresromains",
+ ["it"]="numeriromani",
+ ["nl"]="romeins",
+ ["pe"]="شماره‌لاتین",
+ ["ro"]="numereromane",
+ },
+ ["rotate"]={
+ ["cs"]="otoc",
+ ["de"]="drehe",
+ ["en"]="rotate",
+ ["fr"]="oriente",
+ ["it"]="ruota",
+ ["nl"]="roteer",
+ ["pe"]="دوران",
+ ["ro"]="rotit",
+ },
+ ["rotated"]={
+ ["cs"]="otoceno",
+ ["de"]="gedreht",
+ ["en"]="rotated",
+ ["fr"]="tourne",
+ ["it"]="ruotato",
+ ["nl"]="geroteerd",
+ ["pe"]="دوران‌یاÙته",
+ ["ro"]="rotat",
+ },
+ ["round"]={
+ ["cs"]="zaobleny",
+ ["de"]="rund",
+ ["en"]="round",
+ ["fr"]="rond",
+ ["it"]="rotondo",
+ ["nl"]="rond",
+ ["pe"]="گرد",
+ ["ro"]="rotund",
+ },
+ ["row"]={
+ ["cs"]="row",
+ ["de"]="row",
+ ["en"]="row",
+ ["fr"]="rang",
+ ["it"]="row",
+ ["nl"]="rij",
+ ["pe"]="سطر",
+ ["ro"]="rand",
+ },
+ ["rule"]={
+ ["cs"]="linka",
+ ["de"]="linie",
+ ["en"]="rule",
+ ["fr"]="regle",
+ ["it"]="linea",
+ ["nl"]="lijn",
+ ["pe"]="خط",
+ ["ro"]="rigla",
+ },
+ ["samepage"]={
+ ["cs"]="stejnastranka",
+ ["de"]="selbeseite",
+ ["en"]="samepage",
+ ["fr"]="memepage",
+ ["it"]="stessapagina",
+ ["nl"]="zelfdepagina",
+ ["pe"]="همان‌صÙØÙ‡",
+ ["ro"]="aceeasipagina",
+ },
+ ["sans"]={
+ ["cs"]="sans",
+ ["de"]="sans",
+ ["en"]="sans",
+ ["fr"]="sans",
+ ["it"]="sans",
+ ["nl"]="sans",
+ ["pe"]="سانز",
+ ["ro"]="sans",
+ },
+ ["sansbold"]={
+ ["cs"]="sanstucne",
+ ["de"]="sansfett",
+ ["en"]="sansbold",
+ ["fr"]="sansgras",
+ ["it"]="sansgrassetto",
+ ["nl"]="sansvet",
+ ["pe"]="مشکی‌سانز",
+ ["ro"]="sansaldin",
+ },
+ ["sansserif"]={
+ ["cs"]="bezserifu",
+ ["de"]="grotesk",
+ ["en"]="sansserif",
+ ["fr"]="sansserif",
+ ["it"]="sansserif",
+ ["nl"]="schreefloos",
+ ["pe"]="سانزسریÙ",
+ ["ro"]="sansserif",
+ },
+ ["saturday"]={
+ ["cs"]="sobota",
+ ["de"]="samstag",
+ ["en"]="saturday",
+ ["fr"]="samedi",
+ ["it"]="sabato",
+ ["nl"]="zaterdag",
+ ["pe"]="شنبه",
+ ["ro"]="sambata",
+ },
+ ["screen"]={
+ ["cs"]="rastr",
+ ["de"]="raster",
+ ["en"]="screen",
+ ["fr"]="ecran",
+ ["it"]="schermo",
+ ["nl"]="raster",
+ ["pe"]="پرده",
+ ["ro"]="ecran",
+ },
+ ["section"]={
+ ["cs"]="sekce",
+ ["de"]="absatz",
+ ["en"]="section",
+ ["fr"]="section",
+ ["it"]="capoverso",
+ ["nl"]="paragraaf",
+ ["pe"]="بخش",
+ ["ro"]="sectiune",
+ },
+ ["sectionblockenvironment"]={
+ ["cs"]="sectionblockenvironment",
+ ["de"]="sectionblockenvironment",
+ ["en"]="sectionblockenvironment",
+ ["fr"]="environementblocsection",
+ ["it"]="ambientebloccosezione",
+ ["nl"]="sectieblokomgeving",
+ ["pe"]="Ù…Øیط‌بلوک‌بخش",
+ ["ro"]="blocsectiuneambient",
+ },
+ ["sectionnumber"]={
+ ["cs"]="cislooddilu",
+ ["de"]="abschnittsnummer",
+ ["en"]="sectionnumber",
+ ["fr"]="numerosection",
+ ["it"]="numerosezione",
+ ["nl"]="sectienummer",
+ ["pe"]="شماره‌بخش",
+ ["ro"]="numarsetiune",
+ },
+ ["see"]={
+ ["cs"]="viz",
+ ["de"]="sieh",
+ ["en"]="see",
+ ["fr"]="voit",
+ ["it"]="vedi",
+ ["nl"]="zie",
+ ["pe"]="ببینید",
+ ["ro"]="vezi",
+ },
+ ["september"]={
+ ["cs"]="zari",
+ ["de"]="September",
+ ["en"]="September",
+ ["fr"]="septembre",
+ ["it"]="settembre",
+ ["nl"]="september",
+ ["pe"]="سپتامبر",
+ ["ro"]="septembrie",
+ },
+ ["serif"]={
+ ["cs"]="serif",
+ ["de"]="serif",
+ ["en"]="serif",
+ ["fr"]="serif",
+ ["it"]="serif",
+ ["nl"]="serif",
+ ["pe"]="سریÙ",
+ ["ro"]="serif",
+ },
+ ["serried"]={
+ ["cs"]="semknuto",
+ ["de"]="kleinerabstand",
+ ["en"]="serried",
+ ["fr"]="serried",
+ ["it"]="vicino",
+ ["nl"]="aanelkaar",
+ ["pe"]="تنگ‌هم",
+ ["ro"]="serried",
+ },
+ ["setups"]={
+ ["cs"]="einstellungen",
+ ["de"]="impostazioni",
+ ["en"]="setups",
+ ["fr"]="reglages",
+ ["it"]="nastaveni",
+ ["nl"]="instellingen",
+ ["pe"]="بارگذاریها",
+ ["ro"]="setari",
+ },
+ ["sheet"]={
+ ["cs"]="sheet",
+ ["de"]="sheet",
+ ["en"]="sheet",
+ ["fr"]="sheet",
+ ["it"]="sheet",
+ ["nl"]="sheet",
+ ["pe"]="ورقه",
+ ["ro"]="sheet",
+ },
+ ["singlesided"]={
+ ["cs"]="jednostranne",
+ ["de"]="einzelseitig",
+ ["en"]="singlesided",
+ ["fr"]="recto",
+ ["it"]="facciasingola",
+ ["nl"]="enkelzijdig",
+ ["pe"]="یک‌رو",
+ ["ro"]="ofata",
+ },
+ ["slanted"]={
+ ["cs"]="sklonene",
+ ["de"]="geneigt",
+ ["en"]="slanted",
+ ["fr"]="incline",
+ ["it"]="inclinato",
+ ["nl"]="schuin",
+ ["pe"]="خوابیده",
+ ["ro"]="inclinat",
+ },
+ ["slantedbold"]={
+ ["cs"]="sklonenetucne",
+ ["de"]="geneigtfett",
+ ["en"]="slantedbold",
+ ["fr"]="grasincline",
+ ["it"]="inclinatograssetto",
+ ["nl"]="schuinvet",
+ ["pe"]="مشکی‌خوابیده",
+ ["ro"]="inclinataldin",
+ },
+ ["small"]={
+ ["cs"]="male",
+ ["de"]="klein",
+ ["en"]="small",
+ ["fr"]="petit",
+ ["it"]="piccolo",
+ ["nl"]="klein",
+ ["pe"]="Ú©ÙˆÚ†Ú©",
+ ["ro"]="mic",
+ },
+ ["smallbodyfont"]={
+ ["cs"]="smallbodyfont",
+ ["de"]="smallbodyfont",
+ ["en"]="smallbodyfont",
+ ["fr"]="petitepolicecorps",
+ ["it"]="piccolofontdelcorpo",
+ ["nl"]="kleinkorps",
+ ["pe"]="قلم‌بدنه‌کوچک",
+ ["ro"]="smallbodyfont",
+ },
+ ["smallbold"]={
+ ["cs"]="maletucne",
+ ["de"]="kleinfett",
+ ["en"]="smallbold",
+ ["fr"]="graspetit",
+ ["it"]="piccolograssetto",
+ ["nl"]="kleinvet",
+ ["pe"]="مشکی‌کوچک",
+ ["ro"]="micaldin",
+ },
+ ["smallbolditalic"]={
+ ["cs"]="maletucnekurzivni",
+ ["de"]="kleinfettitalic",
+ ["en"]="smallbolditalic",
+ ["fr"]="italiquegraspetit",
+ ["it"]="piccolograssettocorsivo",
+ ["nl"]="kleinvetitalic",
+ ["pe"]="ایتالیک‌مشکی‌کوچک",
+ ["ro"]="micaldininclinat",
+ },
+ ["smallboldslanted"]={
+ ["cs"]="maletucnesklonene",
+ ["de"]="kleinfettgeneigt",
+ ["en"]="smallboldslanted",
+ ["fr"]="inclinegraspetit",
+ ["it"]="piccolograssettoinclinato",
+ ["nl"]="kleinvetschuin",
+ ["pe"]="خوابیده‌مشکی‌کوچک",
+ ["ro"]="micaldininclinat",
+ },
+ ["smallcaps"]={
+ ["cs"]="kapitalky",
+ ["de"]="smallcaps",
+ ["en"]="smallcaps",
+ ["fr"]="petitescapitales",
+ ["it"]="maiuscoletto",
+ ["nl"]="smallcaps",
+ ["pe"]="smallcaps",
+ ["ro"]="majusculemici",
+ },
+ ["smallitalic"]={
+ ["cs"]="malekurzivni",
+ ["de"]="kleinitalic",
+ ["en"]="smallitalic",
+ ["fr"]="italiquepetit",
+ ["it"]="piccolocorsivo",
+ ["nl"]="kleinitalic",
+ ["pe"]="ایتالیک‌کوچک",
+ ["ro"]="micitalic",
+ },
+ ["smallitalicbold"]={
+ ["cs"]="malekurzivnitucne",
+ ["de"]="kleinitalicfett",
+ ["en"]="smallitalicbold",
+ ["fr"]="grasitaliquepetit",
+ ["it"]="piccolocorsivograssetto",
+ ["nl"]="kleinitalicvet",
+ ["pe"]="مشکی‌ایتالیک‌کوچک",
+ ["ro"]="micitalicaldin",
+ },
+ ["smallnormal"]={
+ ["cs"]="malenormalni",
+ ["de"]="kleinnormal",
+ ["en"]="smallnormal",
+ ["fr"]="normalpetit",
+ ["it"]="piccolonormale",
+ ["nl"]="kleinnormaal",
+ ["pe"]="نرمال‌کوچک",
+ ["ro"]="micnormal",
+ },
+ ["smallslanted"]={
+ ["cs"]="malesklonene",
+ ["de"]="kleingeneigt",
+ ["en"]="smallslanted",
+ ["fr"]="inclinepetit",
+ ["it"]="piccoloinclinato",
+ ["nl"]="kleinschuin",
+ ["pe"]="خوابیده‌کوچک",
+ ["ro"]="micinclinat",
+ },
+ ["smallslantedbold"]={
+ ["cs"]="malesklonenetucne",
+ ["de"]="kleingeneigtfett",
+ ["en"]="smallslantedbold",
+ ["fr"]="grasinclinepetit",
+ ["it"]="piccoloinclinatograssetto",
+ ["nl"]="kleinschuinvet",
+ ["pe"]="مشکی‌خوابیده‌کوچک",
+ ["ro"]="micinclinataldin",
+ },
+ ["smalltype"]={
+ ["cs"]="maletype",
+ ["de"]="kleintippen",
+ ["en"]="smalltype",
+ ["fr"]="petittype",
+ ["it"]="piccolotype",
+ ["nl"]="kleintype",
+ ["pe"]="تایپ‌کوچک",
+ ["ro"]="mictype",
+ },
+ ["somewhere"]={
+ ["cs"]="nekde",
+ ["de"]="irgendwo",
+ ["en"]="somewhere",
+ ["fr"]="qqpart",
+ ["it"]="daqualcheparte",
+ ["nl"]="ergens",
+ ["pe"]="جایی",
+ ["ro"]="undeva",
+ },
+ ["sorted"]={
+ ["cs"]="tridene",
+ ["de"]="sortiert",
+ ["en"]="sorted",
+ ["fr"]="trie",
+ ["it"]="ordinato",
+ ["nl"]="gesorteerd",
+ ["pe"]="مرتب",
+ ["ro"]="sortat",
+ },
+ ["space"]={
+ ["cs"]="mezera",
+ ["de"]="spatium",
+ ["en"]="space",
+ ["fr"]="espace",
+ ["it"]="spazio",
+ ["nl"]="spatie",
+ ["pe"]="Ùضا",
+ ["ro"]="spatiu",
+ },
+ ["spacing"]={
+ ["cs"]="mezerovani",
+ ["de"]="spatiumausgleich",
+ ["en"]="spacing",
+ ["fr"]="espacement",
+ ["it"]="spaziatura",
+ ["nl"]="spatiering",
+ ["pe"]="Ùضاگذاری",
+ ["ro"]="spatiere",
+ },
+ ["speech"]={
+ ["cs"]="speech",
+ ["de"]="speech",
+ ["en"]="speech",
+ ["fr"]="discours",
+ ["it"]="speech",
+ ["nl"]="spraak",
+ ["pe"]="سخنرانی",
+ ["ro"]="speech",
+ },
+ ["split"]={
+ ["cs"]="split",
+ ["de"]="split",
+ ["en"]="split",
+ ["fr"]="split",
+ ["it"]="separa",
+ ["nl"]="splitsen",
+ ["pe"]="شکاÙتن",
+ ["ro"]="split",
+ },
+ ["spot"]={
+ ["cs"]="spot",
+ ["de"]="spot",
+ ["en"]="spot",
+ ["fr"]="spot",
+ ["it"]="spot",
+ ["nl"]="spot",
+ ["pe"]="Ù„Ú©Ù‡",
+ ["ro"]="spot",
+ },
+ ["standard"]={
+ ["cs"]="standardni",
+ ["de"]="standard",
+ ["en"]="standard",
+ ["fr"]="standard",
+ ["it"]="standard",
+ ["nl"]="standaard",
+ ["pe"]="استاندارد",
+ ["ro"]="standard",
+ },
+ ["start"]={
+ ["cs"]="start",
+ ["de"]="start",
+ ["en"]="start",
+ ["fr"]="demarre",
+ ["it"]="inizia",
+ ["nl"]="start",
+ ["pe"]="شروع",
+ ["ro"]="start",
+ },
+ ["sticker"]={
+ ["cs"]="sticker",
+ ["de"]="sticker",
+ ["en"]="sticker",
+ ["fr"]="sticker",
+ ["it"]="sticker",
+ ["nl"]="sticker",
+ ["pe"]="دشنه",
+ ["ro"]="sticker",
+ },
+ ["stop"]={
+ ["cs"]="stop",
+ ["de"]="stop",
+ ["en"]="stop",
+ ["fr"]="stoppe",
+ ["it"]="termina",
+ ["nl"]="stop",
+ ["pe"]="پایان",
+ ["ro"]="stop",
+ },
+ ["stopper"]={
+ ["cs"]="predel",
+ ["de"]="trenner",
+ ["en"]="stopper",
+ ["fr"]="stopper",
+ ["it"]="stopper",
+ ["nl"]="afsluiter",
+ ["pe"]="ایست",
+ ["ro"]="stopper",
+ },
+ ["stretch"]={
+ ["cs"]="natahnout",
+ ["de"]="strecken",
+ ["en"]="stretch",
+ ["fr"]="etire",
+ ["it"]="dilata",
+ ["nl"]="rek",
+ ["pe"]="بکش",
+ ["ro"]="dilatat",
+ },
+ ["strict"]={
+ ["cs"]="striktni",
+ ["de"]="streng",
+ ["en"]="strict",
+ ["fr"]="strict",
+ ["it"]="rigido",
+ ["nl"]="streng",
+ ["pe"]="اکید",
+ ["ro"]="strict",
+ },
+ ["strong"]={
+ ["cs"]="strong",
+ ["de"]="strong",
+ ["en"]="sterk",
+ ["fr"]="strong",
+ ["it"]="strong",
+ ["nl"]="strong",
+ ["pe"]="Ù…ØÚ©Ù…",
+ ["ro"]="strong",
+ },
+ ["strut"]={
+ ["cs"]="strut",
+ ["de"]="strut",
+ ["en"]="strut",
+ ["fr"]="strut",
+ ["it"]="strut",
+ ["nl"]="strut",
+ ["pe"]="بست",
+ ["ro"]="strut",
+ },
+ ["sub"]={
+ ["cs"]="pod",
+ ["de"]="unter",
+ ["en"]="sub",
+ ["fr"]="sous",
+ ["it"]="sotto",
+ ["nl"]="sub",
+ ["pe"]="زیر",
+ ["ro"]="sub",
+ },
+ ["subbackward"]={
+ ["cs"]="podzpet",
+ ["de"]="unterrueckwaerts",
+ ["en"]="subbackward",
+ ["fr"]="sousretourarriere",
+ ["it"]="sottoindietro",
+ ["nl"]="subachteruit",
+ ["pe"]="زیرعقب‌گرد",
+ ["ro"]="subinapoi",
+ },
+ ["subformula"]={
+ ["cs"]="subrovnice",
+ ["de"]="subformel",
+ ["en"]="subformula",
+ ["fr"]="subformule",
+ ["it"]="subformula",
+ ["nl"]="subformule",
+ ["pe"]="زیرÙرمول",
+ ["ro"]="subformula",
+ },
+ ["subforward"]={
+ ["cs"]="podvpred",
+ ["de"]="untervorwaerts",
+ ["en"]="subforward",
+ ["fr"]="sousavance",
+ ["it"]="sottoavanti",
+ ["nl"]="subvooruit",
+ ["pe"]="زیرجلوگرد",
+ ["ro"]="subavans",
+ },
+ ["subject"]={
+ ["cs"]="tema",
+ ["de"]="thema",
+ ["en"]="subject",
+ ["fr"]="sujet",
+ ["it"]="argomento",
+ ["nl"]="onderwerp",
+ ["pe"]="موضوع",
+ ["ro"]="subiect",
+ },
+ ["subpage"]={
+ ["cs"]="podstranka",
+ ["de"]="unterseite",
+ ["en"]="subpage",
+ ["fr"]="souspage",
+ ["it"]="sottopagina",
+ ["nl"]="subpagina",
+ ["pe"]="زیرصÙØÙ‡",
+ ["ro"]="subpagina",
+ },
+ ["subsection"]={
+ ["cs"]="podsekce",
+ ["de"]="unterabsatz",
+ ["en"]="subsection",
+ ["fr"]="soussection",
+ ["it"]="sottocapoverso",
+ ["nl"]="subparagraaf",
+ ["pe"]="زیربخش",
+ ["ro"]="subsectiune",
+ },
+ ["subsubject"]={
+ ["cs"]="podtema",
+ ["de"]="unterthema",
+ ["en"]="subsubject",
+ ["fr"]="soussujet",
+ ["it"]="sottoargomento",
+ ["nl"]="subonderwerp",
+ ["pe"]="زیرموضوع",
+ ["ro"]="subsubiect",
+ },
+ ["subsubsection"]={
+ ["cs"]="podpodsekce",
+ ["de"]="unterunterabsatz",
+ ["en"]="subsubsection",
+ ["fr"]="soussoussection",
+ ["it"]="sottosottocapoverso",
+ ["nl"]="subsubparagraaf",
+ ["pe"]="زیرزیربخش",
+ ["ro"]="subsubsectiune",
+ },
+ ["subsubsubject"]={
+ ["cs"]="podpodtema",
+ ["de"]="unterunterthema",
+ ["en"]="subsubsubject",
+ ["fr"]="soussoussujet",
+ ["it"]="sottosottoargomento",
+ ["nl"]="subsubonderwerp",
+ ["pe"]="زیرزیرموضوع",
+ ["ro"]="subsubsubiect",
+ },
+ ["subsubsubsection"]={
+ ["cs"]="podpodpodsekce",
+ ["de"]="unterunterunterabsatz",
+ ["en"]="subsubsubsection",
+ ["fr"]="soussoussoussection",
+ ["it"]="sottosottosottocapoverso",
+ ["nl"]="subsubsubparagraaf",
+ ["pe"]="زیرزیرزیربخش",
+ ["ro"]="subsubsubsectiune",
+ },
+ ["subsubsubsubject"]={
+ ["cs"]="podpodpodtema",
+ ["de"]="unterunterunterthema",
+ ["en"]="subsubsubsubject",
+ ["fr"]="soussoussoussujet",
+ ["it"]="sottosottosottoargomento",
+ ["nl"]="subsubsubonderwerp",
+ ["pe"]="زیرزیرزیرموضوع",
+ ["ro"]="subsubsubsubiect",
+ },
+ ["subsubsubsubsection"]={
+ ["cs"]="podpodpodpodsekce",
+ ["de"]="unterunterunterunterabsatz",
+ ["en"]="subsubsubsubsection",
+ ["fr"]="soussoussoussoussection",
+ ["it"]="sottosottosottosottocapoverso",
+ ["nl"]="subsubsubsubparagraaf",
+ ["pe"]="زیرزیرزیرزیربخش",
+ ["ro"]="subsubsubsubsectiune",
+ },
+ ["subsubsubsubsubject"]={
+ ["cs"]="podpodpodpodtema",
+ ["de"]="unterunterunterunterthema",
+ ["en"]="subsubsubsubsubject",
+ ["fr"]="soussoussoussoussujet",
+ ["it"]="sottosottosottosottoargomento",
+ ["nl"]="subsubsubsubonderwerp",
+ ["pe"]="زیرزیرزیرزیرموضوع",
+ ["ro"]="subsubsubsubsubiect",
+ },
+ ["subsubsubsubsubsection"]={
+ ["cs"]="podpodpodpodpodsekce",
+ ["de"]="unterunterunterunterunterabsatz",
+ ["en"]="subsubsubsubsubsection",
+ ["fr"]="soussoussoussoussoussection",
+ ["it"]="sottosottosottosottosottocapoverso",
+ ["nl"]="subsubsubsubsubparagraaf",
+ ["pe"]="زیرزیرزیرزیرزیربخش",
+ ["ro"]="subsubsubsubsubsectiune",
+ },
+ ["subsubsubsubsubsubject"]={
+ ["cs"]="podpodpodpodpodtema",
+ ["de"]="unterunterunterunterunterthema",
+ ["en"]="subsubsubsubsubsubject",
+ ["fr"]="soussoussoussoussoussujet",
+ ["it"]="sottosottosottosottosottoargomento",
+ ["nl"]="subsubsubsubsubonderwerp",
+ ["pe"]="زیرزیرزیرزیرزیرموضوع",
+ ["ro"]="subsubsubsubsubsubiect",
+ },
+ ["sunday"]={
+ ["cs"]="nedele",
+ ["de"]="sonntag",
+ ["en"]="sunday",
+ ["fr"]="dimanche",
+ ["it"]="domenica",
+ ["nl"]="zondag",
+ ["pe"]="یک‌شنبه",
+ ["ro"]="duminica",
+ },
+ ["support"]={
+ ["cs"]="podpora",
+ ["de"]="support",
+ ["en"]="support",
+ ["fr"]="support",
+ ["it"]="supporto",
+ ["nl"]="support",
+ ["pe"]="Øمایت",
+ ["ro"]="suport",
+ },
+ ["sym"]={
+ ["cs"]="sym",
+ ["de"]="sym",
+ ["en"]="sym",
+ ["fr"]="sym",
+ ["it"]="sim",
+ ["nl"]="sym",
+ ["pe"]="نم",
+ ["ro"]="sym",
+ },
+ ["symbol"]={
+ ["cs"]="symbol",
+ ["de"]="symbol",
+ ["en"]="symbol",
+ ["fr"]="symbole",
+ ["it"]="simbolo",
+ ["nl"]="symbool",
+ ["pe"]="نماد",
+ ["ro"]="simbol",
+ },
+ ["synchronize"]={
+ ["cs"]="synchronize",
+ ["de"]="synchronize",
+ ["en"]="synchronize",
+ ["fr"]="synchronize",
+ ["it"]="synchronize",
+ ["nl"]="synchroniseer",
+ ["pe"]="تطابق",
+ ["ro"]="synchronize",
+ },
+ ["system"]={
+ ["cs"]="system",
+ ["de"]="systeme",
+ ["en"]="system",
+ ["fr"]="systeme",
+ ["it"]="sistema",
+ ["nl"]="systeem",
+ ["pe"]="سیستم",
+ ["ro"]="sistem",
+ },
+ ["table"]={
+ ["cs"]="tabulka",
+ ["de"]="tabelle",
+ ["en"]="table",
+ ["fr"]="tableau",
+ ["it"]="tabella",
+ ["nl"]="tabel",
+ ["pe"]="جدول",
+ ["ro"]="tabelul",
+ },
+ ["tablehead"]={
+ ["cs"]="zahlavitabulky",
+ ["de"]="tabellenueberschrift",
+ ["en"]="tablehead",
+ ["fr"]="tetetableau",
+ ["it"]="testatabella",
+ ["nl"]="tabelkop",
+ ["pe"]="سرجدول",
+ ["ro"]="antettabel",
+ },
+ ["tables"]={
+ ["cs"]="tabulky",
+ ["de"]="tabellen",
+ ["en"]="tables",
+ ["fr"]="tables",
+ ["it"]="tabelle",
+ ["nl"]="tabellen",
+ ["pe"]="جدولها",
+ ["ro"]="tabelele",
+ },
+ ["tabletail"]={
+ ["cs"]="konectabulky",
+ ["de"]="tabellenende",
+ ["en"]="tabletail",
+ ["fr"]="queuetableau",
+ ["it"]="codatabella",
+ ["nl"]="tabelstaart",
+ ["pe"]="دنباله‌جدول",
+ ["ro"]="subsoltabel",
+ },
+ ["tabulate"]={
+ ["cs"]="tabelator",
+ ["de"]="tabulator",
+ ["en"]="tabulate",
+ ["fr"]="tabule",
+ ["it"]="tabulato",
+ ["nl"]="tabulatie",
+ ["pe"]="جدول‌بندی",
+ ["ro"]="tabulate",
+ },
+ ["tabulatehead"]={
+ ["cs"]="tabulatehead",
+ ["de"]="tabulatehead",
+ ["en"]="tabulatehead",
+ ["fr"]="tetetabule",
+ ["it"]="testatabulato",
+ ["nl"]="tabulatiekop",
+ ["pe"]="سرجدول‌بندی",
+ ["ro"]="tabulatehead",
+ },
+ ["tabulatetail"]={
+ ["cs"]="tabulatetail",
+ ["de"]="tabulatetail",
+ ["en"]="tabulatetail",
+ ["fr"]="queuetabule",
+ ["it"]="codatabulato",
+ ["nl"]="tabulatiestaart",
+ ["pe"]="دنباله‌جدول‌بندی",
+ ["ro"]="tabulatetail",
+ },
+ ["tall"]={
+ ["cs"]="vysoko",
+ ["de"]="lang",
+ ["en"]="tall",
+ ["fr"]="long",
+ ["it"]="alto",
+ ["nl"]="lang",
+ ["pe"]="دراز",
+ ["ro"]="inalt",
+ },
+ ["teletype"]={
+ ["cs"]="strojopis",
+ ["de"]="fernschreiber",
+ ["en"]="teletype",
+ ["fr"]="teletype",
+ ["it"]="teletype",
+ ["nl"]="teletype",
+ ["pe"]="دورنگاره",
+ ["ro"]="teletype",
+ },
+ ["temporary"]={
+ ["cs"]="docasne",
+ ["de"]="temporaer",
+ ["en"]="temporary",
+ ["fr"]="temporaire",
+ ["it"]="temporaneo",
+ ["nl"]="voorlopig",
+ ["pe"]="موقتی",
+ ["ro"]="temporar",
+ },
+ ["test"]={
+ ["cs"]="test",
+ ["de"]="test",
+ ["en"]="test",
+ ["fr"]="test",
+ ["it"]="test",
+ ["nl"]="test",
+ ["pe"]="تست",
+ ["ro"]="test",
+ },
+ ["text"]={
+ ["cs"]="text",
+ ["de"]="text",
+ ["en"]="text",
+ ["fr"]="texte",
+ ["it"]="testo",
+ ["nl"]="tekst",
+ ["pe"]="متن",
+ ["ro"]="text",
+ },
+ ["three"]={
+ ["cs"]="tri",
+ ["de"]="drei",
+ ["en"]="three",
+ ["fr"]="trois",
+ ["it"]="tre",
+ ["nl"]="drie",
+ ["pe"]="سه",
+ ["ro"]="trei",
+ },
+ ["thursday"]={
+ ["cs"]="ctvrtek",
+ ["de"]="donnerstag",
+ ["en"]="thursday",
+ ["fr"]="jeudi",
+ ["it"]="giovedi",
+ ["nl"]="donderdag",
+ ["pe"]="پنج‌شنبه",
+ ["ro"]="joi",
+ },
+ ["title"]={
+ ["cs"]="titul",
+ ["de"]="titel",
+ ["en"]="title",
+ ["fr"]="titre",
+ ["it"]="titolo",
+ ["nl"]="titel",
+ ["pe"]="عنوان",
+ ["ro"]="titlu",
+ },
+ ["toggle"]={
+ ["cs"]="toggle",
+ ["de"]="toggle",
+ ["en"]="wissel",
+ ["fr"]="toggle",
+ ["it"]="toggle",
+ ["nl"]="toggle",
+ ["pe"]="تغییر",
+ ["ro"]="toggle",
+ },
+ ["tolerant"]={
+ ["cs"]="tolerantni",
+ ["de"]="tolerant",
+ ["en"]="tolerant",
+ ["fr"]="tolerant",
+ ["it"]="tollerante",
+ ["nl"]="soepel",
+ ["pe"]="بردبار",
+ ["ro"]="tolerant",
+ },
+ ["top"]={
+ ["cs"]="vrsek",
+ ["de"]="oben",
+ ["en"]="top",
+ ["fr"]="sup",
+ ["it"]="cima",
+ ["nl"]="boven",
+ ["pe"]="بالا",
+ ["ro"]="sus",
+ },
+ ["tuesday"]={
+ ["cs"]="utery",
+ ["de"]="dienstag",
+ ["en"]="tuesday",
+ ["fr"]="mardi",
+ ["it"]="martedi",
+ ["nl"]="dinsdag",
+ ["pe"]="سه‌شنبه",
+ ["ro"]="marti",
+ },
+ ["two"]={
+ ["cs"]="dve",
+ ["de"]="zwei",
+ ["en"]="two",
+ ["fr"]="deux",
+ ["it"]="due",
+ ["nl"]="twee",
+ ["pe"]="دو",
+ ["ro"]="doi",
+ },
+ ["txt"]={
+ ["cs"]="txt",
+ ["de"]="txt",
+ ["en"]="txt",
+ ["fr"]="txt",
+ ["it"]="txt",
+ ["nl"]="txt",
+ ["pe"]="txt",
+ ["ro"]="txt",
+ },
+ ["type"]={
+ ["cs"]="opis",
+ ["de"]="tippen",
+ ["en"]="type",
+ ["fr"]="type",
+ ["it"]="type",
+ ["nl"]="type",
+ ["pe"]="تایپ",
+ ["ro"]="type",
+ },
+ ["typing"]={
+ ["cs"]="typing",
+ ["de"]="tippen",
+ ["en"]="typing",
+ ["fr"]="typing",
+ ["it"]="typing",
+ ["nl"]="typen",
+ ["pe"]="تایپ‌کردن",
+ ["ro"]="typing",
+ },
+ ["unavailable"]={
+ ["cs"]="nedostupne",
+ ["de"]="nichtverfuegbar",
+ ["en"]="unavailable",
+ ["fr"]="indisponible",
+ ["it"]="nondisponibile",
+ ["nl"]="nietbeschikbaar",
+ ["pe"]="غیرموجود",
+ ["ro"]="nedisponibil",
+ },
+ ["unit"]={
+ ["cs"]="jednotka",
+ ["de"]="einheit",
+ ["en"]="unit",
+ ["fr"]="unite",
+ ["it"]="unita",
+ ["nl"]="eenheid",
+ ["pe"]="واØد",
+ ["ro"]="unitate",
+ },
+ ["units"]={
+ ["cs"]="jednotky",
+ ["de"]="einheiten",
+ ["en"]="units",
+ ["fr"]="unites",
+ ["it"]="unita",
+ ["nl"]="eenheden",
+ ["pe"]="واØدها",
+ ["ro"]="unitati",
+ },
+ ["unknown"]={
+ ["cs"]="neznamy",
+ ["de"]="unbekannt",
+ ["en"]="unknown",
+ ["fr"]="inconnu",
+ ["it"]="ignoto",
+ ["nl"]="onbekend",
+ ["pe"]="ناشناس",
+ ["ro"]="necunoscut",
+ },
+ ["unpacked"]={
+ ["cs"]="rozbalene",
+ ["de"]="ungepackt",
+ ["en"]="unpacked",
+ ["fr"]="degroupe",
+ ["it"]="unpacked",
+ ["nl"]="vanelkaar",
+ ["pe"]="غیرÙشرده",
+ ["ro"]="despachetat",
+ },
+ ["url"]={
+ ["cs"]="url",
+ ["de"]="url",
+ ["en"]="url",
+ ["fr"]="url",
+ ["it"]="url",
+ ["nl"]="url",
+ ["pe"]="url",
+ ["ro"]="url",
+ },
+ ["used"]={
+ ["cs"]="uzito",
+ ["de"]="verwende",
+ ["en"]="used",
+ ["fr"]="used",
+ ["it"]="usato",
+ ["nl"]="gebruikt",
+ ["pe"]="استÙاده‌شده",
+ ["ro"]="folosit",
+ },
+ ["value"]={
+ ["cs"]="hodnota",
+ ["de"]="wert",
+ ["en"]="value",
+ ["fr"]="valeur",
+ ["it"]="valore",
+ ["nl"]="waarde",
+ ["pe"]="مقدار",
+ ["ro"]="valoare",
+ },
+ ["vertical"]={
+ ["cs"]="vertikalne",
+ ["de"]="vertikal",
+ ["en"]="vertical",
+ ["fr"]="verticale",
+ ["it"]="verticale",
+ ["nl"]="vertikaal",
+ ["pe"]="عمودی",
+ ["ro"]="vertical",
+ },
+ ["very"]={
+ ["cs"]="velmi",
+ ["de"]="sehr",
+ ["en"]="very",
+ ["fr"]="tres",
+ ["it"]="molto",
+ ["nl"]="zeer",
+ ["pe"]="خیلی",
+ ["ro"]="foarte",
+ },
+ ["verystrict"]={
+ ["cs"]="velmistriktni",
+ ["de"]="sehrstreng",
+ ["en"]="verystrict",
+ ["fr"]="tresstrict",
+ ["it"]="moltorigido",
+ ["nl"]="zeerstreng",
+ ["pe"]="خیلی‌سختگیر",
+ ["ro"]="foartestrict",
+ },
+ ["verytolerant"]={
+ ["cs"]="velmitolerantni",
+ ["de"]="sehrtolerant",
+ ["en"]="verytolerant",
+ ["fr"]="trestolerant",
+ ["it"]="moltotollerante",
+ ["nl"]="zeersoepel",
+ ["pe"]="خیلی‌بردبار",
+ ["ro"]="foartetolerant",
+ },
+ ["weak"]={
+ ["cs"]="weak",
+ ["de"]="weak",
+ ["en"]="zwak",
+ ["fr"]="weak",
+ ["it"]="weak",
+ ["nl"]="weak",
+ ["pe"]="Ù‡Ùته",
+ ["ro"]="weak",
+ },
+ ["wednesday"]={
+ ["cs"]="streda",
+ ["de"]="mittwoch",
+ ["en"]="wednesday",
+ ["fr"]="mercredi",
+ ["it"]="mercoledi",
+ ["nl"]="woensdag",
+ ["pe"]="چهارشنبه",
+ ["ro"]="miercuri",
+ },
+ ["week"]={
+ ["cs"]="tyden",
+ ["de"]="woche",
+ ["en"]="week",
+ ["fr"]="semaine",
+ ["it"]="settimana",
+ ["nl"]="week",
+ ["pe"]="Ù‡Ùته",
+ ["ro"]="saptamana",
+ },
+ ["weekday"]={
+ ["cs"]="vsedniden",
+ ["de"]="wochentag",
+ ["en"]="weekday",
+ ["fr"]="joursemaine",
+ ["it"]="giornosettimana",
+ ["nl"]="weekdag",
+ ["pe"]="روزهÙته",
+ ["ro"]="zisaptamana",
+ },
+ ["white"]={
+ ["cs"]="bily",
+ ["de"]="weiss",
+ ["en"]="white",
+ ["fr"]="blanc",
+ ["it"]="bianco",
+ ["nl"]="wit",
+ ["pe"]="سÙید",
+ ["ro"]="alb",
+ },
+ ["wide"]={
+ ["cs"]="siroce",
+ ["de"]="breit",
+ ["en"]="wide",
+ ["fr"]="ample",
+ ["it"]="ampio",
+ ["nl"]="breed",
+ ["pe"]="گسترده",
+ ["ro"]="larg",
+ },
+ ["width"]={
+ ["cs"]="sirka",
+ ["de"]="breite",
+ ["en"]="width",
+ ["fr"]="largeur",
+ ["it"]="ampiezza",
+ ["nl"]="breedte",
+ ["pe"]="عرض",
+ ["ro"]="latime",
+ },
+ ["xml"]={
+ ["cs"]="xml",
+ ["de"]="xml",
+ ["en"]="xml",
+ ["fr"]="xml",
+ ["it"]="xml",
+ ["nl"]="xml",
+ ["pe"]="xml",
+ ["ro"]="xml",
+ },
+ ["year"]={
+ ["cs"]="rok",
+ ["de"]="jahr",
+ ["en"]="year",
+ ["fr"]="annee",
+ ["it"]="anno",
+ ["nl"]="jaar",
+ ["pe"]="سال",
+ ["ro"]="an",
+ },
+ ["yes"]={
+ ["cs"]="ano",
+ ["de"]="ja",
+ ["en"]="yes",
+ ["fr"]="oui",
+ ["it"]="si",
+ ["nl"]="ja",
+ ["pe"]="بله",
+ ["ro"]="da",
+ },
+ },
+}
diff --git a/tex/context/base/mult-def.tex b/tex/context/base/mult-def.tex
new file mode 100644
index 000000000..c49e6ffac
--- /dev/null
+++ b/tex/context/base/mult-def.tex
@@ -0,0 +1,27 @@
+%D \module
+%D [ file=mult-def,
+%D version=2008.10.22,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=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.
+
+\unprotect
+
+\setvalue{@interface@czech@}{cs}
+\setvalue{@interface@german@}{de}
+\setvalue{@interface@english@}{en}
+\setvalue{@interface@french@}{fr}
+\setvalue{@interface@italian@}{it}
+\setvalue{@interface@dutch@}{nl}
+\setvalue{@interface@persian@}{pe}
+\setvalue{@interface@romanian@}{ro}
+
+\input mult-\ifcsname @interface@\defaultinterface @\endcsname\csname @interface@\defaultinterface @\endcsname\else en\fi\relax
+
+\protect \endinput
diff --git a/tex/context/base/mult-en.tex b/tex/context/base/mult-en.tex
new file mode 100644
index 000000000..1fdc9799e
--- /dev/null
+++ b/tex/context/base/mult-en.tex
@@ -0,0 +1,1576 @@
+% this file is auto-generated, don't edit this file
+%
+% definitions for interface variables for language en
+%
+\setinterfacevariable{Addition}{Addition}
+\setinterfacevariable{Balloon}{Balloon}
+\setinterfacevariable{Character}{Character}
+\setinterfacevariable{Characters}{Characters}
+\setinterfacevariable{CloseDocument}{CloseDocument}
+\setinterfacevariable{ExitViewer}{ExitViewer}
+\setinterfacevariable{FirstPage}{FirstPage}
+\setinterfacevariable{FitHeight}{FitHeight}
+\setinterfacevariable{FitWidth}{FitWidth}
+\setinterfacevariable{GotoPage}{GotoPage}
+\setinterfacevariable{Greek}{Greek}
+\setinterfacevariable{Help}{Help}
+\setinterfacevariable{HideField}{HideField}
+\setinterfacevariable{HideLayer}{HideLayer}
+\setinterfacevariable{Key}{Key}
+\setinterfacevariable{LastPage}{LastPage}
+\setinterfacevariable{LoadForm}{LoadForm}
+\setinterfacevariable{MONTH}{MONTH}
+\setinterfacevariable{New}{New}
+\setinterfacevariable{NextJump}{NextJump}
+\setinterfacevariable{NextPage}{NextPage}
+\setinterfacevariable{Numbers}{Numbers}
+\setinterfacevariable{OpenNamedDocument}{OpenNamedDocument}
+\setinterfacevariable{Paragraph}{Paragraph}
+\setinterfacevariable{PauseMovie}{PauseMovie}
+\setinterfacevariable{PauseRendering}{PauseRendering}
+\setinterfacevariable{PauseSound}{PauseSound}
+\setinterfacevariable{PreviousJump}{PreviousJump}
+\setinterfacevariable{PreviousPage}{PreviousPage}
+\setinterfacevariable{PrintDocument}{PrintDocument}
+\setinterfacevariable{Query}{Query}
+\setinterfacevariable{QueryAgain}{QueryAgain}
+\setinterfacevariable{ResetForm}{ResetForm}
+\setinterfacevariable{ResumeMovie}{ResumeMovie}
+\setinterfacevariable{ResumeRendering}{ResumeRendering}
+\setinterfacevariable{ResumeSound}{ResumeSound}
+\setinterfacevariable{Romannumerals}{Romannumerals}
+\setinterfacevariable{SaveDocument}{SaveDocument}
+\setinterfacevariable{SaveForm}{SaveForm}
+\setinterfacevariable{SaveNamedDocument}{SaveNamedDocument}
+\setinterfacevariable{SearchAgain}{SearchAgain}
+\setinterfacevariable{SearchDocument}{SearchDocument}
+\setinterfacevariable{ShowBookmarks}{ShowBookmarks}
+\setinterfacevariable{ShowField}{ShowField}
+\setinterfacevariable{ShowThumbs}{ShowThumbs}
+\setinterfacevariable{StartMovie}{StartMovie}
+\setinterfacevariable{StartRendering}{StartRendering}
+\setinterfacevariable{StartSound}{StartSound}
+\setinterfacevariable{StopMovie}{StopMovie}
+\setinterfacevariable{StopRendering}{StopRendering}
+\setinterfacevariable{StopSound}{StopSound}
+\setinterfacevariable{SubmitForm}{SubmitForm}
+\setinterfacevariable{ToggleLayer}{ToggleLayer}
+\setinterfacevariable{ToggleViewer}{ToggleViewer}
+\setinterfacevariable{URL}{URL}
+\setinterfacevariable{VideLayer}{VideLayer}
+\setinterfacevariable{ViewerHelp}{ViewerHelp}
+\setinterfacevariable{WEEKDAY}{WEEKDAY}
+\setinterfacevariable{WORD}{WORD}
+\setinterfacevariable{abbreviation}{abbreviation}
+\setinterfacevariable{abbreviations}{abbreviations}
+\setinterfacevariable{absolute}{absolute}
+\setinterfacevariable{action}{action}
+\setinterfacevariable{after}{after}
+\setinterfacevariable{all}{all}
+\setinterfacevariable{always}{always}
+\setinterfacevariable{appendices}{appendices}
+\setinterfacevariable{appendix}{appendix}
+\setinterfacevariable{april}{April}
+\setinterfacevariable{atmargin}{atmargin}
+\setinterfacevariable{atpage}{atpage}
+\setinterfacevariable{august}{August}
+\setinterfacevariable{auto}{auto}
+\setinterfacevariable{autointro}{autointro}
+\setinterfacevariable{back}{back}
+\setinterfacevariable{background}{background}
+\setinterfacevariable{backmatter}{backmatter}
+\setinterfacevariable{backpart}{backpart}
+\setinterfacevariable{backspace}{backspace}
+\setinterfacevariable{backward}{backward}
+\setinterfacevariable{before}{before}
+\setinterfacevariable{big}{big}
+\setinterfacevariable{bigbodyfont}{bigbodyfont}
+\setinterfacevariable{bigpreference}{bigpreference}
+\setinterfacevariable{blank}{blank}
+\setinterfacevariable{blockquote}{blockquote}
+\setinterfacevariable{bodymatter}{bodymatter}
+\setinterfacevariable{bodypart}{bodypart}
+\setinterfacevariable{bold}{bold}
+\setinterfacevariable{bolditalic}{bolditalic}
+\setinterfacevariable{boldslanted}{boldslanted}
+\setinterfacevariable{bookmark}{bookmark}
+\setinterfacevariable{both}{both}
+\setinterfacevariable{bottom}{bottom}
+\setinterfacevariable{brief}{brief}
+\setinterfacevariable{broad}{broad}
+\setinterfacevariable{buffer}{buffer}
+\setinterfacevariable{by}{by}
+\setinterfacevariable{calligraphic}{calligraphic}
+\setinterfacevariable{cap}{cap}
+\setinterfacevariable{capital}{capital}
+\setinterfacevariable{center}{center}
+\setinterfacevariable{chapter}{chapter}
+\setinterfacevariable{character}{character}
+\setinterfacevariable{characters}{characters}
+\setinterfacevariable{color}{color}
+\setinterfacevariable{column}{column}
+\setinterfacevariable{columns}{columns}
+\setinterfacevariable{command}{command}
+\setinterfacevariable{commands}{commands}
+\setinterfacevariable{comment}{comment}
+\setinterfacevariable{component}{component}
+\setinterfacevariable{concept}{concept}
+\setinterfacevariable{content}{content}
+\setinterfacevariable{contents}{contents}
+\setinterfacevariable{continue}{continue}
+\setinterfacevariable{controls}{controls}
+\setinterfacevariable{conversion}{conversion}
+\setinterfacevariable{current}{current}
+\setinterfacevariable{cutspace}{cutspace}
+\setinterfacevariable{date}{date}
+\setinterfacevariable{day}{day}
+\setinterfacevariable{december}{December}
+\setinterfacevariable{default}{default}
+\setinterfacevariable{depth}{depth}
+\setinterfacevariable{description}{description}
+\setinterfacevariable{disable}{disable}
+\setinterfacevariable{display}{display}
+\setinterfacevariable{dot}{dot}
+\setinterfacevariable{doublesided}{doublesided}
+\setinterfacevariable{each}{each}
+\setinterfacevariable{edge}{edge}
+\setinterfacevariable{empty}{empty}
+\setinterfacevariable{endnote}{endnote}
+\setinterfacevariable{enumeration}{enumeration}
+\setinterfacevariable{environment}{environment}
+\setinterfacevariable{even}{even}
+\setinterfacevariable{external}{external}
+\setinterfacevariable{fact}{fact}
+\setinterfacevariable{february}{February}
+\setinterfacevariable{figure}{figure}
+\setinterfacevariable{figures}{figures}
+\setinterfacevariable{file}{file}
+\setinterfacevariable{final}{final}
+\setinterfacevariable{first}{first}
+\setinterfacevariable{firstcolumn}{firstcolumn}
+\setinterfacevariable{firstpage}{firstpage}
+\setinterfacevariable{firstsubpage}{firstsubpage}
+\setinterfacevariable{fit}{fit}
+\setinterfacevariable{five}{five}
+\setinterfacevariable{fix}{fix}
+\setinterfacevariable{fixed}{fixed}
+\setinterfacevariable{flexible}{flexible}
+\setinterfacevariable{float}{float}
+\setinterfacevariable{flushinner}{flushinner}
+\setinterfacevariable{flushleft}{flushleft}
+\setinterfacevariable{flushouter}{flushouter}
+\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{footer}{footer}
+\setinterfacevariable{footnote}{footnote}
+\setinterfacevariable{force}{force}
+\setinterfacevariable{foreground}{foreground}
+\setinterfacevariable{formeel}{formeel}
+\setinterfacevariable{formula}{formula}
+\setinterfacevariable{formulae}{formulae}
+\setinterfacevariable{forward}{forward}
+\setinterfacevariable{four}{four}
+\setinterfacevariable{frame}{frame}
+\setinterfacevariable{framedtext}{framedtext}
+\setinterfacevariable{friday}{friday}
+\setinterfacevariable{frontmatter}{frontmatter}
+\setinterfacevariable{frontpart}{frontpart}
+\setinterfacevariable{global}{global}
+\setinterfacevariable{graphic}{graphic}
+\setinterfacevariable{graphics}{graphics}
+\setinterfacevariable{gray}{gray}
+\setinterfacevariable{greek}{greek}
+\setinterfacevariable{grid}{grid}
+\setinterfacevariable{halfline}{halfline}
+\setinterfacevariable{handwritten}{handwritten}
+\setinterfacevariable{hang}{hang}
+\setinterfacevariable{hanging}{hanging}
+\setinterfacevariable{head}{head}
+\setinterfacevariable{header}{header}
+\setinterfacevariable{height}{height}
+\setinterfacevariable{helptext}{helptext}
+\setinterfacevariable{hencefore}{hencefore}
+\setinterfacevariable{here}{here}
+\setinterfacevariable{hereafter}{hereafter}
+\setinterfacevariable{hidden}{hidden}
+\setinterfacevariable{hiding}{hiding}
+\setinterfacevariable{high}{high}
+\setinterfacevariable{horizontal}{horizontal}
+\setinterfacevariable{hyphenated}{hyphenated}
+\setinterfacevariable{hz}{hz}
+\setinterfacevariable{inbetween}{inbetween}
+\setinterfacevariable{index}{index}
+\setinterfacevariable{indices}{indices}
+\setinterfacevariable{informeel}{informeel}
+\setinterfacevariable{inherit}{inherit}
+\setinterfacevariable{inleft}{inleft}
+\setinterfacevariable{inmargin}{inmargin}
+\setinterfacevariable{inner}{inner}
+\setinterfacevariable{inneredge}{inneredge}
+\setinterfacevariable{innermargin}{innermargin}
+\setinterfacevariable{inright}{inright}
+\setinterfacevariable{interaction}{interaction}
+\setinterfacevariable{interactionmenu}{interactionmenu}
+\setinterfacevariable{intermezzi}{intermezzi}
+\setinterfacevariable{intermezzo}{intermezzo}
+\setinterfacevariable{intext}{intext}
+\setinterfacevariable{intro}{intro}
+\setinterfacevariable{italic}{italic}
+\setinterfacevariable{italicbold}{italicbold}
+\setinterfacevariable{item}{item}
+\setinterfacevariable{itemize}{itemize}
+\setinterfacevariable{its}{its}
+\setinterfacevariable{january}{January}
+\setinterfacevariable{joinedup}{joinedup}
+\setinterfacevariable{july}{July}
+\setinterfacevariable{june}{June}
+\setinterfacevariable{keep}{keep}
+\setinterfacevariable{knockout}{knockout}
+\setinterfacevariable{label}{label}
+\setinterfacevariable{landscape}{landscape}
+\setinterfacevariable{last}{last}
+\setinterfacevariable{lastcolumn}{lastcolumn}
+\setinterfacevariable{lastpage}{lastpage}
+\setinterfacevariable{lastpagenumber}{lastpagenumber}
+\setinterfacevariable{lastsubpage}{lastsubpage}
+\setinterfacevariable{left}{left}
+\setinterfacevariable{leftedge}{leftedge}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{leftmargin}
+\setinterfacevariable{leftpage}{leftpage}
+\setinterfacevariable{legend}{legend}
+\setinterfacevariable{lesshyphenation}{lesshyphenation}
+\setinterfacevariable{line}{line}
+\setinterfacevariable{linenote}{linenote}
+\setinterfacevariable{lines}{lines}
+\setinterfacevariable{list}{list}
+\setinterfacevariable{local}{local}
+\setinterfacevariable{localenvironment}{localenvironment}
+\setinterfacevariable{logo}{logo}
+\setinterfacevariable{logos}{logos}
+\setinterfacevariable{lohi}{lohi}
+\setinterfacevariable{loose}{loose}
+\setinterfacevariable{low}{low}
+\setinterfacevariable{ls}{ls}
+\setinterfacevariable{makeup}{makeup}
+\setinterfacevariable{mar}{mar}
+\setinterfacevariable{march}{March}
+\setinterfacevariable{margin}{margin}
+\setinterfacevariable{marginedge}{marginedge}
+\setinterfacevariable{margintitle}{margintitle}
+\setinterfacevariable{marking}{marking}
+\setinterfacevariable{mathalignment}{mathalignment}
+\setinterfacevariable{mathcases}{mathcases}
+\setinterfacevariable{mathmatrix}{mathmatrix}
+\setinterfacevariable{max}{max}
+\setinterfacevariable{may}{May}
+\setinterfacevariable{mediaeval}{mediaeval}
+\setinterfacevariable{medium}{medium}
+\setinterfacevariable{middle}{middle}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{minheight}{minheight}
+\setinterfacevariable{minwidth}{minwidth}
+\setinterfacevariable{mirrored}{mirrored}
+\setinterfacevariable{monday}{monday}
+\setinterfacevariable{mono}{mono}
+\setinterfacevariable{month}{month}
+\setinterfacevariable{morehyphenation}{morehyphenation}
+\setinterfacevariable{name}{name}
+\setinterfacevariable{narrow}{narrow}
+\setinterfacevariable{negative}{negative}
+\setinterfacevariable{never}{never}
+\setinterfacevariable{new}{new}
+\setinterfacevariable{next}{next}
+\setinterfacevariable{nextevenpage}{nextevenpage}
+\setinterfacevariable{nextoddpage}{nextoddpage}
+\setinterfacevariable{nextpage}{nextpage}
+\setinterfacevariable{nextsubpage}{nextsubpage}
+\setinterfacevariable{no}{no}
+\setinterfacevariable{nocheck}{nocheck}
+\setinterfacevariable{nofit}{nofit}
+\setinterfacevariable{nogrid}{nogrid}
+\setinterfacevariable{nohz}{nohz}
+\setinterfacevariable{nomarking}{nomarking}
+\setinterfacevariable{none}{none}
+\setinterfacevariable{nonumber}{nonumber}
+\setinterfacevariable{normal}{normal}
+\setinterfacevariable{nospacing}{nospacing}
+\setinterfacevariable{not}{not}
+\setinterfacevariable{nothanging}{nothanging}
+\setinterfacevariable{nothyphenated}{nothyphenated}
+\setinterfacevariable{november}{November}
+\setinterfacevariable{nowhere}{nowhere}
+\setinterfacevariable{nowhite}{nowhite}
+\setinterfacevariable{number}{number}
+\setinterfacevariable{numbers}{numbers}
+\setinterfacevariable{october}{October}
+\setinterfacevariable{odd}{odd}
+\setinterfacevariable{off}{off}
+\setinterfacevariable{offset}{offset}
+\setinterfacevariable{old}{old}
+\setinterfacevariable{on}{on}
+\setinterfacevariable{one}{one}
+\setinterfacevariable{opposite}{opposite}
+\setinterfacevariable{outer}{outer}
+\setinterfacevariable{outeredge}{outeredge}
+\setinterfacevariable{outermargin}{outermargin}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{packed}{packed}
+\setinterfacevariable{page}{page}
+\setinterfacevariable{pagecomment}{pagecomment}
+\setinterfacevariable{pagenumber}{pagenumber}
+\setinterfacevariable{paper}{paper}
+\setinterfacevariable{paragraph}{paragraph}
+\setinterfacevariable{part}{part}
+\setinterfacevariable{positive}{positive}
+\setinterfacevariable{postponing}{postponing}
+\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{preference}{preference}
+\setinterfacevariable{preview}{preview}
+\setinterfacevariable{previous}{previous}
+\setinterfacevariable{previousevenpage}{previousevenpage}
+\setinterfacevariable{previousoddpage}{previousoddpage}
+\setinterfacevariable{previouspage}{previouspage}
+\setinterfacevariable{previoussubpage}{previoussubpage}
+\setinterfacevariable{printable}{printable}
+\setinterfacevariable{process}{process}
+\setinterfacevariable{product}{product}
+\setinterfacevariable{program}{program}
+\setinterfacevariable{project}{project}
+\setinterfacevariable{protected}{protected}
+\setinterfacevariable{quadruple}{quadruple}
+\setinterfacevariable{quotation}{quotation}
+\setinterfacevariable{quote}{quote}
+\setinterfacevariable{ran}{ran}
+\setinterfacevariable{random}{random}
+\setinterfacevariable{readonly}{readonly}
+\setinterfacevariable{rectangular}{rectangular}
+\setinterfacevariable{referral}{referral}
+\setinterfacevariable{register}{register}
+\setinterfacevariable{regular}{regular}
+\setinterfacevariable{rekening}{rekening}
+\setinterfacevariable{relative}{relative}
+\setinterfacevariable{repeat}{repeat}
+\setinterfacevariable{required}{required}
+\setinterfacevariable{reset}{reset}
+\setinterfacevariable{reverse}{reverse}
+\setinterfacevariable{right}{right}
+\setinterfacevariable{rightedge}{rightedge}
+\setinterfacevariable{righthanging}{righthanging}
+\setinterfacevariable{rightmargin}{rightmargin}
+\setinterfacevariable{rightpage}{rightpage}
+\setinterfacevariable{roman}{roman}
+\setinterfacevariable{romannumerals}{romannumerals}
+\setinterfacevariable{rotate}{rotate}
+\setinterfacevariable{rotated}{rotated}
+\setinterfacevariable{round}{round}
+\setinterfacevariable{row}{row}
+\setinterfacevariable{rule}{rule}
+\setinterfacevariable{samepage}{samepage}
+\setinterfacevariable{sans}{sans}
+\setinterfacevariable{sansbold}{sansbold}
+\setinterfacevariable{sansserif}{sansserif}
+\setinterfacevariable{saturday}{saturday}
+\setinterfacevariable{screen}{screen}
+\setinterfacevariable{section}{section}
+\setinterfacevariable{sectionblockenvironment}{sectionblockenvironment}
+\setinterfacevariable{sectionnumber}{sectionnumber}
+\setinterfacevariable{see}{see}
+\setinterfacevariable{september}{September}
+\setinterfacevariable{serif}{serif}
+\setinterfacevariable{serried}{serried}
+\setinterfacevariable{setups}{setups}
+\setinterfacevariable{sheet}{sheet}
+\setinterfacevariable{singlesided}{singlesided}
+\setinterfacevariable{slanted}{slanted}
+\setinterfacevariable{slantedbold}{slantedbold}
+\setinterfacevariable{small}{small}
+\setinterfacevariable{smallbodyfont}{smallbodyfont}
+\setinterfacevariable{smallbold}{smallbold}
+\setinterfacevariable{smallbolditalic}{smallbolditalic}
+\setinterfacevariable{smallboldslanted}{smallboldslanted}
+\setinterfacevariable{smallcaps}{smallcaps}
+\setinterfacevariable{smallitalic}{smallitalic}
+\setinterfacevariable{smallitalicbold}{smallitalicbold}
+\setinterfacevariable{smallnormal}{smallnormal}
+\setinterfacevariable{smallslanted}{smallslanted}
+\setinterfacevariable{smallslantedbold}{smallslantedbold}
+\setinterfacevariable{smalltype}{smalltype}
+\setinterfacevariable{somewhere}{somewhere}
+\setinterfacevariable{sorted}{sorted}
+\setinterfacevariable{space}{space}
+\setinterfacevariable{spacing}{spacing}
+\setinterfacevariable{speech}{speech}
+\setinterfacevariable{split}{split}
+\setinterfacevariable{spot}{spot}
+\setinterfacevariable{standard}{standard}
+\setinterfacevariable{start}{start}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{stop}
+\setinterfacevariable{stopper}{stopper}
+\setinterfacevariable{stretch}{stretch}
+\setinterfacevariable{strict}{strict}
+\setinterfacevariable{strong}{sterk}
+\setinterfacevariable{strut}{strut}
+\setinterfacevariable{sub}{sub}
+\setinterfacevariable{subbackward}{subbackward}
+\setinterfacevariable{subformula}{subformula}
+\setinterfacevariable{subforward}{subforward}
+\setinterfacevariable{subject}{subject}
+\setinterfacevariable{subpage}{subpage}
+\setinterfacevariable{subsection}{subsection}
+\setinterfacevariable{subsubject}{subsubject}
+\setinterfacevariable{subsubsection}{subsubsection}
+\setinterfacevariable{subsubsubject}{subsubsubject}
+\setinterfacevariable{subsubsubsection}{subsubsubsection}
+\setinterfacevariable{subsubsubsubject}{subsubsubsubject}
+\setinterfacevariable{subsubsubsubsection}{subsubsubsubsection}
+\setinterfacevariable{subsubsubsubsubject}{subsubsubsubsubject}
+\setinterfacevariable{subsubsubsubsubsection}{subsubsubsubsubsection}
+\setinterfacevariable{subsubsubsubsubsubject}{subsubsubsubsubsubject}
+\setinterfacevariable{sunday}{sunday}
+\setinterfacevariable{support}{support}
+\setinterfacevariable{sym}{sym}
+\setinterfacevariable{symbol}{symbol}
+\setinterfacevariable{synchronize}{synchronize}
+\setinterfacevariable{system}{system}
+\setinterfacevariable{table}{table}
+\setinterfacevariable{tablehead}{tablehead}
+\setinterfacevariable{tables}{tables}
+\setinterfacevariable{tabletail}{tabletail}
+\setinterfacevariable{tabulate}{tabulate}
+\setinterfacevariable{tabulatehead}{tabulatehead}
+\setinterfacevariable{tabulatetail}{tabulatetail}
+\setinterfacevariable{tall}{tall}
+\setinterfacevariable{teletype}{teletype}
+\setinterfacevariable{temporary}{temporary}
+\setinterfacevariable{test}{test}
+\setinterfacevariable{text}{text}
+\setinterfacevariable{three}{three}
+\setinterfacevariable{thursday}{thursday}
+\setinterfacevariable{title}{title}
+\setinterfacevariable{toggle}{wissel}
+\setinterfacevariable{tolerant}{tolerant}
+\setinterfacevariable{top}{top}
+\setinterfacevariable{tuesday}{tuesday}
+\setinterfacevariable{two}{two}
+\setinterfacevariable{txt}{txt}
+\setinterfacevariable{type}{type}
+\setinterfacevariable{typing}{typing}
+\setinterfacevariable{unavailable}{unavailable}
+\setinterfacevariable{unit}{unit}
+\setinterfacevariable{units}{units}
+\setinterfacevariable{unknown}{unknown}
+\setinterfacevariable{unpacked}{unpacked}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{used}
+\setinterfacevariable{value}{value}
+\setinterfacevariable{vertical}{vertical}
+\setinterfacevariable{very}{very}
+\setinterfacevariable{verystrict}{verystrict}
+\setinterfacevariable{verytolerant}{verytolerant}
+\setinterfacevariable{weak}{zwak}
+\setinterfacevariable{wednesday}{wednesday}
+\setinterfacevariable{week}{week}
+\setinterfacevariable{weekday}{weekday}
+\setinterfacevariable{white}{white}
+\setinterfacevariable{wide}{wide}
+\setinterfacevariable{width}{width}
+\setinterfacevariable{xml}{xml}
+\setinterfacevariable{year}{year}
+\setinterfacevariable{yes}{yes}
+% definitions for interface constants for language en
+%
+\setinterfaceconstant{action}{action}
+\setinterfaceconstant{address}{address}
+\setinterfaceconstant{after}{after}
+\setinterfaceconstant{afterhead}{afterhead}
+\setinterfaceconstant{afterkey}{afterkey}
+\setinterfaceconstant{align}{align}
+\setinterfaceconstant{aligncharacter}{aligncharacter}
+\setinterfaceconstant{alignmentcharacter}{alignmentcharacter}
+\setinterfaceconstant{aligntitle}{aligntitle}
+\setinterfaceconstant{alternative}{alternative}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{arrow}
+\setinterfaceconstant{at}{at}
+\setinterfaceconstant{author}{author}
+\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autofile}{autofile}
+\setinterfaceconstant{autofocus}{autofocus}
+\setinterfaceconstant{autohang}{autohang}
+\setinterfaceconstant{autostrut}{autostrut}
+\setinterfaceconstant{autowidth}{autowidth}
+\setinterfaceconstant{axis}{axis}
+\setinterfaceconstant{background}{background}
+\setinterfaceconstant{backgroundcolor}{backgroundcolor}
+\setinterfaceconstant{backgroundcorner}{backgroundcorner}
+\setinterfaceconstant{backgrounddepth}{backgrounddepth}
+\setinterfaceconstant{backgroundoffset}{backgroundoffset}
+\setinterfaceconstant{backgroundradius}{backgroundradius}
+\setinterfaceconstant{backgroundscreen}{backgroundscreen}
+\setinterfaceconstant{backspace}{backspace}
+\setinterfaceconstant{balance}{balance}
+\setinterfaceconstant{before}{before}
+\setinterfaceconstant{beforehead}{beforehead}
+\setinterfaceconstant{bet}{bet}
+\setinterfaceconstant{big}{big}
+\setinterfaceconstant{blank}{blank}
+\setinterfaceconstant{blockway}{blockway}
+\setinterfaceconstant{bodyfont}{bodyfont}
+\setinterfaceconstant{bookmark}{bookmark}
+\setinterfaceconstant{bottom}{bottom}
+\setinterfaceconstant{bottomdistance}{bottomdistance}
+\setinterfaceconstant{bottomframe}{bottomframe}
+\setinterfaceconstant{bottomoffset}{bottomoffset}
+\setinterfaceconstant{bottomspace}{bottomspace}
+\setinterfaceconstant{bottomstate}{bottomstate}
+\setinterfaceconstant{cache}{cache}
+\setinterfaceconstant{calculate}{calculate}
+\setinterfaceconstant{ccommand}{ccommand}
+\setinterfaceconstant{click}{click}
+\setinterfaceconstant{clickin}{clickin}
+\setinterfaceconstant{clickout}{clickout}
+\setinterfaceconstant{clipoffset}{clipoffset}
+\setinterfaceconstant{closeaction}{closeaction}
+\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepageaction}{closepageaction}
+\setinterfaceconstant{closesymbol}{closesymbol}
+\setinterfaceconstant{color}{color}
+\setinterfaceconstant{column}{column}
+\setinterfaceconstant{columndistance}{columndistance}
+\setinterfaceconstant{columns}{columns}
+\setinterfaceconstant{command}{command}
+\setinterfaceconstant{commandafter}{commandafter}
+\setinterfaceconstant{commandbefore}{commandbefore}
+\setinterfaceconstant{commands}{commands}
+\setinterfaceconstant{component}{component}
+\setinterfaceconstant{compoundhyphen}{compoundhyphen}
+\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{continue}{continue}
+\setinterfaceconstant{contrastcolor}{contrastcolor}
+\setinterfaceconstant{controls}{controls}
+\setinterfaceconstant{conversion}{conversion}
+\setinterfaceconstant{convertfile}{convertfile}
+\setinterfaceconstant{corner}{corner}
+\setinterfaceconstant{coupling}{coupling}
+\setinterfaceconstant{couplingway}{couplingway}
+\setinterfaceconstant{criterium}{criterium}
+\setinterfaceconstant{current}{current}
+\setinterfaceconstant{cutspace}{cutspace}
+\setinterfaceconstant{dash}{dash}
+\setinterfaceconstant{dat}{dat}
+\setinterfaceconstant{date}{date}
+\setinterfaceconstant{deepnumbercommand}{deepnumbercommand}
+\setinterfaceconstant{deeptextcommand}{deeptextcommand}
+\setinterfaceconstant{default}{default}
+\setinterfaceconstant{delay}{delay}
+\setinterfaceconstant{depth}{depth}
+\setinterfaceconstant{depthcorrection}{depthcorrection}
+\setinterfaceconstant{direction}{direction}
+\setinterfaceconstant{directory}{directory}
+\setinterfaceconstant{display}{display}
+\setinterfaceconstant{distance}{distance}
+\setinterfaceconstant{dot}{dot}
+\setinterfaceconstant{doublesided}{doublesided}
+\setinterfaceconstant{dummy}{dummy}
+\setinterfaceconstant{dx}{dx}
+\setinterfaceconstant{dy}{dy}
+\setinterfaceconstant{edge}{edge}
+\setinterfaceconstant{edgedistance}{edgedistance}
+\setinterfaceconstant{empty}{empty}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{evenmargin}
+\setinterfaceconstant{expansion}{expansion}
+\setinterfaceconstant{extras}{extras}
+\setinterfaceconstant{factor}{factor}
+\setinterfaceconstant{fallback}{fallback}
+\setinterfaceconstant{family}{family}
+\setinterfaceconstant{fieldbackgroundcolor}{fieldbackgroundcolor}
+\setinterfaceconstant{fieldframecolor}{fieldframecolor}
+\setinterfaceconstant{fieldlayer}{fieldlayer}
+\setinterfaceconstant{fieldoffset}{fieldoffset}
+\setinterfaceconstant{file}{file}
+\setinterfaceconstant{focus}{focus}
+\setinterfaceconstant{focusin}{focusin}
+\setinterfaceconstant{focusout}{focusout}
+\setinterfaceconstant{footer}{footer}
+\setinterfaceconstant{footerdistance}{footerdistance}
+\setinterfaceconstant{footerstate}{footerstate}
+\setinterfaceconstant{foregroundcolor}{foregroundcolor}
+\setinterfaceconstant{foregroundstyle}{foregroundstyle}
+\setinterfaceconstant{format}{format}
+\setinterfaceconstant{frame}{frame}
+\setinterfaceconstant{framecolor}{framecolor}
+\setinterfaceconstant{framecorner}{framecorner}
+\setinterfaceconstant{framedepth}{framedepth}
+\setinterfaceconstant{frameoffset}{frameoffset}
+\setinterfaceconstant{frameradius}{frameradius}
+\setinterfaceconstant{frames}{frames}
+\setinterfaceconstant{from}{from}
+\setinterfaceconstant{get}{get}
+\setinterfaceconstant{global}{global}
+\setinterfaceconstant{grid}{grid}
+\setinterfaceconstant{hang}{hang}
+\setinterfaceconstant{headcolor}{headcolor}
+\setinterfaceconstant{headcommand}{headcommand}
+\setinterfaceconstant{headconversion}{headconversion}
+\setinterfaceconstant{header}{header}
+\setinterfaceconstant{headerdistance}{headerdistance}
+\setinterfaceconstant{headerstate}{headerstate}
+\setinterfaceconstant{headlabel}{headlabel}
+\setinterfaceconstant{headnumber}{headnumber}
+\setinterfaceconstant{headstyle}{headstyle}
+\setinterfaceconstant{height}{height}
+\setinterfaceconstant{hfactor}{hfactor}
+\setinterfaceconstant{hfil}{hfil}
+\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horoffset}{horoffset}
+\setinterfaceconstant{hyphen}{hyphen}
+\setinterfaceconstant{icommand}{icommand}
+\setinterfaceconstant{in}{in}
+\setinterfaceconstant{inbetween}{inbetween}
+\setinterfaceconstant{increment}{increment}
+\setinterfaceconstant{incrementnumber}{incrementnumber}
+\setinterfaceconstant{indenting}{indenting}
+\setinterfaceconstant{indentnext}{indentnext}
+\setinterfaceconstant{indicator}{indicator}
+\setinterfaceconstant{inner}{inner}
+\setinterfaceconstant{innermargin}{innermargin}
+\setinterfaceconstant{inputfile}{inputfile}
+\setinterfaceconstant{interaction}{interaction}
+\setinterfaceconstant{interlinespace}{interlinespace}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{items}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{keyword}
+\setinterfaceconstant{label}{label}
+\setinterfaceconstant{left}{left}
+\setinterfaceconstant{leftcolor}{leftcolor}
+\setinterfaceconstant{leftcompoundhyphen}{leftcompoundhyphen}
+\setinterfaceconstant{leftedge}{leftedge}
+\setinterfaceconstant{leftedgedistance}{leftedgedistance}
+\setinterfaceconstant{leftframe}{leftframe}
+\setinterfaceconstant{lefthyphen}{lefthyphen}
+\setinterfaceconstant{leftmargin}{leftmargin}
+\setinterfaceconstant{leftmargindistance}{leftmargindistance}
+\setinterfaceconstant{leftoffset}{leftoffset}
+\setinterfaceconstant{leftquotation}{leftquotation}
+\setinterfaceconstant{leftquote}{leftquote}
+\setinterfaceconstant{leftsentence}{leftsentence}
+\setinterfaceconstant{leftspeech}{leftspeech}
+\setinterfaceconstant{leftstyle}{leftstyle}
+\setinterfaceconstant{leftsubsentence}{leftsubsentence}
+\setinterfaceconstant{lefttext}{lefttext}
+\setinterfaceconstant{leftwidth}{leftwidth}
+\setinterfaceconstant{level}{level}
+\setinterfaceconstant{levels}{levels}
+\setinterfaceconstant{limittext}{limittext}
+\setinterfaceconstant{line}{line}
+\setinterfaceconstant{linecorrection}{linecorrection}
+\setinterfaceconstant{lines}{lines}
+\setinterfaceconstant{list}{list}
+\setinterfaceconstant{listtext}{listtext}
+\setinterfaceconstant{local}{local}
+\setinterfaceconstant{location}{location}
+\setinterfaceconstant{logo}{logo}
+\setinterfaceconstant{logos}{logos}
+\setinterfaceconstant{marcolor}{marcolor}
+\setinterfaceconstant{margin}{margin}
+\setinterfaceconstant{margindistance}{margindistance}
+\setinterfaceconstant{marginedge}{marginedge}
+\setinterfaceconstant{marginedgetext}{marginedgetext}
+\setinterfaceconstant{margintext}{margintext}
+\setinterfaceconstant{marking}{marking}
+\setinterfaceconstant{marstyle}{marstyle}
+\setinterfaceconstant{max}{max}
+\setinterfaceconstant{maxheight}{maxheight}
+\setinterfaceconstant{maxwidth}{maxwidth}
+\setinterfaceconstant{menu}{menu}
+\setinterfaceconstant{method}{method}
+\setinterfaceconstant{middle}{middle}
+\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middletext}{middletext}
+\setinterfaceconstant{midsentence}{midsentence}
+\setinterfaceconstant{min}{min}
+\setinterfaceconstant{mindepth}{mindepth}
+\setinterfaceconstant{minheight}{minheight}
+\setinterfaceconstant{minwidth}{minwidth}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{name}
+\setinterfaceconstant{nbottom}{nbottom}
+\setinterfaceconstant{nc}{nc}
+\setinterfaceconstant{next}{next}
+\setinterfaceconstant{nl}{nl}
+\setinterfaceconstant{nleft}{nleft}
+\setinterfaceconstant{nlines}{nlines}
+\setinterfaceconstant{norm}{norm}
+\setinterfaceconstant{nr}{nr}
+\setinterfaceconstant{nright}{nright}
+\setinterfaceconstant{ntop}{ntop}
+\setinterfaceconstant{number}{number}
+\setinterfaceconstant{numbercolor}{numbercolor}
+\setinterfaceconstant{numbercommand}{numbercommand}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numbering}
+\setinterfaceconstant{numberseparator}{numberseparator}
+\setinterfaceconstant{numberstyle}{numberstyle}
+\setinterfaceconstant{numberwidth}{numberwidth}
+\setinterfaceconstant{nx}{nx}
+\setinterfaceconstant{ny}{ny}
+\setinterfaceconstant{object}{object}
+\setinterfaceconstant{obstruction}{obstruction}
+\setinterfaceconstant{oddmargin}{oddmargin}
+\setinterfaceconstant{offset}{offset}
+\setinterfaceconstant{openaction}{openaction}
+\setinterfaceconstant{openpageaction}{openpageaction}
+\setinterfaceconstant{option}{option}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{outermargin}{outermargin}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{ownnumber}
+\setinterfaceconstant{page}{page}
+\setinterfaceconstant{pageboundaries}{pageboundaries}
+\setinterfaceconstant{pagecolor}{pagecolor}
+\setinterfaceconstant{pagecommand}{pagecommand}
+\setinterfaceconstant{pagenumber}{pagenumber}
+\setinterfaceconstant{pagestate}{pagestate}
+\setinterfaceconstant{pagestyle}{pagestyle}
+\setinterfaceconstant{palet}{palet}
+\setinterfaceconstant{paper}{paper}
+\setinterfaceconstant{paragraph}{paragraph}
+\setinterfaceconstant{place}{place}
+\setinterfaceconstant{placehead}{placehead}
+\setinterfaceconstant{placestopper}{placestopper}
+\setinterfaceconstant{position}{position}
+\setinterfaceconstant{prefix}{prefix}
+\setinterfaceconstant{preset}{preset}
+\setinterfaceconstant{preview}{preview}
+\setinterfaceconstant{previous}{previous}
+\setinterfaceconstant{previousnumber}{previousnumber}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{radius}{radius}
+\setinterfaceconstant{random}{random}
+\setinterfaceconstant{reduction}{reduction}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{reference}{reference}
+\setinterfaceconstant{referencing}{referencing}
+\setinterfaceconstant{regionin}{regionin}
+\setinterfaceconstant{regionout}{regionout}
+\setinterfaceconstant{repeat}{repeat}
+\setinterfaceconstant{reset}{reset}
+\setinterfaceconstant{resetnumber}{resetnumber}
+\setinterfaceconstant{resolution}{resolution}
+\setinterfaceconstant{right}{right}
+\setinterfaceconstant{rightcolor}{rightcolor}
+\setinterfaceconstant{rightcompoundhyphen}{rightcompoundhyphen}
+\setinterfaceconstant{rightedge}{rightedge}
+\setinterfaceconstant{rightedgedistance}{rightedgedistance}
+\setinterfaceconstant{rightframe}{rightframe}
+\setinterfaceconstant{righthyphen}{righthyphen}
+\setinterfaceconstant{rightmargin}{rightmargin}
+\setinterfaceconstant{rightmargindistance}{rightmargindistance}
+\setinterfaceconstant{rightoffset}{rightoffset}
+\setinterfaceconstant{rightquotation}{rightquotation}
+\setinterfaceconstant{rightquote}{rightquote}
+\setinterfaceconstant{rightsentence}{rightsentence}
+\setinterfaceconstant{rightspeech}{rightspeech}
+\setinterfaceconstant{rightstyle}{rightstyle}
+\setinterfaceconstant{rightsubsentence}{rightsubsentence}
+\setinterfaceconstant{righttext}{righttext}
+\setinterfaceconstant{rightwidth}{rightwidth}
+\setinterfaceconstant{rotation}{rotation}
+\setinterfaceconstant{rule}{rule}
+\setinterfaceconstant{rulecolor}{rulecolor}
+\setinterfaceconstant{rulethickness}{rulethickness}
+\setinterfaceconstant{samepage}{samepage}
+\setinterfaceconstant{sample}{sample}
+\setinterfaceconstant{scale}{scale}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{screen}
+\setinterfaceconstant{section}{section}
+\setinterfaceconstant{sectionnumber}{sectionnumber}
+\setinterfaceconstant{separator}{separator}
+\setinterfaceconstant{set}{set}
+\setinterfaceconstant{setups}{setups}
+\setinterfaceconstant{side}{side}
+\setinterfaceconstant{sidealign}{sidealign}
+\setinterfaceconstant{sidemethod}{sidemethod}
+\setinterfaceconstant{sidespaceafter}{sidespaceafter}
+\setinterfaceconstant{sidespacebefore}{sidespacebefore}
+\setinterfaceconstant{sign}{sign}
+\setinterfaceconstant{size}{size}
+\setinterfaceconstant{small}{small}
+\setinterfaceconstant{sorttype}{sorttype}
+\setinterfaceconstant{source}{source}
+\setinterfaceconstant{space}{space}
+\setinterfaceconstant{spaceafter}{spaceafter}
+\setinterfaceconstant{spacebefore}{spacebefore}
+\setinterfaceconstant{spaceinbetween}{spaceinbetween}
+\setinterfaceconstant{spacing}{spacing}
+\setinterfaceconstant{split}{split}
+\setinterfaceconstant{splitcolor}{splitcolor}
+\setinterfaceconstant{splitmethod}{splitmethod}
+\setinterfaceconstant{splitoffset}{splitoffset}
+\setinterfaceconstant{spot}{spot}
+\setinterfaceconstant{stack}{stack}
+\setinterfaceconstant{start}{start}
+\setinterfaceconstant{state}{state}
+\setinterfaceconstant{step}{step}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{stopper}
+\setinterfaceconstant{stretch}{stretch}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{style}
+\setinterfaceconstant{sub}{sub}
+\setinterfaceconstant{subtitle}{subtitle}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{sx}{sx}
+\setinterfaceconstant{sy}{sy}
+\setinterfaceconstant{symalign}{symalign}
+\setinterfaceconstant{symbol}{symbol}
+\setinterfaceconstant{symbolset}{symbolset}
+\setinterfaceconstant{symcolor}{symcolor}
+\setinterfaceconstant{symstyle}{symstyle}
+\setinterfaceconstant{synonym}{synonym}
+\setinterfaceconstant{synonymcolor}{synonymcolor}
+\setinterfaceconstant{synonymstyle}{synonymstyle}
+\setinterfaceconstant{tab}{tab}
+\setinterfaceconstant{text}{text}
+\setinterfaceconstant{textcolor}{textcolor}
+\setinterfaceconstant{textcommand}{textcommand}
+\setinterfaceconstant{textdistance}{textdistance}
+\setinterfaceconstant{textlayer}{textlayer}
+\setinterfaceconstant{textmargin}{textmargin}
+\setinterfaceconstant{textmethod}{textmethod}
+\setinterfaceconstant{textseparator}{textseparator}
+\setinterfaceconstant{textsize}{textsize}
+\setinterfaceconstant{textstate}{textstate}
+\setinterfaceconstant{textstyle}{textstyle}
+\setinterfaceconstant{textwidth}{textwidth}
+\setinterfaceconstant{title}{title}
+\setinterfaceconstant{titlecolor}{titlecolor}
+\setinterfaceconstant{titlecommand}{titlecommand}
+\setinterfaceconstant{titledistance}{titledistance}
+\setinterfaceconstant{titleleft}{titleleft}
+\setinterfaceconstant{titleright}{titleright}
+\setinterfaceconstant{titlestyle}{titlestyle}
+\setinterfaceconstant{to}{to}
+\setinterfaceconstant{tolerance}{tolerance}
+\setinterfaceconstant{top}{top}
+\setinterfaceconstant{topdistance}{topdistance}
+\setinterfaceconstant{topframe}{topframe}
+\setinterfaceconstant{topoffset}{topoffset}
+\setinterfaceconstant{topspace}{topspace}
+\setinterfaceconstant{topstate}{topstate}
+\setinterfaceconstant{type}{type}
+\setinterfaceconstant{unit}{unit}
+\setinterfaceconstant{unknownreference}{unknownreference}
+\setinterfaceconstant{urlalternative}{urlalternative}
+\setinterfaceconstant{urlspace}{urlspace}
+\setinterfaceconstant{validate}{validate}
+\setinterfaceconstant{vcommand}{vcommand}
+\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vfil}{vfil}
+\setinterfaceconstant{voffset}{voffset}
+\setinterfaceconstant{way}{way}
+\setinterfaceconstant{wfactor}{wfactor}
+\setinterfaceconstant{white}{white}
+\setinterfaceconstant{width}{width}
+\setinterfaceconstant{xfactor}{xfactor}
+\setinterfaceconstant{xmax}{xmax}
+\setinterfaceconstant{xoffset}{xoffset}
+\setinterfaceconstant{xscale}{xscale}
+\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yfactor}{yfactor}
+\setinterfaceconstant{ymax}{ymax}
+\setinterfaceconstant{yoffset}{yoffset}
+\setinterfaceconstant{yscale}{yscale}
+\setinterfaceconstant{ystep}{ystep}
+% definitions for interface elements for language en
+%
+\setinterfaceelement{begin}{begin}
+\setinterfaceelement{complete}{complete}
+\setinterfaceelement{coupled}{coupled}
+\setinterfaceelement{currentlocal}{currentlocal}
+\setinterfaceelement{emptyone}{empty}
+\setinterfaceelement{emptytwo}{empty}
+\setinterfaceelement{end}{end}
+\setinterfaceelement{endsetup}{}
+\setinterfaceelement{get}{get}
+\setinterfaceelement{increment}{increment}
+\setinterfaceelement{list}{list}
+\setinterfaceelement{listof}{listof}
+\setinterfaceelement{load}{load}
+\setinterfaceelement{local}{local}
+\setinterfaceelement{makeup}{makeup}
+\setinterfaceelement{next}{next}
+\setinterfaceelement{place}{place}
+\setinterfaceelement{previous}{previous}
+\setinterfaceelement{previouslocal}{previouslocal}
+\setinterfaceelement{reserve}{reserve}
+\setinterfaceelement{see}{see}
+\setinterfaceelement{setup}{setup}
+\setinterfaceelement{start}{start}
+\setinterfaceelement{stop}{stop}
+\setinterfaceelement{text}{text}
+\setinterfaceelement{type}{type}
+% definitions for interface commands for language en
+%
+\setinterfacecommand{CAPPED}{CAP}
+\setinterfacecommand{Character}{Character}
+\setinterfacecommand{Characters}{Characters}
+\setinterfacecommand{LABELTEXT}{LABELTEXT}
+\setinterfacecommand{MONTH}{MONTH}
+\setinterfacecommand{Numbers}{Numbers}
+\setinterfacecommand{Romannumerals}{Romannumerals}
+\setinterfacecommand{SmallCapped}{Cap}
+\setinterfacecommand{SmallCaps}{Caps}
+\setinterfacecommand{WEEKDAY}{WEEKDAY}
+\setinterfacecommand{WORD}{WORD}
+\setinterfacecommand{WORDS}{WORDS}
+\setinterfacecommand{Word}{Word}
+\setinterfacecommand{Words}{Words}
+\setinterfacecommand{about}{about}
+\setinterfacecommand{adaptlayout}{adaptlayout}
+\setinterfacecommand{arg}{arg}
+\setinterfacecommand{at}{at}
+\setinterfacecommand{atleftmargin}{atleftmargin}
+\setinterfacecommand{atpage}{atpage}
+\setinterfacecommand{atrightmargin}{atrightmargin}
+\setinterfacecommand{background}{background}
+\setinterfacecommand{backspace}{backspace}
+\setinterfacecommand{blackrule}{blackrule}
+\setinterfacecommand{blackrules}{blackrules}
+\setinterfacecommand{blank}{blank}
+\setinterfacecommand{bookmark}{bookmark}
+\setinterfacecommand{bottomdistance}{bottomdistance}
+\setinterfacecommand{bottomheight}{bottomheight}
+\setinterfacecommand{bottomspace}{bottomspace}
+\setinterfacecommand{but}{but}
+\setinterfacecommand{button}{button}
+\setinterfacecommand{bypassblocks}{bypassblocks}
+\setinterfacecommand{character}{character}
+\setinterfacecommand{characters}{characters}
+\setinterfacecommand{chem}{chem}
+\setinterfacecommand{clip}{clip}
+\setinterfacecommand{clonefield}{clonefield}
+\setinterfacecommand{color}{color}
+\setinterfacecommand{colorbar}{colorbar}
+\setinterfacecommand{colorvalue}{colorvalue}
+\setinterfacecommand{column}{column}
+\setinterfacecommand{comment}{comment}
+\setinterfacecommand{comparecolorgroup}{comparecolorgroup}
+\setinterfacecommand{comparepalet}{comparepalet}
+\setinterfacecommand{completepagenumber}{completepagenumber}
+\setinterfacecommand{completeregister}{completeregister}
+\setinterfacecommand{component}{component}
+\setinterfacecommand{convertnumber}{convertnumber}
+\setinterfacecommand{copyfield}{copyfield}
+\setinterfacecommand{correctwhitespace}{correctwhitespace}
+\setinterfacecommand{coupledocument}{coupledocument}
+\setinterfacecommand{couplemarking}{couplemarking}
+\setinterfacecommand{couplepage}{couplepage}
+\setinterfacecommand{couplepaper}{couplepaper}
+\setinterfacecommand{coupleregister}{coupleregister}
+\setinterfacecommand{crlf}{crlf}
+\setinterfacecommand{currentdate}{currentdate}
+\setinterfacecommand{currentheadnumber}{currentheadnumber}
+\setinterfacecommand{cutspace}{cutspace}
+\setinterfacecommand{date}{date}
+\setinterfacecommand{decouplemarking}{decouplemarking}
+\setinterfacecommand{decrementnumber}{decrementnumber}
+\setinterfacecommand{define}{define}
+\setinterfacecommand{defineaccent}{defineaccent}
+\setinterfacecommand{defineblank}{defineblank}
+\setinterfacecommand{defineblock}{defineblock}
+\setinterfacecommand{definebodyfont}{definebodyfont}
+\setinterfacecommand{definebodyfontenvironment}{definebodyfontenvironment}
+\setinterfacecommand{definebuffer}{definebuffer}
+\setinterfacecommand{definecharacter}{definecharacter}
+\setinterfacecommand{definecolor}{definecolor}
+\setinterfacecommand{definecolorgroup}{definecolorgroup}
+\setinterfacecommand{definecolumnbreak}{definecolumnbreak}
+\setinterfacecommand{definecolumnset}{definecolumnset}
+\setinterfacecommand{definecombination}{definecombination}
+\setinterfacecommand{definecombinedlist}{definecombinedlist}
+\setinterfacecommand{definecommand}{definecommand}
+\setinterfacecommand{defineconversion}{defineconversion}
+\setinterfacecommand{definedescription}{definedescription}
+\setinterfacecommand{defineenumeration}{defineenumeration}
+\setinterfacecommand{definefield}{definefield}
+\setinterfacecommand{definefieldstack}{definefieldstack}
+\setinterfacecommand{definefiguresymbol}{definefiguresymbol}
+\setinterfacecommand{definefloat}{definefloat}
+\setinterfacecommand{definefont}{definefont}
+\setinterfacecommand{definefontstyle}{definefontstyle}
+\setinterfacecommand{definefontsynonym}{definefontsynonym}
+\setinterfacecommand{defineframed}{defineframed}
+\setinterfacecommand{defineframedtext}{defineframedtext}
+\setinterfacecommand{definehbox}{definehbox}
+\setinterfacecommand{definehead}{definehead}
+\setinterfacecommand{defineindenting}{defineindenting}
+\setinterfacecommand{defineinmargin}{defineinmargin}
+\setinterfacecommand{defineinteractionmenu}{defineinteractionmenu}
+\setinterfacecommand{defineitemgroup}{defineitemgroup}
+\setinterfacecommand{definelabel}{definelabel}
+\setinterfacecommand{definelayer}{definelayer}
+\setinterfacecommand{definelayout}{definelayout}
+\setinterfacecommand{definelist}{definelist}
+\setinterfacecommand{definelogo}{definelogo}
+\setinterfacecommand{definemainfield}{definemainfield}
+\setinterfacecommand{definemakeup}{definemakeup}
+\setinterfacecommand{definemarking}{definemarking}
+\setinterfacecommand{definemathalignment}{definemathalignment}
+\setinterfacecommand{defineoutput}{defineoutput}
+\setinterfacecommand{defineoverlay}{defineoverlay}
+\setinterfacecommand{definepagebreak}{definepagebreak}
+\setinterfacecommand{definepalet}{definepalet}
+\setinterfacecommand{definepapersize}{definepapersize}
+\setinterfacecommand{defineparagraphs}{defineparagraphs}
+\setinterfacecommand{defineplacement}{defineplacement}
+\setinterfacecommand{defineprofile}{defineprofile}
+\setinterfacecommand{defineprogram}{defineprogram}
+\setinterfacecommand{definerawfont}{definerawfont}
+\setinterfacecommand{definereference}{definereference}
+\setinterfacecommand{definereferenceformat}{definereferenceformat}
+\setinterfacecommand{definereferencelist}{definereferencelist}
+\setinterfacecommand{defineregister}{defineregister}
+\setinterfacecommand{definerule}{definerule}
+\setinterfacecommand{definesection}{definesection}
+\setinterfacecommand{definesectionblock}{definesectionblock}
+\setinterfacecommand{definesorting}{definesorting}
+\setinterfacecommand{definestartstop}{definestartstop}
+\setinterfacecommand{definestyle}{definestyle}
+\setinterfacecommand{definesubfield}{definesubfield}
+\setinterfacecommand{definesymbol}{definesymbol}
+\setinterfacecommand{definesynonyms}{definesynonyms}
+\setinterfacecommand{definetabletemplate}{definetabletemplate}
+\setinterfacecommand{definetabulate}{definetabulate}
+\setinterfacecommand{definetext}{definetext}
+\setinterfacecommand{definetextposition}{definetextposition}
+\setinterfacecommand{definetextvariable}{definetextvariable}
+\setinterfacecommand{definetype}{definetype}
+\setinterfacecommand{definetyping}{definetyping}
+\setinterfacecommand{defineversion}{defineversion}
+\setinterfacecommand{determineheadnumber}{determineheadnumber}
+\setinterfacecommand{determinelistcharacteristics}{determinelistcharacteristics}
+\setinterfacecommand{determineregistercharacteristics}{determineregistercharacteristics}
+\setinterfacecommand{dimension}{dimension}
+\setinterfacecommand{disableinteractionmenu}{disableinteractionmenu}
+\setinterfacecommand{domicile}{domicile}
+\setinterfacecommand{donttest}{donttest}
+\setinterfacecommand{edgedistance}{edgedistance}
+\setinterfacecommand{edgewidth}{edgewidth}
+\setinterfacecommand{emptylines}{emptylines}
+\setinterfacecommand{environment}{environment}
+\setinterfacecommand{externalfigure}{externalfigure}
+\setinterfacecommand{fact}{fact}
+\setinterfacecommand{field}{field}
+\setinterfacecommand{fieldstack}{fieldstack}
+\setinterfacecommand{fillinfield}{fillinfield}
+\setinterfacecommand{fillinline}{fillinline}
+\setinterfacecommand{fillinrules}{fillinrules}
+\setinterfacecommand{fillintext}{fillintext}
+\setinterfacecommand{fitfield}{fitfield}
+\setinterfacecommand{fixedspace}{fixedspace}
+\setinterfacecommand{fixedspaces}{fixedspaces}
+\setinterfacecommand{followprofile}{followprofile}
+\setinterfacecommand{followprofileversion}{followprofileversion}
+\setinterfacecommand{followversion}{followversion}
+\setinterfacecommand{footerdistance}{footerdistance}
+\setinterfacecommand{footerheight}{footerheight}
+\setinterfacecommand{footnote}{footnote}
+\setinterfacecommand{footnotetext}{footnotetext}
+\setinterfacecommand{forceblocks}{forceblocks}
+\setinterfacecommand{formulanumber}{formulanumber}
+\setinterfacecommand{fraction}{fraction}
+\setinterfacecommand{framed}{framed}
+\setinterfacecommand{from}{from}
+\setinterfacecommand{getbuffer}{getbuffer}
+\setinterfacecommand{getmarking}{getmarking}
+\setinterfacecommand{getnumber}{getnumber}
+\setinterfacecommand{godown}{godown}
+\setinterfacecommand{goto}{goto}
+\setinterfacecommand{gotobox}{gotobox}
+\setinterfacecommand{gotopage}{gotopage}
+\setinterfacecommand{graycolor}{graycolor}
+\setinterfacecommand{greyvalue}{greyvalue}
+\setinterfacecommand{grid}{grid}
+\setinterfacecommand{hairline}{hairline}
+\setinterfacecommand{head}{head}
+\setinterfacecommand{headerdistance}{headerdistance}
+\setinterfacecommand{headerheight}{headerheight}
+\setinterfacecommand{headlevel}{headlevel}
+\setinterfacecommand{headnumber}{headnumber}
+\setinterfacecommand{headsym}{headsym}
+\setinterfacecommand{headtext}{headtext}
+\setinterfacecommand{hideblocks}{hideblocks}
+\setinterfacecommand{high}{high}
+\setinterfacecommand{hl}{hl}
+\setinterfacecommand{immediatebetweenlist}{immediatebetweenlist}
+\setinterfacecommand{immediatetolist}{immediatetolist}
+\setinterfacecommand{in}{in}
+\setinterfacecommand{incrementnumber}{incrementnumber}
+\setinterfacecommand{indenting}{indenting}
+\setinterfacecommand{inframed}{inframed}
+\setinterfacecommand{infull}{infull}
+\setinterfacecommand{ininner}{ininner}
+\setinterfacecommand{inleft}{inleft}
+\setinterfacecommand{inleftedge}{inleftedge}
+\setinterfacecommand{inleftmargin}{inleftmargin}
+\setinterfacecommand{inline}{inline}
+\setinterfacecommand{inmargin}{inmargin}
+\setinterfacecommand{inmframed}{inmaframed}
+\setinterfacecommand{inneredgedistance}{inneredgedistance}
+\setinterfacecommand{inneredgewidth}{inneredgewidth}
+\setinterfacecommand{innermargindistance}{innermargindistance}
+\setinterfacecommand{innermarginwidth}{innermarginwidth}
+\setinterfacecommand{inothermargin}{inothermargin}
+\setinterfacecommand{inouter}{inouter}
+\setinterfacecommand{inright}{inright}
+\setinterfacecommand{inrightedge}{inrightedge}
+\setinterfacecommand{inrightmargin}{inrightmargin}
+\setinterfacecommand{installlanguage}{installlanguage}
+\setinterfacecommand{interactionbar}{interactionbar}
+\setinterfacecommand{interactionbuttons}{interactionbuttons}
+\setinterfacecommand{interactionmenu}{interactionmenu}
+\setinterfacecommand{item}{item}
+\setinterfacecommand{items}{items}
+\setinterfacecommand{its}{its}
+\setinterfacecommand{keepblocks}{keepblocks}
+\setinterfacecommand{label}{label}
+\setinterfacecommand{labels}{labels}
+\setinterfacecommand{labeltext}{labeltext}
+\setinterfacecommand{language}{language}
+\setinterfacecommand{leftaligned}{leftaligned}
+\setinterfacecommand{leftedgedistance}{leftedgedistance}
+\setinterfacecommand{leftedgewidth}{leftedgewidth}
+\setinterfacecommand{leftmargindistance}{leftmargindistance}
+\setinterfacecommand{leftmarginwidth}{leftmarginwidth}
+\setinterfacecommand{leg}{leg}
+\setinterfacecommand{linewidth}{linethickness}
+\setinterfacecommand{listheight}{listheight}
+\setinterfacecommand{listlength}{listlength}
+\setinterfacecommand{listsymbol}{listsymbol}
+\setinterfacecommand{listwidth}{listwidth}
+\setinterfacecommand{logfields}{logfields}
+\setinterfacecommand{lohi}{lohi}
+\setinterfacecommand{low}{low}
+\setinterfacecommand{macroname}{name}
+\setinterfacecommand{mainlanguage}{mainlanguage}
+\setinterfacecommand{makeupheight}{makeupheight}
+\setinterfacecommand{makeupwidth}{makeupwidth}
+\setinterfacecommand{mar}{mar}
+\setinterfacecommand{margindistance}{margindistance}
+\setinterfacecommand{marginrule}{marginrule}
+\setinterfacecommand{margintext}{margintext}
+\setinterfacecommand{margintitle}{margintitle}
+\setinterfacecommand{marginwidth}{marginwidth}
+\setinterfacecommand{marginword}{marginword}
+\setinterfacecommand{marking}{marking}
+\setinterfacecommand{markversion}{markversion}
+\setinterfacecommand{mathematics}{mathematics}
+\setinterfacecommand{menubutton}{menubutton}
+\setinterfacecommand{mframed}{maframed}
+\setinterfacecommand{midaligned}{midaligned}
+\setinterfacecommand{mirror}{mirror}
+\setinterfacecommand{month}{month}
+\setinterfacecommand{moveformula}{moveformula}
+\setinterfacecommand{moveongrid}{moveongrid}
+\setinterfacecommand{movesidefloat}{movesidefloat}
+\setinterfacecommand{navigating}{navigating}
+\setinterfacecommand{nodimension}{nodimension}
+\setinterfacecommand{noheaderandfooterlines}{noheaderandfooterlines}
+\setinterfacecommand{noindenting}{noindenting}
+\setinterfacecommand{nolist}{nolist}
+\setinterfacecommand{nomarking}{nomarking}
+\setinterfacecommand{nomoreblocks}{nomoreblocks}
+\setinterfacecommand{nomorefiles}{nomorefiles}
+\setinterfacecommand{nop}{nop}
+\setinterfacecommand{nospace}{nospace}
+\setinterfacecommand{note}{note}
+\setinterfacecommand{notopandbottomlines}{notopandbottomlines}
+\setinterfacecommand{notsmallcapped}{nocap}
+\setinterfacecommand{nowhitespace}{nowhitespace}
+\setinterfacecommand{numberofsubpages}{numberofsubpages}
+\setinterfacecommand{numbers}{numbers}
+\setinterfacecommand{outeredgedistance}{outeredgedistance}
+\setinterfacecommand{outeredgewidth}{outeredgewidth}
+\setinterfacecommand{outermargindistance}{outermargindistance}
+\setinterfacecommand{outermarginwidth}{outermarginwidth}
+\setinterfacecommand{overbar}{overbar}
+\setinterfacecommand{overbars}{overbars}
+\setinterfacecommand{overstrike}{overstrike}
+\setinterfacecommand{overstrikes}{overstrikes}
+\setinterfacecommand{packed}{packed}
+\setinterfacecommand{page}{page}
+\setinterfacecommand{pagedepth}{pagedepth}
+\setinterfacecommand{pagenumber}{pagenumber}
+\setinterfacecommand{pageoffset}{pageoffset}
+\setinterfacecommand{pagereference}{pagereference}
+\setinterfacecommand{pagetype}{pagetype}
+\setinterfacecommand{paperheight}{paperheight}
+\setinterfacecommand{paperwidth}{paperwidth}
+\setinterfacecommand{periods}{periods}
+\setinterfacecommand{plaatsruwelijst}{placerawlist}
+\setinterfacecommand{placebookmarks}{placebookmarks}
+\setinterfacecommand{placecombinedlist}{placecombinedlist}
+\setinterfacecommand{placefloat}{placefloat}
+\setinterfacecommand{placefootnotes}{placefootnotes}
+\setinterfacecommand{placeformula}{placeformula}
+\setinterfacecommand{placeheadnumber}{placeheadnumber}
+\setinterfacecommand{placeheadtext}{placeheadtext}
+\setinterfacecommand{placelegend}{placelegend}
+\setinterfacecommand{placelist}{placelist}
+\setinterfacecommand{placelocalfootnotes}{placelocalfootnotes}
+\setinterfacecommand{placelogos}{placelogos}
+\setinterfacecommand{placeongrid}{placeongrid}
+\setinterfacecommand{placeontopofeachother}{placeontopofeachother}
+\setinterfacecommand{placepagenumber}{placepagenumber}
+\setinterfacecommand{placereferencelist}{placereferencelist}
+\setinterfacecommand{placeregister}{placeregister}
+\setinterfacecommand{placerule}{placerule}
+\setinterfacecommand{placesidebyside}{placesidebyside}
+\setinterfacecommand{placesubformula}{placesubformula}
+\setinterfacecommand{placetextvariable}{placetextvariable}
+\setinterfacecommand{position}{position}
+\setinterfacecommand{positiontext}{positiontext}
+\setinterfacecommand{printpaperheight}{printpaperheight}
+\setinterfacecommand{printpaperwidth}{printpaperwidth}
+\setinterfacecommand{processblocks}{processblocks}
+\setinterfacecommand{processpage}{processpage}
+\setinterfacecommand{product}{product}
+\setinterfacecommand{program}{program}
+\setinterfacecommand{project}{project}
+\setinterfacecommand{publication}{publication}
+\setinterfacecommand{quotation}{quotation}
+\setinterfacecommand{quote}{quote}
+\setinterfacecommand{ran}{ran}
+\setinterfacecommand{redo}{redo}
+\setinterfacecommand{ref}{ref}
+\setinterfacecommand{reference}{reference}
+\setinterfacecommand{referral}{referral}
+\setinterfacecommand{referraldate}{referraldate}
+\setinterfacecommand{referring}{referring}
+\setinterfacecommand{remark}{remark}
+\setinterfacecommand{reset}{reset}
+\setinterfacecommand{resetmarking}{resetmarking}
+\setinterfacecommand{resetnumber}{resetnumber}
+\setinterfacecommand{resettext}{resettextcontent}
+\setinterfacecommand{rightaligned}{rightaligned}
+\setinterfacecommand{rightedgedistance}{rightedgedistance}
+\setinterfacecommand{rightedgewidth}{rightedgewidth}
+\setinterfacecommand{rightmargindistance}{rightmargindistance}
+\setinterfacecommand{rightmarginwidth}{rightmarginwidth}
+\setinterfacecommand{romannumerals}{romannumerals}
+\setinterfacecommand{rotate}{rotate}
+\setinterfacecommand{scale}{scale}
+\setinterfacecommand{screen}{screen}
+\setinterfacecommand{selectblocks}{selectblocks}
+\setinterfacecommand{selectpaper}{selectpaper}
+\setinterfacecommand{selectversion}{selectversion}
+\setinterfacecommand{setnumber}{setnumber}
+\setinterfacecommand{settextcontent}{settextcontent}
+\setinterfacecommand{settextvariable}{settextvariable}
+\setinterfacecommand{setupalign}{setupalign}
+\setinterfacecommand{setuparranging}{setuparranging}
+\setinterfacecommand{setupbackground}{setupbackground}
+\setinterfacecommand{setupbackgrounds}{setupbackgrounds}
+\setinterfacecommand{setupblackrules}{setupblackrules}
+\setinterfacecommand{setupblank}{setupblank}
+\setinterfacecommand{setupblock}{setupblock}
+\setinterfacecommand{setupbodyfont}{setupbodyfont}
+\setinterfacecommand{setupbodyfontenvironment}{setupbodyfontenvironment}
+\setinterfacecommand{setupbottom}{setupbottom}
+\setinterfacecommand{setupbottomtexts}{setupbottomtexts}
+\setinterfacecommand{setupbuffer}{setupbuffer}
+\setinterfacecommand{setupbuttons}{setupbuttons}
+\setinterfacecommand{setupcapitals}{setupcapitals}
+\setinterfacecommand{setupcaption}{setupcaption}
+\setinterfacecommand{setupcaptions}{setupcaptions}
+\setinterfacecommand{setupclipping}{setupclipping}
+\setinterfacecommand{setupcolor}{setupcolor}
+\setinterfacecommand{setupcolors}{setupcolors}
+\setinterfacecommand{setupcolumns}{setupcolumns}
+\setinterfacecommand{setupcolumnset}{setupcolumnset}
+\setinterfacecommand{setupcolumnsetlines}{setupcolumnsetlines}
+\setinterfacecommand{setupcolumnsetstart}{setupcolumnsetstart}
+\setinterfacecommand{setupcombinations}{setupcombinations}
+\setinterfacecommand{setupcombinedlist}{setupcombinedlist}
+\setinterfacecommand{setupcomment}{setupcomment}
+\setinterfacecommand{setupdescriptions}{setupdescriptions}
+\setinterfacecommand{setupenumerations}{setupenumerations}
+\setinterfacecommand{setupexternalfigures}{setupexternalfigures}
+\setinterfacecommand{setupfield}{setupfield}
+\setinterfacecommand{setupfields}{setupfields}
+\setinterfacecommand{setupfillinlines}{setupfillinlines}
+\setinterfacecommand{setupfillinrules}{setupfillinrules}
+\setinterfacecommand{setupfloat}{setupfloat}
+\setinterfacecommand{setupfloats}{setupfloats}
+\setinterfacecommand{setupfloatsplitting}{setupfloatsplitting}
+\setinterfacecommand{setupfooter}{setupfooter}
+\setinterfacecommand{setupfootertexts}{setupfootertexts}
+\setinterfacecommand{setupfootnotedefinition}{setupfootnotedefinition}
+\setinterfacecommand{setupfootnotes}{setupfootnotes}
+\setinterfacecommand{setupforms}{setupforms}
+\setinterfacecommand{setupformulas}{setupformulae}
+\setinterfacecommand{setupframed}{setupframed}
+\setinterfacecommand{setupframedtexts}{setupframedtexts}
+\setinterfacecommand{setuphead}{setuphead}
+\setinterfacecommand{setupheader}{setupheader}
+\setinterfacecommand{setupheadertexts}{setupheadertexts}
+\setinterfacecommand{setupheadnumber}{setupheadnumber}
+\setinterfacecommand{setupheads}{setupheads}
+\setinterfacecommand{setupheadtext}{setupheadtext}
+\setinterfacecommand{setuphyphenmark}{setuphyphenmark}
+\setinterfacecommand{setupindentations}{setupindentations}
+\setinterfacecommand{setupindenting}{setupindenting}
+\setinterfacecommand{setupinmargin}{setupinmargin}
+\setinterfacecommand{setupinteraction}{setupinteraction}
+\setinterfacecommand{setupinteractionbar}{setupinteractionbar}
+\setinterfacecommand{setupinteractionmenu}{setupinteractionmenu}
+\setinterfacecommand{setupinteractionscreen}{setupinteractionscreen}
+\setinterfacecommand{setupinterlinespace}{setupinterlinespace}
+\setinterfacecommand{setupitemgroup}{setupitemgroup}
+\setinterfacecommand{setupitemgroups}{setupitemizations}
+\setinterfacecommand{setupitems}{setupitems}
+\setinterfacecommand{setuplabeltext}{setuplabeltext}
+\setinterfacecommand{setuplanguage}{setuplanguage}
+\setinterfacecommand{setuplayout}{setuplayout}
+\setinterfacecommand{setuplegend}{setuplegend}
+\setinterfacecommand{setuplinenumbering}{setuplinenumbering}
+\setinterfacecommand{setuplines}{setuplines}
+\setinterfacecommand{setuplinewidth}{setuplinewidth}
+\setinterfacecommand{setuplist}{setuplist}
+\setinterfacecommand{setupmakeup}{setupmakeup}
+\setinterfacecommand{setupmarginblocks}{setupmarginblocks}
+\setinterfacecommand{setupmarginrules}{setupmarginrules}
+\setinterfacecommand{setupmarking}{setupmarking}
+\setinterfacecommand{setupmathalignment}{setupmathalignment}
+\setinterfacecommand{setupnarrower}{setupnarrower}
+\setinterfacecommand{setupnumber}{setupnumber}
+\setinterfacecommand{setupnumbering}{setupnumbering}
+\setinterfacecommand{setupoppositeplacing}{setupoppositeplacing}
+\setinterfacecommand{setupoutput}{setupoutput}
+\setinterfacecommand{setuppagecomment}{setuppagecomment}
+\setinterfacecommand{setuppagenumber}{setuppagenumber}
+\setinterfacecommand{setuppagenumbering}{setuppagenumbering}
+\setinterfacecommand{setuppagetransitions}{setuppagetransitions}
+\setinterfacecommand{setuppalet}{setuppalet}
+\setinterfacecommand{setuppaper}{setuppaper}
+\setinterfacecommand{setuppapersize}{setuppapersize}
+\setinterfacecommand{setupparagraphnumbering}{setupparagraphnumbering}
+\setinterfacecommand{setupparagraphs}{setupparagraphs}
+\setinterfacecommand{setupplacement}{setupplacement}
+\setinterfacecommand{setuppositioning}{setuppositioning}
+\setinterfacecommand{setupprofiles}{setupprofiles}
+\setinterfacecommand{setupprograms}{setupprograms}
+\setinterfacecommand{setuppublications}{setuppublications}
+\setinterfacecommand{setupquote}{setupquote}
+\setinterfacecommand{setupreferencelist}{setupreferencelist}
+\setinterfacecommand{setupreferencing}{setupreferencing}
+\setinterfacecommand{setupregister}{setupregister}
+\setinterfacecommand{setuprotate}{setuprotate}
+\setinterfacecommand{setuprule}{setuprule}
+\setinterfacecommand{setups}{setups}
+\setinterfacecommand{setupscreens}{setupscreens}
+\setinterfacecommand{setupsection}{setupsection}
+\setinterfacecommand{setupsectionblock}{setupsectionblock}
+\setinterfacecommand{setupsorting}{setupsorting}
+\setinterfacecommand{setupspacing}{setupspacing}
+\setinterfacecommand{setupstartstop}{setupstartstop}
+\setinterfacecommand{setupstrut}{setupstrut}
+\setinterfacecommand{setupsubpagenumber}{setupsubpagenumber}
+\setinterfacecommand{setupsymbolset}{setupsymbolset}
+\setinterfacecommand{setupsynchronization}{setupsynchronization}
+\setinterfacecommand{setupsynchronizationbar}{setupsynchronizationbar}
+\setinterfacecommand{setupsynonyms}{setupsynonyms}
+\setinterfacecommand{setupsystem}{setupsystem}
+\setinterfacecommand{setuptab}{setuptab}
+\setinterfacecommand{setuptables}{setuptables}
+\setinterfacecommand{setuptabulate}{setuptabulate}
+\setinterfacecommand{setuptext}{setuptext}
+\setinterfacecommand{setuptextposition}{setuptextposition}
+\setinterfacecommand{setuptextrules}{setuptextrules}
+\setinterfacecommand{setuptexttexts}{setuptexttexts}
+\setinterfacecommand{setuptextvariable}{setuptextvariable}
+\setinterfacecommand{setupthinrules}{setupthinrules}
+\setinterfacecommand{setuptolerance}{setuptolerance}
+\setinterfacecommand{setuptop}{setuptop}
+\setinterfacecommand{setuptoptexts}{setuptoptexts}
+\setinterfacecommand{setuptype}{setuptype}
+\setinterfacecommand{setuptyping}{setuptyping}
+\setinterfacecommand{setupunderbar}{setupunderbar}
+\setinterfacecommand{setupurl}{setupurl}
+\setinterfacecommand{setupversions}{setupversions}
+\setinterfacecommand{setupwhitespace}{setupwhitespace}
+\setinterfacecommand{showbodyfont}{showbodyfont}
+\setinterfacecommand{showbodyfontenvironment}{showbodyfontenvironment}
+\setinterfacecommand{showcolor}{showcolor}
+\setinterfacecommand{showcolorgroup}{showcolorgroup}
+\setinterfacecommand{showexternalfigures}{showexternalfigures}
+\setinterfacecommand{showfields}{showfields}
+\setinterfacecommand{showframe}{showframe}
+\setinterfacecommand{showgrid}{showgrid}
+\setinterfacecommand{showlayout}{showlayout}
+\setinterfacecommand{showmakeup}{showmakeup}
+\setinterfacecommand{showpalet}{showpalet}
+\setinterfacecommand{showprint}{showprint}
+\setinterfacecommand{showsetups}{showsetups}
+\setinterfacecommand{showstruts}{showstruts}
+\setinterfacecommand{showsymbolset}{showsymbolset}
+\setinterfacecommand{smallcapped}{cap}
+\setinterfacecommand{someline}{someline}
+\setinterfacecommand{somewhere}{somewhere}
+\setinterfacecommand{space}{space}
+\setinterfacecommand{splitfloat}{splitfloat}
+\setinterfacecommand{startalignment}{startalignment}
+\setinterfacecommand{startbackground}{startbackground}
+\setinterfacecommand{startcoding}{startcoding}
+\setinterfacecommand{startcolor}{startcolor}
+\setinterfacecommand{startcolumnmakeup}{startcolumnmakeup}
+\setinterfacecommand{startcolumns}{startcolumns}
+\setinterfacecommand{startcolumnset}{startcolumnset}
+\setinterfacecommand{startcombination}{startcombination}
+\setinterfacecommand{startcomponent}{startcomponent}
+\setinterfacecommand{startdocument}{startdocument}
+\setinterfacecommand{startenvironment}{startenvironment}
+\setinterfacecommand{startfigure}{startfigure}
+\setinterfacecommand{startglobal}{startglobal}
+\setinterfacecommand{startline}{startline}
+\setinterfacecommand{startlinecorrection}{startlinecorrection}
+\setinterfacecommand{startlinenumbering}{startlinenumbering}
+\setinterfacecommand{startlines}{startlines}
+\setinterfacecommand{startlocal}{startlocal}
+\setinterfacecommand{startlocalfootnotes}{startlocalfootnotes}
+\setinterfacecommand{startmakeup}{startmakeup}
+\setinterfacecommand{startmarginblock}{startmarginblock}
+\setinterfacecommand{startmarginrule}{startmarginrule}
+\setinterfacecommand{startnarrower}{startnarrower}
+\setinterfacecommand{startopposite}{startopposite}
+\setinterfacecommand{startoverlay}{startoverlay}
+\setinterfacecommand{startoverzicht}{startoverview}
+\setinterfacecommand{startpacked}{startpacked}
+\setinterfacecommand{startpositioning}{startpositioning}
+\setinterfacecommand{startproduct}{startproduct}
+\setinterfacecommand{startprofile}{startprofile}
+\setinterfacecommand{startproject}{startproject}
+\setinterfacecommand{startquotation}{startquotation}
+\setinterfacecommand{startraster}{startraster}
+\setinterfacecommand{startsymbolset}{startsymbolset}
+\setinterfacecommand{startsynchronization}{startsynchronization}
+\setinterfacecommand{starttable}{starttable}
+\setinterfacecommand{starttables}{starttables}
+\setinterfacecommand{starttext}{starttext}
+\setinterfacecommand{starttextrule}{starttextrule}
+\setinterfacecommand{startunpacked}{startunpacked}
+\setinterfacecommand{startversion}{startversion}
+\setinterfacecommand{stopalignment}{stopalignment}
+\setinterfacecommand{stopbackground}{stopbackground}
+\setinterfacecommand{stopcoding}{stopcoding}
+\setinterfacecommand{stopcolor}{stopcolor}
+\setinterfacecommand{stopcolumnmakeup}{stopcolumnmakeup}
+\setinterfacecommand{stopcolumns}{stopcolumns}
+\setinterfacecommand{stopcolumnset}{stopcolumnset}
+\setinterfacecommand{stopcombination}{stopcombination}
+\setinterfacecommand{stopcomponent}{stopcomponent}
+\setinterfacecommand{stopdocument}{stopdocument}
+\setinterfacecommand{stopenvironment}{stopenvironment}
+\setinterfacecommand{stopglobal}{stopglobal}
+\setinterfacecommand{stopline}{stopline}
+\setinterfacecommand{stoplinecorrection}{stoplinecorrection}
+\setinterfacecommand{stoplinenumbering}{stoplinenumbering}
+\setinterfacecommand{stoplines}{stoplines}
+\setinterfacecommand{stoplocal}{stoplocal}
+\setinterfacecommand{stoplocalfootnotes}{stoplocalfootnotes}
+\setinterfacecommand{stopmakeup}{stopmakeup}
+\setinterfacecommand{stopmarginblock}{stopmarginblock}
+\setinterfacecommand{stopmarginrule}{stopmarginrule}
+\setinterfacecommand{stopnarrower}{stopnarrower}
+\setinterfacecommand{stopopposite}{stopopposite}
+\setinterfacecommand{stopoverlay}{stopoverlay}
+\setinterfacecommand{stopoverzicht}{stopoverview}
+\setinterfacecommand{stoppacked}{stoppacked}
+\setinterfacecommand{stoppositioning}{stoppositioning}
+\setinterfacecommand{stopproduct}{stopproduct}
+\setinterfacecommand{stopprofile}{stopprofile}
+\setinterfacecommand{stopproject}{stopproject}
+\setinterfacecommand{stopquotation}{stopquotation}
+\setinterfacecommand{stopraster}{stopraster}
+\setinterfacecommand{stopsynchronization}{stopsynchronization}
+\setinterfacecommand{stoptable}{stoptable}
+\setinterfacecommand{stoptables}{stoptables}
+\setinterfacecommand{stoptext}{stoptext}
+\setinterfacecommand{stoptextrule}{stoptextrule}
+\setinterfacecommand{stopunpacked}{stopunpacked}
+\setinterfacecommand{stopversion}{stopversion}
+\setinterfacecommand{stretched}{stretched}
+\setinterfacecommand{subformulanumber}{subformulanumber}
+\setinterfacecommand{subpagenumber}{subpagenumber}
+\setinterfacecommand{switchtobodyfont}{switchtobodyfont}
+\setinterfacecommand{switchtorawfont}{switchtorawfont}
+\setinterfacecommand{sym}{sym}
+\setinterfacecommand{symbol}{symbol}
+\setinterfacecommand{synchronizationbar}{synchronizationbar}
+\setinterfacecommand{synchronize}{synchronize}
+\setinterfacecommand{tab}{tab}
+\setinterfacecommand{testcolumn}{testcolumn}
+\setinterfacecommand{testpage}{testpage}
+\setinterfacecommand{tex}{tex}
+\setinterfacecommand{textheight}{textheight}
+\setinterfacecommand{textreference}{textreference}
+\setinterfacecommand{textrule}{textrule}
+\setinterfacecommand{textvariable}{textvariable}
+\setinterfacecommand{textwidth}{textwidth}
+\setinterfacecommand{thinrule}{thinrule}
+\setinterfacecommand{thinrules}{thinrules}
+\setinterfacecommand{tooltip}{tooltip}
+\setinterfacecommand{topdistance}{topdistance}
+\setinterfacecommand{topheight}{topheight}
+\setinterfacecommand{topspace}{topspace}
+\setinterfacecommand{totalnumberofpages}{totalnumberofpages}
+\setinterfacecommand{translate}{translate}
+\setinterfacecommand{txt}{txt}
+\setinterfacecommand{typ}{typ}
+\setinterfacecommand{type}{type}
+\setinterfacecommand{typebuffer}{typebuffer}
+\setinterfacecommand{typefile}{typefile}
+\setinterfacecommand{underbar}{underbar}
+\setinterfacecommand{underbars}{underbars}
+\setinterfacecommand{unitmeaning}{unitmeaning}
+\setinterfacecommand{unknown}{unknown}
+\setinterfacecommand{useJSscripts}{useJSscripts}
+\setinterfacecommand{useURL}{useURL}
+\setinterfacecommand{useXMLfilter}{useXMLfilter}
+\setinterfacecommand{useblocks}{useblocks}
+\setinterfacecommand{usecommands}{usecommands}
+\setinterfacecommand{useencoding}{useencoding}
+\setinterfacecommand{useexternaldocument}{useexternaldocument}
+\setinterfacecommand{useexternalfigure}{useexternalfigure}
+\setinterfacecommand{useexternalfile}{useexternalfile}
+\setinterfacecommand{useexternalfiles}{useexternalfiles}
+\setinterfacecommand{useexternalsoundtrack}{useexternalsoundtrack}
+\setinterfacecommand{usemodule}{usemodule}
+\setinterfacecommand{usemodules}{usemodules}
+\setinterfacecommand{usepath}{usedirectory}
+\setinterfacecommand{usereferences}{usereferences}
+\setinterfacecommand{usespecials}{usespecials}
+\setinterfacecommand{usesymbols}{usesymbols}
+\setinterfacecommand{usetypescript}{usetypescript}
+\setinterfacecommand{usetypescriptfile}{usetypescriptfile}
+\setinterfacecommand{useurl}{useurl}
+\setinterfacecommand{version}{version}
+\setinterfacecommand{vl}{vl}
+\setinterfacecommand{weekday}{weekday}
+\setinterfacecommand{whitespace}{whitespace}
+\setinterfacecommand{wordright}{wordright}
+\setinterfacecommand{writebetweenlist}{writebetweenlist}
+\setinterfacecommand{writetolist}{writetolist}
+\setinterfacecommand{writetoreferencelist}{writetoreferencelist}
+\setinterfacecommand{writetoregister}{writetoregister}
+%
+\endinput
\ No newline at end of file
diff --git a/tex/context/base/mult-fr.tex b/tex/context/base/mult-fr.tex
new file mode 100644
index 000000000..1dc2b2b4f
--- /dev/null
+++ b/tex/context/base/mult-fr.tex
@@ -0,0 +1,1576 @@
+% this file is auto-generated, don't edit this file
+%
+% definitions for interface variables for language fr
+%
+\setinterfacevariable{Addition}{Ajout}
+\setinterfacevariable{Balloon}{Ballon}
+\setinterfacevariable{Character}{Caratere}
+\setinterfacevariable{Characters}{Caracteres}
+\setinterfacevariable{CloseDocument}{FermeDocument}
+\setinterfacevariable{ExitViewer}{SortVisualisateur}
+\setinterfacevariable{FirstPage}{PremierePage}
+\setinterfacevariable{FitHeight}{AjusteHauteur}
+\setinterfacevariable{FitWidth}{AjusteLargeur}
+\setinterfacevariable{GotoPage}{VaalaPage}
+\setinterfacevariable{Greek}{Grec}
+\setinterfacevariable{Help}{Aide}
+\setinterfacevariable{HideField}{CacheChamp}
+\setinterfacevariable{HideLayer}{CacheCalque}
+\setinterfacevariable{Key}{Cle}
+\setinterfacevariable{LastPage}{DernierePage}
+\setinterfacevariable{LoadForm}{ChargeForm}
+\setinterfacevariable{MONTH}{MOIS}
+\setinterfacevariable{New}{Nouveau}
+\setinterfacevariable{NextJump}{SautSuivant}
+\setinterfacevariable{NextPage}{PageSuivante}
+\setinterfacevariable{Numbers}{Numeros}
+\setinterfacevariable{OpenNamedDocument}{OuvreDocumentNomme}
+\setinterfacevariable{Paragraph}{Paragraphe}
+\setinterfacevariable{PauseMovie}{PauseFilm}
+\setinterfacevariable{PauseRendering}{PauseRendering}
+\setinterfacevariable{PauseSound}{PauseSon}
+\setinterfacevariable{PreviousJump}{SautPrecedent}
+\setinterfacevariable{PreviousPage}{PagePrecedente}
+\setinterfacevariable{PrintDocument}{ImprimeDocument}
+\setinterfacevariable{Query}{Query}
+\setinterfacevariable{QueryAgain}{QueryAgain}
+\setinterfacevariable{ResetForm}{RazForm}
+\setinterfacevariable{ResumeMovie}{ReprendFilm}
+\setinterfacevariable{ResumeRendering}{ResumeRendering}
+\setinterfacevariable{ResumeSound}{ReprendSon}
+\setinterfacevariable{Romannumerals}{Chiffresromains}
+\setinterfacevariable{SaveDocument}{SauvegardeDocument}
+\setinterfacevariable{SaveForm}{SauvegardeForm}
+\setinterfacevariable{SaveNamedDocument}{SauvegardeDocumentNomme}
+\setinterfacevariable{SearchAgain}{RechercheSuivant}
+\setinterfacevariable{SearchDocument}{RechercheDocument}
+\setinterfacevariable{ShowBookmarks}{ShowBookmarks}
+\setinterfacevariable{ShowField}{MontreChamp}
+\setinterfacevariable{ShowThumbs}{ShowThumbs}
+\setinterfacevariable{StartMovie}{DemarreFilm}
+\setinterfacevariable{StartRendering}{StartRendering}
+\setinterfacevariable{StartSound}{DemarreSon}
+\setinterfacevariable{StopMovie}{StoppeFilm}
+\setinterfacevariable{StopRendering}{StopRendering}
+\setinterfacevariable{StopSound}{StoppeSon}
+\setinterfacevariable{SubmitForm}{SoumettreForm}
+\setinterfacevariable{ToggleLayer}{ToggleLayer}
+\setinterfacevariable{ToggleViewer}{ChangeVisualisateur}
+\setinterfacevariable{URL}{URL}
+\setinterfacevariable{VideLayer}{VideLayer}
+\setinterfacevariable{ViewerHelp}{AideVisualisateur}
+\setinterfacevariable{WEEKDAY}{JOURSEMAINE}
+\setinterfacevariable{WORD}{MOT}
+\setinterfacevariable{abbreviation}{abreviation}
+\setinterfacevariable{abbreviations}{abreviations}
+\setinterfacevariable{absolute}{absolute}
+\setinterfacevariable{action}{action}
+\setinterfacevariable{after}{apres}
+\setinterfacevariable{all}{tout}
+\setinterfacevariable{always}{toujours}
+\setinterfacevariable{appendices}{annexes}
+\setinterfacevariable{appendix}{annexe}
+\setinterfacevariable{april}{avril}
+\setinterfacevariable{atmargin}{alamarge}
+\setinterfacevariable{atpage}{alapage}
+\setinterfacevariable{august}{aout}
+\setinterfacevariable{auto}{auto}
+\setinterfacevariable{autointro}{autointro}
+\setinterfacevariable{back}{retour}
+\setinterfacevariable{background}{arriereplan}
+\setinterfacevariable{backmatter}{epilogue}
+\setinterfacevariable{backpart}{postface}
+\setinterfacevariable{backspace}{retourarriere}
+\setinterfacevariable{backward}{retourarriere}
+\setinterfacevariable{before}{avant}
+\setinterfacevariable{big}{grand}
+\setinterfacevariable{bigbodyfont}{grandepolicecorp}
+\setinterfacevariable{bigpreference}{grandepreference}
+\setinterfacevariable{blank}{vide}
+\setinterfacevariable{blockquote}{blockquote}
+\setinterfacevariable{bodymatter}{texteprincipal}
+\setinterfacevariable{bodypart}{corpsdetexte}
+\setinterfacevariable{bold}{gras}
+\setinterfacevariable{bolditalic}{italiquegras}
+\setinterfacevariable{boldslanted}{inclinegras}
+\setinterfacevariable{bookmark}{marquepage}
+\setinterfacevariable{both}{lesdeux}
+\setinterfacevariable{bottom}{inf}
+\setinterfacevariable{brief}{brief}
+\setinterfacevariable{broad}{large}
+\setinterfacevariable{buffer}{buffer}
+\setinterfacevariable{by}{par}
+\setinterfacevariable{calligraphic}{calligraphique}
+\setinterfacevariable{cap}{cap}
+\setinterfacevariable{capital}{capitale}
+\setinterfacevariable{center}{center}
+\setinterfacevariable{chapter}{chapitre}
+\setinterfacevariable{character}{caractere}
+\setinterfacevariable{characters}{caracteres}
+\setinterfacevariable{color}{couleur}
+\setinterfacevariable{column}{colonne}
+\setinterfacevariable{columns}{colonnes}
+\setinterfacevariable{command}{commande}
+\setinterfacevariable{commands}{commandes}
+\setinterfacevariable{comment}{commentaire}
+\setinterfacevariable{component}{composant}
+\setinterfacevariable{concept}{concept}
+\setinterfacevariable{content}{contenu}
+\setinterfacevariable{contents}{contenus}
+\setinterfacevariable{continue}{continue}
+\setinterfacevariable{controls}{controles}
+\setinterfacevariable{conversion}{conversion}
+\setinterfacevariable{current}{courant}
+\setinterfacevariable{cutspace}{cutspace}
+\setinterfacevariable{date}{date}
+\setinterfacevariable{day}{jour}
+\setinterfacevariable{december}{decembre}
+\setinterfacevariable{default}{defaut}
+\setinterfacevariable{depth}{profondeur}
+\setinterfacevariable{description}{description}
+\setinterfacevariable{disable}{desactiver}
+\setinterfacevariable{display}{affichage}
+\setinterfacevariable{dot}{point}
+\setinterfacevariable{doublesided}{rectoverso}
+\setinterfacevariable{each}{chaque}
+\setinterfacevariable{edge}{bord}
+\setinterfacevariable{empty}{vide}
+\setinterfacevariable{endnote}{notefin}
+\setinterfacevariable{enumeration}{enumeration}
+\setinterfacevariable{environment}{environement}
+\setinterfacevariable{even}{paire}
+\setinterfacevariable{external}{external}
+\setinterfacevariable{fact}{fait}
+\setinterfacevariable{february}{fevrier}
+\setinterfacevariable{figure}{figure}
+\setinterfacevariable{figures}{figures}
+\setinterfacevariable{file}{fichier}
+\setinterfacevariable{final}{final}
+\setinterfacevariable{first}{premier}
+\setinterfacevariable{firstcolumn}{premierecolonne}
+\setinterfacevariable{firstpage}{premierepage}
+\setinterfacevariable{firstsubpage}{premieresouspage}
+\setinterfacevariable{fit}{adapte}
+\setinterfacevariable{five}{cinq}
+\setinterfacevariable{fix}{fixe}
+\setinterfacevariable{fixed}{fixe}
+\setinterfacevariable{flexible}{flexible}
+\setinterfacevariable{float}{flottant}
+\setinterfacevariable{flushinner}{flushinner}
+\setinterfacevariable{flushleft}{flushleft}
+\setinterfacevariable{flushouter}{flushouter}
+\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{footer}{pdp}
+\setinterfacevariable{footnote}{notepdp}
+\setinterfacevariable{force}{force}
+\setinterfacevariable{foreground}{premierplan}
+\setinterfacevariable{formeel}{formeel}
+\setinterfacevariable{formula}{formule}
+\setinterfacevariable{formulae}{formules}
+\setinterfacevariable{forward}{avance}
+\setinterfacevariable{four}{quatre}
+\setinterfacevariable{frame}{cadre}
+\setinterfacevariable{framedtext}{texteencadre}
+\setinterfacevariable{friday}{vendredi}
+\setinterfacevariable{frontmatter}{preambule}
+\setinterfacevariable{frontpart}{preface}
+\setinterfacevariable{global}{global}
+\setinterfacevariable{graphic}{graphique}
+\setinterfacevariable{graphics}{graphiques}
+\setinterfacevariable{gray}{gris}
+\setinterfacevariable{greek}{grec}
+\setinterfacevariable{grid}{grille}
+\setinterfacevariable{halfline}{demiligne}
+\setinterfacevariable{handwritten}{manuscript}
+\setinterfacevariable{hang}{suspend}
+\setinterfacevariable{hanging}{suspend}
+\setinterfacevariable{head}{tete}
+\setinterfacevariable{header}{entete}
+\setinterfacevariable{height}{hauteur}
+\setinterfacevariable{helptext}{texteaide}
+\setinterfacevariable{hencefore}{precedent}
+\setinterfacevariable{here}{ici}
+\setinterfacevariable{hereafter}{suivant}
+\setinterfacevariable{hidden}{cache}
+\setinterfacevariable{hiding}{cache}
+\setinterfacevariable{high}{haut}
+\setinterfacevariable{horizontal}{horizontale}
+\setinterfacevariable{hyphenated}{hyphenated}
+\setinterfacevariable{hz}{hz}
+\setinterfacevariable{inbetween}{entre}
+\setinterfacevariable{index}{index}
+\setinterfacevariable{indices}{indices}
+\setinterfacevariable{informeel}{informeel}
+\setinterfacevariable{inherit}{herite}
+\setinterfacevariable{inleft}{dansgauche}
+\setinterfacevariable{inmargin}{dansmarge}
+\setinterfacevariable{inner}{interieur}
+\setinterfacevariable{inneredge}{bordinterieur}
+\setinterfacevariable{innermargin}{margeinterieure}
+\setinterfacevariable{inright}{dansdroit}
+\setinterfacevariable{interaction}{interaction}
+\setinterfacevariable{interactionmenu}{menuinteraction}
+\setinterfacevariable{intermezzi}{intermezzi}
+\setinterfacevariable{intermezzo}{intermezzo}
+\setinterfacevariable{intext}{danstexte}
+\setinterfacevariable{intro}{intro}
+\setinterfacevariable{italic}{italique}
+\setinterfacevariable{italicbold}{grasitalique}
+\setinterfacevariable{item}{element}
+\setinterfacevariable{itemize}{lister}
+\setinterfacevariable{its}{its}
+\setinterfacevariable{january}{janvier}
+\setinterfacevariable{joinedup}{joinedup}
+\setinterfacevariable{july}{juillet}
+\setinterfacevariable{june}{juin}
+\setinterfacevariable{keep}{maintient}
+\setinterfacevariable{knockout}{knockout}
+\setinterfacevariable{label}{etiquette}
+\setinterfacevariable{landscape}{paysage}
+\setinterfacevariable{last}{dernier}
+\setinterfacevariable{lastcolumn}{dernierecolonne}
+\setinterfacevariable{lastpage}{dernierepage}
+\setinterfacevariable{lastpagenumber}{derniernumeropage}
+\setinterfacevariable{lastsubpage}{dernieresouspage}
+\setinterfacevariable{left}{gauche}
+\setinterfacevariable{leftedge}{bordgauche}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{margegauche}
+\setinterfacevariable{leftpage}{pagegauche}
+\setinterfacevariable{legend}{legende}
+\setinterfacevariable{lesshyphenation}{lesshyphenation}
+\setinterfacevariable{line}{ligne}
+\setinterfacevariable{linenote}{noteligne}
+\setinterfacevariable{lines}{lignes}
+\setinterfacevariable{list}{liste}
+\setinterfacevariable{local}{local}
+\setinterfacevariable{localenvironment}{environementlocal}
+\setinterfacevariable{logo}{logo}
+\setinterfacevariable{logos}{logos}
+\setinterfacevariable{lohi}{baha}
+\setinterfacevariable{loose}{perte}
+\setinterfacevariable{low}{bas}
+\setinterfacevariable{ls}{ls}
+\setinterfacevariable{makeup}{makeup}
+\setinterfacevariable{mar}{mar}
+\setinterfacevariable{march}{mars}
+\setinterfacevariable{margin}{marge}
+\setinterfacevariable{marginedge}{bordmarge}
+\setinterfacevariable{margintitle}{titremarge}
+\setinterfacevariable{marking}{marquage}
+\setinterfacevariable{mathalignment}{mathalignment}
+\setinterfacevariable{mathcases}{mathcases}
+\setinterfacevariable{mathmatrix}{mathmatrix}
+\setinterfacevariable{max}{max}
+\setinterfacevariable{may}{mai}
+\setinterfacevariable{mediaeval}{medieval}
+\setinterfacevariable{medium}{moyen}
+\setinterfacevariable{middle}{milieu}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{minheight}{hauteurmin}
+\setinterfacevariable{minwidth}{largeurmin}
+\setinterfacevariable{mirrored}{reflete}
+\setinterfacevariable{monday}{lundi}
+\setinterfacevariable{mono}{mono}
+\setinterfacevariable{month}{mois}
+\setinterfacevariable{morehyphenation}{morehyphenation}
+\setinterfacevariable{name}{nom}
+\setinterfacevariable{narrow}{etroit}
+\setinterfacevariable{negative}{negatif}
+\setinterfacevariable{never}{jamais}
+\setinterfacevariable{new}{nouveau}
+\setinterfacevariable{next}{prochain}
+\setinterfacevariable{nextevenpage}{pagepairesuivante}
+\setinterfacevariable{nextoddpage}{pageimpairesuivante}
+\setinterfacevariable{nextpage}{pagesuivante}
+\setinterfacevariable{nextsubpage}{souspagesuivante}
+\setinterfacevariable{no}{non}
+\setinterfacevariable{nocheck}{nonverifie}
+\setinterfacevariable{nofit}{nofit}
+\setinterfacevariable{nogrid}{nogrid}
+\setinterfacevariable{nohz}{nohz}
+\setinterfacevariable{nomarking}{sansmarquage}
+\setinterfacevariable{none}{rien}
+\setinterfacevariable{nonumber}{sansnumero}
+\setinterfacevariable{normal}{normal}
+\setinterfacevariable{nospacing}{sansespacement}
+\setinterfacevariable{not}{pas}
+\setinterfacevariable{nothanging}{nonsuspendu}
+\setinterfacevariable{nothyphenated}{nothyphenated}
+\setinterfacevariable{november}{novembre}
+\setinterfacevariable{nowhere}{nulpart}
+\setinterfacevariable{nowhite}{sansblanc}
+\setinterfacevariable{number}{numero}
+\setinterfacevariable{numbers}{numeros}
+\setinterfacevariable{october}{octobre}
+\setinterfacevariable{odd}{impair}
+\setinterfacevariable{off}{desactive}
+\setinterfacevariable{offset}{offset}
+\setinterfacevariable{old}{old}
+\setinterfacevariable{on}{actif}
+\setinterfacevariable{one}{un}
+\setinterfacevariable{opposite}{opposition}
+\setinterfacevariable{outer}{exterieur}
+\setinterfacevariable{outeredge}{bordexterieur}
+\setinterfacevariable{outermargin}{margeexterieure}
+\setinterfacevariable{overlay}{revetement}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{packed}{groupe}
+\setinterfacevariable{page}{page}
+\setinterfacevariable{pagecomment}{commentairepage}
+\setinterfacevariable{pagenumber}{numeropage}
+\setinterfacevariable{paper}{papier}
+\setinterfacevariable{paragraph}{paragraphe}
+\setinterfacevariable{part}{partie}
+\setinterfacevariable{positive}{positif}
+\setinterfacevariable{postponing}{postponing}
+\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{preference}{preference}
+\setinterfacevariable{preview}{previsualisation}
+\setinterfacevariable{previous}{precedent}
+\setinterfacevariable{previousevenpage}{pagepaireprecedente}
+\setinterfacevariable{previousoddpage}{pageimpaireprecedente}
+\setinterfacevariable{previouspage}{pageprecedente}
+\setinterfacevariable{previoussubpage}{souspageprecedente}
+\setinterfacevariable{printable}{editable}
+\setinterfacevariable{process}{process}
+\setinterfacevariable{product}{produit}
+\setinterfacevariable{program}{programme}
+\setinterfacevariable{project}{projet}
+\setinterfacevariable{protected}{protege}
+\setinterfacevariable{quadruple}{quadruple}
+\setinterfacevariable{quotation}{citation}
+\setinterfacevariable{quote}{citer}
+\setinterfacevariable{ran}{cours}
+\setinterfacevariable{random}{aleatoire}
+\setinterfacevariable{readonly}{lectureseule}
+\setinterfacevariable{rectangular}{rectangulaire}
+\setinterfacevariable{referral}{referral}
+\setinterfacevariable{register}{registre}
+\setinterfacevariable{regular}{regulier}
+\setinterfacevariable{rekening}{rekening}
+\setinterfacevariable{relative}{relatif}
+\setinterfacevariable{repeat}{repete}
+\setinterfacevariable{required}{recquis}
+\setinterfacevariable{reset}{raz}
+\setinterfacevariable{reverse}{inverse}
+\setinterfacevariable{right}{droite}
+\setinterfacevariable{rightedge}{borddroit}
+\setinterfacevariable{righthanging}{righthanging}
+\setinterfacevariable{rightmargin}{margedroite}
+\setinterfacevariable{rightpage}{pagedroite}
+\setinterfacevariable{roman}{roman}
+\setinterfacevariable{romannumerals}{chiffresromains}
+\setinterfacevariable{rotate}{oriente}
+\setinterfacevariable{rotated}{tourne}
+\setinterfacevariable{round}{rond}
+\setinterfacevariable{row}{rang}
+\setinterfacevariable{rule}{regle}
+\setinterfacevariable{samepage}{memepage}
+\setinterfacevariable{sans}{sans}
+\setinterfacevariable{sansbold}{sansgras}
+\setinterfacevariable{sansserif}{sansserif}
+\setinterfacevariable{saturday}{samedi}
+\setinterfacevariable{screen}{ecran}
+\setinterfacevariable{section}{section}
+\setinterfacevariable{sectionblockenvironment}{environementblocsection}
+\setinterfacevariable{sectionnumber}{numerosection}
+\setinterfacevariable{see}{voit}
+\setinterfacevariable{september}{septembre}
+\setinterfacevariable{serif}{serif}
+\setinterfacevariable{serried}{serried}
+\setinterfacevariable{setups}{reglages}
+\setinterfacevariable{sheet}{sheet}
+\setinterfacevariable{singlesided}{recto}
+\setinterfacevariable{slanted}{incline}
+\setinterfacevariable{slantedbold}{grasincline}
+\setinterfacevariable{small}{petit}
+\setinterfacevariable{smallbodyfont}{petitepolicecorps}
+\setinterfacevariable{smallbold}{graspetit}
+\setinterfacevariable{smallbolditalic}{italiquegraspetit}
+\setinterfacevariable{smallboldslanted}{inclinegraspetit}
+\setinterfacevariable{smallcaps}{petitescapitales}
+\setinterfacevariable{smallitalic}{italiquepetit}
+\setinterfacevariable{smallitalicbold}{grasitaliquepetit}
+\setinterfacevariable{smallnormal}{normalpetit}
+\setinterfacevariable{smallslanted}{inclinepetit}
+\setinterfacevariable{smallslantedbold}{grasinclinepetit}
+\setinterfacevariable{smalltype}{petittype}
+\setinterfacevariable{somewhere}{qqpart}
+\setinterfacevariable{sorted}{trie}
+\setinterfacevariable{space}{espace}
+\setinterfacevariable{spacing}{espacement}
+\setinterfacevariable{speech}{discours}
+\setinterfacevariable{split}{split}
+\setinterfacevariable{spot}{spot}
+\setinterfacevariable{standard}{standard}
+\setinterfacevariable{start}{demarre}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{stoppe}
+\setinterfacevariable{stopper}{stopper}
+\setinterfacevariable{stretch}{etire}
+\setinterfacevariable{strict}{strict}
+\setinterfacevariable{strong}{strong}
+\setinterfacevariable{strut}{strut}
+\setinterfacevariable{sub}{sous}
+\setinterfacevariable{subbackward}{sousretourarriere}
+\setinterfacevariable{subformula}{subformule}
+\setinterfacevariable{subforward}{sousavance}
+\setinterfacevariable{subject}{sujet}
+\setinterfacevariable{subpage}{souspage}
+\setinterfacevariable{subsection}{soussection}
+\setinterfacevariable{subsubject}{soussujet}
+\setinterfacevariable{subsubsection}{soussoussection}
+\setinterfacevariable{subsubsubject}{soussoussujet}
+\setinterfacevariable{subsubsubsection}{soussoussoussection}
+\setinterfacevariable{subsubsubsubject}{soussoussoussujet}
+\setinterfacevariable{subsubsubsubsection}{soussoussoussoussection}
+\setinterfacevariable{subsubsubsubsubject}{soussoussoussoussujet}
+\setinterfacevariable{subsubsubsubsubsection}{soussoussoussoussoussection}
+\setinterfacevariable{subsubsubsubsubsubject}{soussoussoussoussoussujet}
+\setinterfacevariable{sunday}{dimanche}
+\setinterfacevariable{support}{support}
+\setinterfacevariable{sym}{sym}
+\setinterfacevariable{symbol}{symbole}
+\setinterfacevariable{synchronize}{synchronize}
+\setinterfacevariable{system}{systeme}
+\setinterfacevariable{table}{tableau}
+\setinterfacevariable{tablehead}{tetetableau}
+\setinterfacevariable{tables}{tables}
+\setinterfacevariable{tabletail}{queuetableau}
+\setinterfacevariable{tabulate}{tabule}
+\setinterfacevariable{tabulatehead}{tetetabule}
+\setinterfacevariable{tabulatetail}{queuetabule}
+\setinterfacevariable{tall}{long}
+\setinterfacevariable{teletype}{teletype}
+\setinterfacevariable{temporary}{temporaire}
+\setinterfacevariable{test}{test}
+\setinterfacevariable{text}{texte}
+\setinterfacevariable{three}{trois}
+\setinterfacevariable{thursday}{jeudi}
+\setinterfacevariable{title}{titre}
+\setinterfacevariable{toggle}{toggle}
+\setinterfacevariable{tolerant}{tolerant}
+\setinterfacevariable{top}{sup}
+\setinterfacevariable{tuesday}{mardi}
+\setinterfacevariable{two}{deux}
+\setinterfacevariable{txt}{txt}
+\setinterfacevariable{type}{type}
+\setinterfacevariable{typing}{typing}
+\setinterfacevariable{unavailable}{indisponible}
+\setinterfacevariable{unit}{unite}
+\setinterfacevariable{units}{unites}
+\setinterfacevariable{unknown}{inconnu}
+\setinterfacevariable{unpacked}{degroupe}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{used}
+\setinterfacevariable{value}{valeur}
+\setinterfacevariable{vertical}{verticale}
+\setinterfacevariable{very}{tres}
+\setinterfacevariable{verystrict}{tresstrict}
+\setinterfacevariable{verytolerant}{trestolerant}
+\setinterfacevariable{weak}{weak}
+\setinterfacevariable{wednesday}{mercredi}
+\setinterfacevariable{week}{semaine}
+\setinterfacevariable{weekday}{joursemaine}
+\setinterfacevariable{white}{blanc}
+\setinterfacevariable{wide}{ample}
+\setinterfacevariable{width}{largeur}
+\setinterfacevariable{xml}{xml}
+\setinterfacevariable{year}{annee}
+\setinterfacevariable{yes}{oui}
+% definitions for interface constants for language fr
+%
+\setinterfaceconstant{action}{action}
+\setinterfaceconstant{address}{adresse}
+\setinterfaceconstant{after}{apres}
+\setinterfaceconstant{afterhead}{aprestete}
+\setinterfaceconstant{afterkey}{aprescle}
+\setinterfaceconstant{align}{alignement}
+\setinterfaceconstant{aligncharacter}{caracterealigne}
+\setinterfaceconstant{alignmentcharacter}{alignementcaractere}
+\setinterfaceconstant{aligntitle}{alignementtitre}
+\setinterfaceconstant{alternative}{alternative}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{fleche}
+\setinterfaceconstant{at}{a}
+\setinterfaceconstant{author}{auteur}
+\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autofile}{autofile}
+\setinterfaceconstant{autofocus}{autofocus}
+\setinterfaceconstant{autohang}{autohang}
+\setinterfaceconstant{autostrut}{autostrut}
+\setinterfaceconstant{autowidth}{autolargeur}
+\setinterfaceconstant{axis}{axe}
+\setinterfaceconstant{background}{arriereplan}
+\setinterfaceconstant{backgroundcolor}{couleurarriereplan}
+\setinterfaceconstant{backgroundcorner}{coinarriereplan}
+\setinterfaceconstant{backgrounddepth}{profondeurarriereplan}
+\setinterfaceconstant{backgroundoffset}{decalagearriereplan}
+\setinterfaceconstant{backgroundradius}{rayonarriereplan}
+\setinterfaceconstant{backgroundscreen}{ecranarriereplan}
+\setinterfaceconstant{backspace}{retour}
+\setinterfaceconstant{balance}{equilibre}
+\setinterfaceconstant{before}{avant}
+\setinterfaceconstant{beforehead}{avanttete}
+\setinterfaceconstant{bet}{bet}
+\setinterfaceconstant{big}{grand}
+\setinterfaceconstant{blank}{vide}
+\setinterfaceconstant{blockway}{blockway}
+\setinterfaceconstant{bodyfont}{policecorps}
+\setinterfaceconstant{bookmark}{marquepage}
+\setinterfaceconstant{bottom}{inf}
+\setinterfaceconstant{bottomdistance}{distanceinf}
+\setinterfaceconstant{bottomframe}{cadreinf}
+\setinterfaceconstant{bottomoffset}{decalageinf}
+\setinterfaceconstant{bottomspace}{espaceinf}
+\setinterfaceconstant{bottomstate}{etatinf}
+\setinterfaceconstant{cache}{cache}
+\setinterfaceconstant{calculate}{calculer}
+\setinterfaceconstant{ccommand}{ccommande}
+\setinterfaceconstant{click}{clic}
+\setinterfaceconstant{clickin}{clicinterieur}
+\setinterfaceconstant{clickout}{clicexterieur}
+\setinterfaceconstant{clipoffset}{clipoffset}
+\setinterfaceconstant{closeaction}{actionfermeture}
+\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepageaction}{actionfermeturepage}
+\setinterfaceconstant{closesymbol}{closesymbol}
+\setinterfaceconstant{color}{couleur}
+\setinterfaceconstant{column}{colonne}
+\setinterfaceconstant{columndistance}{distancecolonne}
+\setinterfaceconstant{columns}{colonnes}
+\setinterfaceconstant{command}{commande}
+\setinterfaceconstant{commandafter}{commandeapres}
+\setinterfaceconstant{commandbefore}{commandeavant}
+\setinterfaceconstant{commands}{commandes}
+\setinterfaceconstant{component}{composant}
+\setinterfaceconstant{compoundhyphen}{compoundhyphen}
+\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{continue}{continue}
+\setinterfaceconstant{contrastcolor}{coleurcontraste}
+\setinterfaceconstant{controls}{controles}
+\setinterfaceconstant{conversion}{conversion}
+\setinterfaceconstant{convertfile}{conversionfichier}
+\setinterfaceconstant{corner}{coin}
+\setinterfaceconstant{coupling}{couplage}
+\setinterfaceconstant{couplingway}{modecouplage}
+\setinterfaceconstant{criterium}{critere}
+\setinterfaceconstant{current}{courant}
+\setinterfaceconstant{cutspace}{cutspace}
+\setinterfaceconstant{dash}{pointille}
+\setinterfaceconstant{dat}{dat}
+\setinterfaceconstant{date}{date}
+\setinterfaceconstant{deepnumbercommand}{deepnumbercommand}
+\setinterfaceconstant{deeptextcommand}{deeptextcommand}
+\setinterfaceconstant{default}{defaut}
+\setinterfaceconstant{delay}{delai}
+\setinterfaceconstant{depth}{profondeur}
+\setinterfaceconstant{depthcorrection}{correctionprofondeur}
+\setinterfaceconstant{direction}{direction}
+\setinterfaceconstant{directory}{repertoire}
+\setinterfaceconstant{display}{affichage}
+\setinterfaceconstant{distance}{distance}
+\setinterfaceconstant{dot}{point}
+\setinterfaceconstant{doublesided}{rectoverso}
+\setinterfaceconstant{dummy}{dummy}
+\setinterfaceconstant{dx}{dx}
+\setinterfaceconstant{dy}{dy}
+\setinterfaceconstant{edge}{bord}
+\setinterfaceconstant{edgedistance}{distancebord}
+\setinterfaceconstant{empty}{vide}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{margepaire}
+\setinterfaceconstant{expansion}{expansion}
+\setinterfaceconstant{extras}{extras}
+\setinterfaceconstant{factor}{facteur}
+\setinterfaceconstant{fallback}{fallback}
+\setinterfaceconstant{family}{famille}
+\setinterfaceconstant{fieldbackgroundcolor}{couleurarrierreplanchamp}
+\setinterfaceconstant{fieldframecolor}{couleurcadrechamp}
+\setinterfaceconstant{fieldlayer}{calquechamp}
+\setinterfaceconstant{fieldoffset}{offsetchamp}
+\setinterfaceconstant{file}{fichier}
+\setinterfaceconstant{focus}{focus}
+\setinterfaceconstant{focusin}{focusin}
+\setinterfaceconstant{focusout}{focusout}
+\setinterfaceconstant{footer}{pdp}
+\setinterfaceconstant{footerdistance}{dsitancepdp}
+\setinterfaceconstant{footerstate}{etatpdp}
+\setinterfaceconstant{foregroundcolor}{couleurpremierplan}
+\setinterfaceconstant{foregroundstyle}{stylepremierplan}
+\setinterfaceconstant{format}{formatter}
+\setinterfaceconstant{frame}{cadre}
+\setinterfaceconstant{framecolor}{couleurcadre}
+\setinterfaceconstant{framecorner}{coincadre}
+\setinterfaceconstant{framedepth}{profondeurcadre}
+\setinterfaceconstant{frameoffset}{decalagecadre}
+\setinterfaceconstant{frameradius}{rayoncadre}
+\setinterfaceconstant{frames}{cadres}
+\setinterfaceconstant{from}{de}
+\setinterfaceconstant{get}{obtient}
+\setinterfaceconstant{global}{global}
+\setinterfaceconstant{grid}{grille}
+\setinterfaceconstant{hang}{suspend}
+\setinterfaceconstant{headcolor}{couleurtete}
+\setinterfaceconstant{headcommand}{commandetete}
+\setinterfaceconstant{headconversion}{conversiontete}
+\setinterfaceconstant{header}{entete}
+\setinterfaceconstant{headerdistance}{distanceentete}
+\setinterfaceconstant{headerstate}{etatentete}
+\setinterfaceconstant{headlabel}{etiquettetete}
+\setinterfaceconstant{headnumber}{numerotete}
+\setinterfaceconstant{headstyle}{styletete}
+\setinterfaceconstant{height}{hauteur}
+\setinterfaceconstant{hfactor}{facteurhauteur}
+\setinterfaceconstant{hfil}{hfil}
+\setinterfaceconstant{hoffset}{decalagehauteur}
+\setinterfaceconstant{horoffset}{horoffset}
+\setinterfaceconstant{hyphen}{hyphen}
+\setinterfaceconstant{icommand}{icommande}
+\setinterfaceconstant{in}{in}
+\setinterfaceconstant{inbetween}{entre}
+\setinterfaceconstant{increment}{incremente}
+\setinterfaceconstant{incrementnumber}{incrementenumero}
+\setinterfaceconstant{indenting}{composeenalinea}
+\setinterfaceconstant{indentnext}{indentesuivant}
+\setinterfaceconstant{indicator}{indicateur}
+\setinterfaceconstant{inner}{interieur}
+\setinterfaceconstant{innermargin}{margeinterieure}
+\setinterfaceconstant{inputfile}{fichierentree}
+\setinterfaceconstant{interaction}{interaction}
+\setinterfaceconstant{interlinespace}{espaceinterligne}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{elements}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{motcle}
+\setinterfaceconstant{label}{etiquette}
+\setinterfaceconstant{left}{gauche}
+\setinterfaceconstant{leftcolor}{couleurgauche}
+\setinterfaceconstant{leftcompoundhyphen}{leftcompoundhyphen}
+\setinterfaceconstant{leftedge}{bordgauche}
+\setinterfaceconstant{leftedgedistance}{distancebordgauche}
+\setinterfaceconstant{leftframe}{cadregauche}
+\setinterfaceconstant{lefthyphen}{lefthyphen}
+\setinterfaceconstant{leftmargin}{margegauche}
+\setinterfaceconstant{leftmargindistance}{distancemargegauche}
+\setinterfaceconstant{leftoffset}{decalagegauche}
+\setinterfaceconstant{leftquotation}{citationgauche}
+\setinterfaceconstant{leftquote}{citergauche}
+\setinterfaceconstant{leftsentence}{phrasegauche}
+\setinterfaceconstant{leftspeech}{leftspeech}
+\setinterfaceconstant{leftstyle}{leftstyle}
+\setinterfaceconstant{leftsubsentence}{sousphrasegauche}
+\setinterfaceconstant{lefttext}{textegauche}
+\setinterfaceconstant{leftwidth}{largeurgauche}
+\setinterfaceconstant{level}{niveau}
+\setinterfaceconstant{levels}{niveaux}
+\setinterfaceconstant{limittext}{limittext}
+\setinterfaceconstant{line}{ligne}
+\setinterfaceconstant{linecorrection}{correctionligne}
+\setinterfaceconstant{lines}{lignes}
+\setinterfaceconstant{list}{liste}
+\setinterfaceconstant{listtext}{texteliste}
+\setinterfaceconstant{local}{local}
+\setinterfaceconstant{location}{emplacement}
+\setinterfaceconstant{logo}{logo}
+\setinterfaceconstant{logos}{logos}
+\setinterfaceconstant{marcolor}{couleurmarquage}
+\setinterfaceconstant{margin}{marge}
+\setinterfaceconstant{margindistance}{distancemarge}
+\setinterfaceconstant{marginedge}{bordmarge}
+\setinterfaceconstant{marginedgetext}{textebordmarge}
+\setinterfaceconstant{margintext}{textemarge}
+\setinterfaceconstant{marking}{marquage}
+\setinterfaceconstant{marstyle}{stylemarquage}
+\setinterfaceconstant{max}{max}
+\setinterfaceconstant{maxheight}{hauteurmax}
+\setinterfaceconstant{maxwidth}{largeurmax}
+\setinterfaceconstant{menu}{menu}
+\setinterfaceconstant{method}{methode}
+\setinterfaceconstant{middle}{milieu}
+\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middletext}{textecentre}
+\setinterfaceconstant{midsentence}{midsentence}
+\setinterfaceconstant{min}{min}
+\setinterfaceconstant{mindepth}{profondeurmin}
+\setinterfaceconstant{minheight}{hauteurmin}
+\setinterfaceconstant{minwidth}{largeurmin}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{nom}
+\setinterfaceconstant{nbottom}{ninf}
+\setinterfaceconstant{nc}{nc}
+\setinterfaceconstant{next}{suivant}
+\setinterfaceconstant{nl}{nl}
+\setinterfaceconstant{nleft}{ngauche}
+\setinterfaceconstant{nlines}{nlignes}
+\setinterfaceconstant{norm}{norme}
+\setinterfaceconstant{nr}{nr}
+\setinterfaceconstant{nright}{ndroite}
+\setinterfaceconstant{ntop}{nsup}
+\setinterfaceconstant{number}{numero}
+\setinterfaceconstant{numbercolor}{couleurnumero}
+\setinterfaceconstant{numbercommand}{commandenumero}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numerotation}
+\setinterfaceconstant{numberseparator}{separateurnumbero}
+\setinterfaceconstant{numberstyle}{stylenumero}
+\setinterfaceconstant{numberwidth}{numberwidth}
+\setinterfaceconstant{nx}{nx}
+\setinterfaceconstant{ny}{ny}
+\setinterfaceconstant{object}{objet}
+\setinterfaceconstant{obstruction}{obstruction}
+\setinterfaceconstant{oddmargin}{margepaire}
+\setinterfaceconstant{offset}{offset}
+\setinterfaceconstant{openaction}{actionouverture}
+\setinterfaceconstant{openpageaction}{actionouverturepage}
+\setinterfaceconstant{option}{option}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{outermargin}{margeexterieure}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{numeroproprio}
+\setinterfaceconstant{page}{page}
+\setinterfaceconstant{pageboundaries}{limitespage}
+\setinterfaceconstant{pagecolor}{couleurpage}
+\setinterfaceconstant{pagecommand}{commandepage}
+\setinterfaceconstant{pagenumber}{numeropage}
+\setinterfaceconstant{pagestate}{etatpage}
+\setinterfaceconstant{pagestyle}{stylepage}
+\setinterfaceconstant{palet}{palette}
+\setinterfaceconstant{paper}{papier}
+\setinterfaceconstant{paragraph}{paragraphe}
+\setinterfaceconstant{place}{place}
+\setinterfaceconstant{placehead}{placetete}
+\setinterfaceconstant{placestopper}{emplacementstopper}
+\setinterfaceconstant{position}{position}
+\setinterfaceconstant{prefix}{prefixe}
+\setinterfaceconstant{preset}{prereglage}
+\setinterfaceconstant{preview}{previsualisation}
+\setinterfaceconstant{previous}{precedent}
+\setinterfaceconstant{previousnumber}{numeroprecedent}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{radius}{rayon}
+\setinterfaceconstant{random}{aleatoire}
+\setinterfaceconstant{reduction}{reduction}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{reference}{reference}
+\setinterfaceconstant{referencing}{referencing}
+\setinterfaceconstant{regionin}{entreregion}
+\setinterfaceconstant{regionout}{regionexterieure}
+\setinterfaceconstant{repeat}{repete}
+\setinterfaceconstant{reset}{reset}
+\setinterfaceconstant{resetnumber}{raznumero}
+\setinterfaceconstant{resolution}{resolution}
+\setinterfaceconstant{right}{droite}
+\setinterfaceconstant{rightcolor}{couleurdroite}
+\setinterfaceconstant{rightcompoundhyphen}{rightcompoundhyphen}
+\setinterfaceconstant{rightedge}{borddroit}
+\setinterfaceconstant{rightedgedistance}{distanceborddroit}
+\setinterfaceconstant{rightframe}{cadredroit}
+\setinterfaceconstant{righthyphen}{righthyphen}
+\setinterfaceconstant{rightmargin}{margedroite}
+\setinterfaceconstant{rightmargindistance}{distancemargedroite}
+\setinterfaceconstant{rightoffset}{rightoffset}
+\setinterfaceconstant{rightquotation}{citationdroite}
+\setinterfaceconstant{rightquote}{citerdroite}
+\setinterfaceconstant{rightsentence}{phrasedroite}
+\setinterfaceconstant{rightspeech}{rightspeech}
+\setinterfaceconstant{rightstyle}{styledroit}
+\setinterfaceconstant{rightsubsentence}{sousphrasedroite}
+\setinterfaceconstant{righttext}{textedroit}
+\setinterfaceconstant{rightwidth}{largeurdroite}
+\setinterfaceconstant{rotation}{rotation}
+\setinterfaceconstant{rule}{ligne}
+\setinterfaceconstant{rulecolor}{couleurligne}
+\setinterfaceconstant{rulethickness}{epaisseurligne}
+\setinterfaceconstant{samepage}{memepage}
+\setinterfaceconstant{sample}{echantillon}
+\setinterfaceconstant{scale}{echelle}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{ecran}
+\setinterfaceconstant{section}{section}
+\setinterfaceconstant{sectionnumber}{numerosection}
+\setinterfaceconstant{separator}{separateur}
+\setinterfaceconstant{set}{set}
+\setinterfaceconstant{setups}{reglages}
+\setinterfaceconstant{side}{cote}
+\setinterfaceconstant{sidealign}{sidealign}
+\setinterfaceconstant{sidemethod}{sidemethod}
+\setinterfaceconstant{sidespaceafter}{espacelateralapres}
+\setinterfaceconstant{sidespacebefore}{espacelateralavant}
+\setinterfaceconstant{sign}{signe}
+\setinterfaceconstant{size}{dimension}
+\setinterfaceconstant{small}{petit}
+\setinterfaceconstant{sorttype}{sorttype}
+\setinterfaceconstant{source}{origine}
+\setinterfaceconstant{space}{espace}
+\setinterfaceconstant{spaceafter}{espaceapres}
+\setinterfaceconstant{spacebefore}{espaceavant}
+\setinterfaceconstant{spaceinbetween}{spaceinbetween}
+\setinterfaceconstant{spacing}{espacement}
+\setinterfaceconstant{split}{split}
+\setinterfaceconstant{splitcolor}{splitcolor}
+\setinterfaceconstant{splitmethod}{splitmethod}
+\setinterfaceconstant{splitoffset}{splitoffset}
+\setinterfaceconstant{spot}{spot}
+\setinterfaceconstant{stack}{stack}
+\setinterfaceconstant{start}{demarre}
+\setinterfaceconstant{state}{etat}
+\setinterfaceconstant{step}{pas}
+\setinterfaceconstant{stop}{stoppe}
+\setinterfaceconstant{stopper}{taquet}
+\setinterfaceconstant{stretch}{etire}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{style}
+\setinterfaceconstant{sub}{sous}
+\setinterfaceconstant{subtitle}{soustitre}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{sx}{sx}
+\setinterfaceconstant{sy}{sy}
+\setinterfaceconstant{symalign}{symalignement}
+\setinterfaceconstant{symbol}{symbole}
+\setinterfaceconstant{symbolset}{jeusymbole}
+\setinterfaceconstant{symcolor}{couleursym}
+\setinterfaceconstant{symstyle}{stylesym}
+\setinterfaceconstant{synonym}{synonyme}
+\setinterfaceconstant{synonymcolor}{couleursynonyme}
+\setinterfaceconstant{synonymstyle}{stylesynonyme}
+\setinterfaceconstant{tab}{tab}
+\setinterfaceconstant{text}{texte}
+\setinterfaceconstant{textcolor}{couleurtexte}
+\setinterfaceconstant{textcommand}{commandetexte}
+\setinterfaceconstant{textdistance}{distancetexte}
+\setinterfaceconstant{textlayer}{calquetexte}
+\setinterfaceconstant{textmargin}{margetexte}
+\setinterfaceconstant{textmethod}{textmethod}
+\setinterfaceconstant{textseparator}{separateurtexte}
+\setinterfaceconstant{textsize}{tailletexte}
+\setinterfaceconstant{textstate}{etattexte}
+\setinterfaceconstant{textstyle}{styletexte}
+\setinterfaceconstant{textwidth}{largeurtexte}
+\setinterfaceconstant{title}{titre}
+\setinterfaceconstant{titlecolor}{couleurtitre}
+\setinterfaceconstant{titlecommand}{titlecommand}
+\setinterfaceconstant{titledistance}{distancetitre}
+\setinterfaceconstant{titleleft}{titleleft}
+\setinterfaceconstant{titleright}{titleright}
+\setinterfaceconstant{titlestyle}{styletitre}
+\setinterfaceconstant{to}{vers}
+\setinterfaceconstant{tolerance}{tolerance}
+\setinterfaceconstant{top}{sup}
+\setinterfaceconstant{topdistance}{distancesup}
+\setinterfaceconstant{topframe}{cadresup}
+\setinterfaceconstant{topoffset}{decalagesup}
+\setinterfaceconstant{topspace}{espacesup}
+\setinterfaceconstant{topstate}{etatsup}
+\setinterfaceconstant{type}{type}
+\setinterfaceconstant{unit}{unite}
+\setinterfaceconstant{unknownreference}{referenceinconnue}
+\setinterfaceconstant{urlalternative}{alternativeurl}
+\setinterfaceconstant{urlspace}{espaceurl}
+\setinterfaceconstant{validate}{valider}
+\setinterfaceconstant{vcommand}{vcommande}
+\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vfil}{vfil}
+\setinterfaceconstant{voffset}{voffset}
+\setinterfaceconstant{way}{mode}
+\setinterfaceconstant{wfactor}{facteurlargeur}
+\setinterfaceconstant{white}{blanc}
+\setinterfaceconstant{width}{largeur}
+\setinterfaceconstant{xfactor}{xfactor}
+\setinterfaceconstant{xmax}{xmax}
+\setinterfaceconstant{xoffset}{xoffset}
+\setinterfaceconstant{xscale}{xscale}
+\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yfactor}{yfactor}
+\setinterfaceconstant{ymax}{ymax}
+\setinterfaceconstant{yoffset}{yoffset}
+\setinterfaceconstant{yscale}{yscale}
+\setinterfaceconstant{ystep}{ystep}
+% definitions for interface elements for language fr
+%
+\setinterfaceelement{begin}{debut}
+\setinterfaceelement{complete}{complete}
+\setinterfaceelement{coupled}{couple}
+\setinterfaceelement{currentlocal}{localcourant}
+\setinterfaceelement{emptyone}{vide}
+\setinterfaceelement{emptytwo}{vide}
+\setinterfaceelement{end}{fin}
+\setinterfaceelement{endsetup}{}
+\setinterfaceelement{get}{obtient}
+\setinterfaceelement{increment}{incremente}
+\setinterfaceelement{list}{liste}
+\setinterfaceelement{listof}{listede}
+\setinterfaceelement{load}{charge}
+\setinterfaceelement{local}{local}
+\setinterfaceelement{makeup}{makeup}
+\setinterfaceelement{next}{suivant}
+\setinterfaceelement{place}{place}
+\setinterfaceelement{previous}{precedent}
+\setinterfaceelement{previouslocal}{localprecedent}
+\setinterfaceelement{reserve}{reserver}
+\setinterfaceelement{see}{voit}
+\setinterfaceelement{setup}{regle}
+\setinterfaceelement{start}{demarre}
+\setinterfaceelement{stop}{stoppe}
+\setinterfaceelement{text}{texte}
+\setinterfaceelement{type}{type}
+% definitions for interface commands for language fr
+%
+\setinterfacecommand{CAPPED}{CAP}
+\setinterfacecommand{Character}{Caractere}
+\setinterfacecommand{Characters}{Caracteres}
+\setinterfacecommand{LABELTEXT}{LABELTEXTE}
+\setinterfacecommand{MONTH}{MOIS}
+\setinterfacecommand{Numbers}{Numeros}
+\setinterfacecommand{Romannumerals}{Chiffresromains}
+\setinterfacecommand{SmallCapped}{Cap}
+\setinterfacecommand{SmallCaps}{Caps}
+\setinterfacecommand{WEEKDAY}{JOURSEMAINE}
+\setinterfacecommand{WORD}{MOT}
+\setinterfacecommand{WORDS}{MOTS}
+\setinterfacecommand{Word}{Mot}
+\setinterfacecommand{Words}{Mots}
+\setinterfacecommand{about}{concernant}
+\setinterfacecommand{adaptlayout}{adaptedisposition}
+\setinterfacecommand{arg}{arg}
+\setinterfacecommand{at}{a}
+\setinterfacecommand{atleftmargin}{atleftmargin}
+\setinterfacecommand{atpage}{alapage}
+\setinterfacecommand{atrightmargin}{atrightmargin}
+\setinterfacecommand{background}{arriereplan}
+\setinterfacecommand{backspace}{retourarriere}
+\setinterfacecommand{blackrule}{lignenoire}
+\setinterfacecommand{blackrules}{lignesnoires}
+\setinterfacecommand{blank}{vide}
+\setinterfacecommand{bookmark}{marquepage}
+\setinterfacecommand{bottomdistance}{distanceinf}
+\setinterfacecommand{bottomheight}{hauteurinf}
+\setinterfacecommand{bottomspace}{espaceinf}
+\setinterfacecommand{but}{but}
+\setinterfacecommand{button}{bouton}
+\setinterfacecommand{bypassblocks}{sauteblocs}
+\setinterfacecommand{character}{caractere}
+\setinterfacecommand{characters}{caracteres}
+\setinterfacecommand{chem}{chem}
+\setinterfacecommand{clip}{clip}
+\setinterfacecommand{clonefield}{clonechamp}
+\setinterfacecommand{color}{couleur}
+\setinterfacecommand{colorbar}{barrecouleur}
+\setinterfacecommand{colorvalue}{valeurcouleur}
+\setinterfacecommand{column}{colonne}
+\setinterfacecommand{comment}{commentaire}
+\setinterfacecommand{comparecolorgroup}{comparegroupecouleur}
+\setinterfacecommand{comparepalet}{comparepalette}
+\setinterfacecommand{completepagenumber}{completenumeropage}
+\setinterfacecommand{completeregister}{completeregistre}
+\setinterfacecommand{component}{composant}
+\setinterfacecommand{convertnumber}{convertitnumero}
+\setinterfacecommand{copyfield}{copitchamp}
+\setinterfacecommand{correctwhitespace}{corrigeespaceblanc}
+\setinterfacecommand{coupledocument}{coupledocument}
+\setinterfacecommand{couplemarking}{couplemarquage}
+\setinterfacecommand{couplepage}{pagedouble}
+\setinterfacecommand{couplepaper}{couplepapier}
+\setinterfacecommand{coupleregister}{coupleregistre}
+\setinterfacecommand{crlf}{crlf}
+\setinterfacecommand{currentdate}{datecourante}
+\setinterfacecommand{currentheadnumber}{numerotetecourant}
+\setinterfacecommand{cutspace}{cutspace}
+\setinterfacecommand{date}{date}
+\setinterfacecommand{decouplemarking}{decouplemarquage}
+\setinterfacecommand{decrementnumber}{decrementenumero}
+\setinterfacecommand{define}{definit}
+\setinterfacecommand{defineaccent}{definitaccent}
+\setinterfacecommand{defineblank}{definitvide}
+\setinterfacecommand{defineblock}{definitbloc}
+\setinterfacecommand{definebodyfont}{definitpolicecorps}
+\setinterfacecommand{definebodyfontenvironment}{definitenvironnementpolicecorps}
+\setinterfacecommand{definebuffer}{definitbuffer}
+\setinterfacecommand{definecharacter}{definicaractere}
+\setinterfacecommand{definecolor}{definitcouleur}
+\setinterfacecommand{definecolorgroup}{definitgroupecouleur}
+\setinterfacecommand{definecolumnbreak}{definitsautdecolonne}
+\setinterfacecommand{definecolumnset}{definitjeucolonne}
+\setinterfacecommand{definecombination}{definecombination}
+\setinterfacecommand{definecombinedlist}{definitlisteimbriquee}
+\setinterfacecommand{definecommand}{definitcommande}
+\setinterfacecommand{defineconversion}{definitconversion}
+\setinterfacecommand{definedescription}{definitdescription}
+\setinterfacecommand{defineenumeration}{definitenumeration}
+\setinterfacecommand{definefield}{definitchamp}
+\setinterfacecommand{definefieldstack}{definitpilechamp}
+\setinterfacecommand{definefiguresymbol}{definitsymbolefigure}
+\setinterfacecommand{definefloat}{definitflottant}
+\setinterfacecommand{definefont}{definitpolice}
+\setinterfacecommand{definefontstyle}{definitstylepolice}
+\setinterfacecommand{definefontsynonym}{definitsynonymepolice}
+\setinterfacecommand{defineframed}{defineframed}
+\setinterfacecommand{defineframedtext}{defineframedtext}
+\setinterfacecommand{definehbox}{definithbox}
+\setinterfacecommand{definehead}{definittete}
+\setinterfacecommand{defineindenting}{definitcompoalinea}
+\setinterfacecommand{defineinmargin}{definitdansmarge}
+\setinterfacecommand{defineinteractionmenu}{definitmenuinteraction}
+\setinterfacecommand{defineitemgroup}{defineitemgroup}
+\setinterfacecommand{definelabel}{definitetiquette}
+\setinterfacecommand{definelayer}{definitcalque}
+\setinterfacecommand{definelayout}{definitdisposition}
+\setinterfacecommand{definelist}{definitliste}
+\setinterfacecommand{definelogo}{definitlogo}
+\setinterfacecommand{definemainfield}{definitchampprincipal}
+\setinterfacecommand{definemakeup}{definitmakeup}
+\setinterfacecommand{definemarking}{definitmarquage}
+\setinterfacecommand{definemathalignment}{definemathalignment}
+\setinterfacecommand{defineoutput}{definitsortie}
+\setinterfacecommand{defineoverlay}{definitrevetement}
+\setinterfacecommand{definepagebreak}{definitsautdepage}
+\setinterfacecommand{definepalet}{definitpalette}
+\setinterfacecommand{definepapersize}{definittaillepapier}
+\setinterfacecommand{defineparagraphs}{definitparagraphes}
+\setinterfacecommand{defineplacement}{defineplacement}
+\setinterfacecommand{defineprofile}{definitprofil}
+\setinterfacecommand{defineprogram}{definitprogramme}
+\setinterfacecommand{definerawfont}{definitpolicebrute}
+\setinterfacecommand{definereference}{definitreference}
+\setinterfacecommand{definereferenceformat}{definitformatreference}
+\setinterfacecommand{definereferencelist}{definitlistereference}
+\setinterfacecommand{defineregister}{definitregistre}
+\setinterfacecommand{definerule}{definitregle}
+\setinterfacecommand{definesection}{definitsection}
+\setinterfacecommand{definesectionblock}{definitblocsection}
+\setinterfacecommand{definesorting}{definittri}
+\setinterfacecommand{definestartstop}{definitdemarrestoppe}
+\setinterfacecommand{definestyle}{definitstyle}
+\setinterfacecommand{definesubfield}{definitsouschamp}
+\setinterfacecommand{definesymbol}{definitsymbole}
+\setinterfacecommand{definesynonyms}{definitsynonymes}
+\setinterfacecommand{definetabletemplate}{definittrametableau}
+\setinterfacecommand{definetabulate}{definittabulation}
+\setinterfacecommand{definetext}{definittexte}
+\setinterfacecommand{definetextposition}{definitpositiontexte}
+\setinterfacecommand{definetextvariable}{definitvariabletexte}
+\setinterfacecommand{definetype}{definittype}
+\setinterfacecommand{definetyping}{definitdactylo}
+\setinterfacecommand{defineversion}{definitversion}
+\setinterfacecommand{determineheadnumber}{determinenumerotete}
+\setinterfacecommand{determinelistcharacteristics}{determinecaracteristiqueliste}
+\setinterfacecommand{determineregistercharacteristics}{determinecaracteristiquesregistre}
+\setinterfacecommand{dimension}{dimension}
+\setinterfacecommand{disableinteractionmenu}{inhibemenuinteraction}
+\setinterfacecommand{domicile}{domicile}
+\setinterfacecommand{donttest}{sanstest}
+\setinterfacecommand{edgedistance}{distancebord}
+\setinterfacecommand{edgewidth}{largeurbord}
+\setinterfacecommand{emptylines}{emptylines}
+\setinterfacecommand{environment}{environement}
+\setinterfacecommand{externalfigure}{figureexterne}
+\setinterfacecommand{fact}{fait}
+\setinterfacecommand{field}{champ}
+\setinterfacecommand{fieldstack}{pilechamp}
+\setinterfacecommand{fillinfield}{remplitchamp}
+\setinterfacecommand{fillinline}{remplitligne}
+\setinterfacecommand{fillinrules}{remplitlignesreglees}
+\setinterfacecommand{fillintext}{remplittexte}
+\setinterfacecommand{fitfield}{ajustechamp}
+\setinterfacecommand{fixedspace}{espacefixe}
+\setinterfacecommand{fixedspaces}{espacesfixes}
+\setinterfacecommand{followprofile}{suivantprofil}
+\setinterfacecommand{followprofileversion}{suivantversionprofil}
+\setinterfacecommand{followversion}{suivantversion}
+\setinterfacecommand{footerdistance}{distancepdp}
+\setinterfacecommand{footerheight}{hauteurpdp}
+\setinterfacecommand{footnote}{notepdp}
+\setinterfacecommand{footnotetext}{textenotepdp}
+\setinterfacecommand{forceblocks}{forceblocs}
+\setinterfacecommand{formulanumber}{numeroformule}
+\setinterfacecommand{fraction}{fraction}
+\setinterfacecommand{framed}{framed}
+\setinterfacecommand{from}{de}
+\setinterfacecommand{getbuffer}{prendbuffer}
+\setinterfacecommand{getmarking}{obtientmarquage}
+\setinterfacecommand{getnumber}{getnumber}
+\setinterfacecommand{godown}{vaenbas}
+\setinterfacecommand{goto}{va}
+\setinterfacecommand{gotobox}{vaalaboite}
+\setinterfacecommand{gotopage}{vaalapage}
+\setinterfacecommand{graycolor}{couleurgrise}
+\setinterfacecommand{greyvalue}{valeurgris}
+\setinterfacecommand{grid}{grille}
+\setinterfacecommand{hairline}{ligneh}
+\setinterfacecommand{head}{tete}
+\setinterfacecommand{headerdistance}{distanceentete}
+\setinterfacecommand{headerheight}{hauteurentete}
+\setinterfacecommand{headlevel}{niveautete}
+\setinterfacecommand{headnumber}{numerotete}
+\setinterfacecommand{headsym}{headsym}
+\setinterfacecommand{headtext}{textetete}
+\setinterfacecommand{hideblocks}{cacheblocs}
+\setinterfacecommand{high}{haut}
+\setinterfacecommand{hl}{hl}
+\setinterfacecommand{immediatebetweenlist}{immediatebetweenlist}
+\setinterfacecommand{immediatetolist}{immediatetolist}
+\setinterfacecommand{in}{dans}
+\setinterfacecommand{incrementnumber}{incrementenumero}
+\setinterfacecommand{indenting}{composeenalinea}
+\setinterfacecommand{inframed}{inframed}
+\setinterfacecommand{infull}{infull}
+\setinterfacecommand{ininner}{ininner}
+\setinterfacecommand{inleft}{dansgauche}
+\setinterfacecommand{inleftedge}{dansbordgauche}
+\setinterfacecommand{inleftmargin}{dansmargegauche}
+\setinterfacecommand{inline}{alaligne}
+\setinterfacecommand{inmargin}{dansmarge}
+\setinterfacecommand{inmframed}{inmframed}
+\setinterfacecommand{inneredgedistance}{inneredgedistance}
+\setinterfacecommand{inneredgewidth}{inneredgewidth}
+\setinterfacecommand{innermargindistance}{innermargindistance}
+\setinterfacecommand{innermarginwidth}{innermarginwidth}
+\setinterfacecommand{inothermargin}{dansautremarge}
+\setinterfacecommand{inouter}{inouter}
+\setinterfacecommand{inright}{dansdroite}
+\setinterfacecommand{inrightedge}{dansborddroit}
+\setinterfacecommand{inrightmargin}{dansmargedroite}
+\setinterfacecommand{installlanguage}{installelangue}
+\setinterfacecommand{interactionbar}{barreinteraction}
+\setinterfacecommand{interactionbuttons}{boutonsinteraction}
+\setinterfacecommand{interactionmenu}{menuinteraction}
+\setinterfacecommand{item}{element}
+\setinterfacecommand{items}{elements}
+\setinterfacecommand{its}{el}
+\setinterfacecommand{keepblocks}{gardeblocs}
+\setinterfacecommand{label}{etiquette}
+\setinterfacecommand{labels}{etiquettes}
+\setinterfacecommand{labeltext}{labeltexte}
+\setinterfacecommand{language}{langue}
+\setinterfacecommand{leftaligned}{aligneagauche}
+\setinterfacecommand{leftedgedistance}{distancebordgauche}
+\setinterfacecommand{leftedgewidth}{largeurbordgauche}
+\setinterfacecommand{leftmargindistance}{distancemargegauche}
+\setinterfacecommand{leftmarginwidth}{largeurmargegauche}
+\setinterfacecommand{leg}{leg}
+\setinterfacecommand{linewidth}{largeurligne}
+\setinterfacecommand{listheight}{hauteurliste}
+\setinterfacecommand{listlength}{llongueurliste}
+\setinterfacecommand{listsymbol}{listesymbole}
+\setinterfacecommand{listwidth}{largeurliste}
+\setinterfacecommand{logfields}{logchamp}
+\setinterfacecommand{lohi}{baha}
+\setinterfacecommand{low}{bas}
+\setinterfacecommand{macroname}{nommacro}
+\setinterfacecommand{mainlanguage}{langueprincipale}
+\setinterfacecommand{makeupheight}{hauteurmakeup}
+\setinterfacecommand{makeupwidth}{largeurmakeup}
+\setinterfacecommand{mar}{mar}
+\setinterfacecommand{margindistance}{distancemarge}
+\setinterfacecommand{marginrule}{margereglee}
+\setinterfacecommand{margintext}{textemarge}
+\setinterfacecommand{margintitle}{titremarge}
+\setinterfacecommand{marginwidth}{largeurmarge}
+\setinterfacecommand{marginword}{motmarge}
+\setinterfacecommand{marking}{marquage}
+\setinterfacecommand{markversion}{marquageversion}
+\setinterfacecommand{mathematics}{mathematique}
+\setinterfacecommand{menubutton}{boutonmenu}
+\setinterfacecommand{mframed}{mframed}
+\setinterfacecommand{midaligned}{aligneaumilieu}
+\setinterfacecommand{mirror}{reflete}
+\setinterfacecommand{month}{mois}
+\setinterfacecommand{moveformula}{deplaceformule}
+\setinterfacecommand{moveongrid}{deplacesurgrille}
+\setinterfacecommand{movesidefloat}{movesidefloat}
+\setinterfacecommand{navigating}{navigating}
+\setinterfacecommand{nodimension}{sansdimension}
+\setinterfacecommand{noheaderandfooterlines}{sanslignesenteteetpdp}
+\setinterfacecommand{noindenting}{sansalinea}
+\setinterfacecommand{nolist}{sansliste}
+\setinterfacecommand{nomarking}{sansmarquage}
+\setinterfacecommand{nomoreblocks}{pasplusdeblocs}
+\setinterfacecommand{nomorefiles}{pasplusdefichiers}
+\setinterfacecommand{nop}{nop}
+\setinterfacecommand{nospace}{sansespace}
+\setinterfacecommand{note}{note}
+\setinterfacecommand{notopandbottomlines}{sanslignessupetinf}
+\setinterfacecommand{notsmallcapped}{nocap}
+\setinterfacecommand{nowhitespace}{sansespaceblanc}
+\setinterfacecommand{numberofsubpages}{nombredesouspages}
+\setinterfacecommand{numbers}{numeros}
+\setinterfacecommand{outeredgedistance}{outeredgedistance}
+\setinterfacecommand{outeredgewidth}{outeredgewidth}
+\setinterfacecommand{outermargindistance}{outermargindistance}
+\setinterfacecommand{outermarginwidth}{outermarginwidth}
+\setinterfacecommand{overbar}{overbar}
+\setinterfacecommand{overbars}{overbars}
+\setinterfacecommand{overstrike}{surlignetout}
+\setinterfacecommand{overstrikes}{surligne}
+\setinterfacecommand{packed}{groupe}
+\setinterfacecommand{page}{page}
+\setinterfacecommand{pagedepth}{pagedepth}
+\setinterfacecommand{pagenumber}{numeropage}
+\setinterfacecommand{pageoffset}{pageoffset}
+\setinterfacecommand{pagereference}{referencepage}
+\setinterfacecommand{pagetype}{tapepage}
+\setinterfacecommand{paperheight}{hauteurpapier}
+\setinterfacecommand{paperwidth}{largeurpapier}
+\setinterfacecommand{periods}{periodes}
+\setinterfacecommand{plaatsruwelijst}{placerawlist}
+\setinterfacecommand{placebookmarks}{placemarquespages}
+\setinterfacecommand{placecombinedlist}{placelisteinmbriquee}
+\setinterfacecommand{placefloat}{placeflottant}
+\setinterfacecommand{placefootnotes}{placenotespdp}
+\setinterfacecommand{placeformula}{placeformule}
+\setinterfacecommand{placeheadnumber}{placenumerotete}
+\setinterfacecommand{placeheadtext}{placetextetete}
+\setinterfacecommand{placelegend}{placelegende}
+\setinterfacecommand{placelist}{placeliste}
+\setinterfacecommand{placelocalfootnotes}{placenotespdplocales}
+\setinterfacecommand{placelogos}{placelogos}
+\setinterfacecommand{placeongrid}{placesurgrille}
+\setinterfacecommand{placeontopofeachother}{placelesunsaudessusdesautres}
+\setinterfacecommand{placepagenumber}{placenumeropage}
+\setinterfacecommand{placereferencelist}{placelistereference}
+\setinterfacecommand{placeregister}{placeregistre}
+\setinterfacecommand{placerule}{placeregle}
+\setinterfacecommand{placesidebyside}{placecoteacote}
+\setinterfacecommand{placesubformula}{placesousformule}
+\setinterfacecommand{placetextvariable}{placevariabletexte}
+\setinterfacecommand{position}{position}
+\setinterfacecommand{positiontext}{positionnetexte}
+\setinterfacecommand{printpaperheight}{hauteureditionpapier}
+\setinterfacecommand{printpaperwidth}{largeureditionpapier}
+\setinterfacecommand{processblocks}{traiteblocs}
+\setinterfacecommand{processpage}{traitepage}
+\setinterfacecommand{product}{produit}
+\setinterfacecommand{program}{programme}
+\setinterfacecommand{project}{projet}
+\setinterfacecommand{publication}{publication}
+\setinterfacecommand{quotation}{citation}
+\setinterfacecommand{quote}{citer}
+\setinterfacecommand{ran}{ran}
+\setinterfacecommand{redo}{refait}
+\setinterfacecommand{ref}{ref}
+\setinterfacecommand{reference}{reference}
+\setinterfacecommand{referral}{recommandation}
+\setinterfacecommand{referraldate}{daterecommandation}
+\setinterfacecommand{referring}{faitreference}
+\setinterfacecommand{remark}{commentaire}
+\setinterfacecommand{reset}{raz}
+\setinterfacecommand{resetmarking}{razmarquage}
+\setinterfacecommand{resetnumber}{raznumero}
+\setinterfacecommand{resettext}{resettextcontent}
+\setinterfacecommand{rightaligned}{aligneadroite}
+\setinterfacecommand{rightedgedistance}{distanceborddroit}
+\setinterfacecommand{rightedgewidth}{largeurborddroit}
+\setinterfacecommand{rightmargindistance}{distancemargedroite}
+\setinterfacecommand{rightmarginwidth}{largeurmargedroite}
+\setinterfacecommand{romannumerals}{chiffresromains}
+\setinterfacecommand{rotate}{oriente}
+\setinterfacecommand{scale}{echelle}
+\setinterfacecommand{screen}{ecran}
+\setinterfacecommand{selectblocks}{selectionneblocs}
+\setinterfacecommand{selectpaper}{selectionnepapier}
+\setinterfacecommand{selectversion}{selectionneversion}
+\setinterfacecommand{setnumber}{affectenumero}
+\setinterfacecommand{settextcontent}{settext}
+\setinterfacecommand{settextvariable}{affectevariabletexte}
+\setinterfacecommand{setupalign}{reglealignement}
+\setinterfacecommand{setuparranging}{reglearrangement}
+\setinterfacecommand{setupbackground}{reglearriereplan}
+\setinterfacecommand{setupbackgrounds}{reglearriereplans}
+\setinterfacecommand{setupblackrules}{reglelignesnoires}
+\setinterfacecommand{setupblank}{definitvide}
+\setinterfacecommand{setupblock}{reglebloc}
+\setinterfacecommand{setupbodyfont}{reglepolicecorps}
+\setinterfacecommand{setupbodyfontenvironment}{regleenvironnementpolicecorps}
+\setinterfacecommand{setupbottom}{regleinf}
+\setinterfacecommand{setupbottomtexts}{regletextesinf}
+\setinterfacecommand{setupbuffer}{reglebuffer}
+\setinterfacecommand{setupbuttons}{regleboutons}
+\setinterfacecommand{setupcapitals}{reglecapitales}
+\setinterfacecommand{setupcaption}{regleintitule}
+\setinterfacecommand{setupcaptions}{regleintitules}
+\setinterfacecommand{setupclipping}{regleclipping}
+\setinterfacecommand{setupcolor}{reglecouleur}
+\setinterfacecommand{setupcolors}{reglecouleurs}
+\setinterfacecommand{setupcolumns}{reglecolonnes}
+\setinterfacecommand{setupcolumnset}{reglejeucolonne}
+\setinterfacecommand{setupcolumnsetlines}{setupcolumnsetlines}
+\setinterfacecommand{setupcolumnsetstart}{setupcolumnsetstart}
+\setinterfacecommand{setupcombinations}{reglecombinaisons}
+\setinterfacecommand{setupcombinedlist}{reglelisteimbriquee}
+\setinterfacecommand{setupcomment}{reglecommentaire}
+\setinterfacecommand{setupdescriptions}{regledescriptions}
+\setinterfacecommand{setupenumerations}{regleenumerations}
+\setinterfacecommand{setupexternalfigures}{reglefiguresexternes}
+\setinterfacecommand{setupfield}{reglechamp}
+\setinterfacecommand{setupfields}{reglechamps}
+\setinterfacecommand{setupfillinlines}{regleremplitligne}
+\setinterfacecommand{setupfillinrules}{regleremplitlignesreglees}
+\setinterfacecommand{setupfloat}{regleflottant}
+\setinterfacecommand{setupfloats}{regleflottants}
+\setinterfacecommand{setupfloatsplitting}{regleseparationflottant}
+\setinterfacecommand{setupfooter}{reglepdp}
+\setinterfacecommand{setupfootertexts}{regletextespdp}
+\setinterfacecommand{setupfootnotedefinition}{definitnotepdp}
+\setinterfacecommand{setupfootnotes}{reglenotepdp}
+\setinterfacecommand{setupforms}{regleformulaires}
+\setinterfacecommand{setupformulas}{regleformules}
+\setinterfacecommand{setupframed}{regleencadre}
+\setinterfacecommand{setupframedtexts}{setupframedtexts}
+\setinterfacecommand{setuphead}{regletete}
+\setinterfacecommand{setupheader}{regleentete}
+\setinterfacecommand{setupheadertexts}{regletextesentete}
+\setinterfacecommand{setupheadnumber}{reglenumerotete}
+\setinterfacecommand{setupheads}{regletetes}
+\setinterfacecommand{setupheadtext}{regletextetete}
+\setinterfacecommand{setuphyphenmark}{reglemarquagehyphenation}
+\setinterfacecommand{setupindentations}{reglealineas}
+\setinterfacecommand{setupindenting}{reglecomposeenalinea}
+\setinterfacecommand{setupinmargin}{regledansmarge}
+\setinterfacecommand{setupinteraction}{regleinteraction}
+\setinterfacecommand{setupinteractionbar}{reglebarreinteraction}
+\setinterfacecommand{setupinteractionmenu}{reglemenuinteraction}
+\setinterfacecommand{setupinteractionscreen}{regleecraninteraction}
+\setinterfacecommand{setupinterlinespace}{regleespacementinterligne}
+\setinterfacecommand{setupitemgroup}{setupitemgroup}
+\setinterfacecommand{setupitemgroups}{reglegroupeselements}
+\setinterfacecommand{setupitems}{regleelements}
+\setinterfacecommand{setuplabeltext}{reglelabeltexte}
+\setinterfacecommand{setuplanguage}{reglelangue}
+\setinterfacecommand{setuplayout}{regledisposition}
+\setinterfacecommand{setuplegend}{reglelegende}
+\setinterfacecommand{setuplinenumbering}{reglenumerotationligne}
+\setinterfacecommand{setuplines}{reglelignes}
+\setinterfacecommand{setuplinewidth}{regleepaisseurligne}
+\setinterfacecommand{setuplist}{regleliste}
+\setinterfacecommand{setupmakeup}{reglemakeup}
+\setinterfacecommand{setupmarginblocks}{regleblocmarge}
+\setinterfacecommand{setupmarginrules}{reglemargereglee}
+\setinterfacecommand{setupmarking}{reglemarquage}
+\setinterfacecommand{setupmathalignment}{setupmathalignment}
+\setinterfacecommand{setupnarrower}{reglecompoetroite}
+\setinterfacecommand{setupnumber}{reglenumero}
+\setinterfacecommand{setupnumbering}{reglenumerotation}
+\setinterfacecommand{setupoppositeplacing}{regleplacementopposition}
+\setinterfacecommand{setupoutput}{reglesortie}
+\setinterfacecommand{setuppagecomment}{reglecommentairepage}
+\setinterfacecommand{setuppagenumber}{reglenumeropage}
+\setinterfacecommand{setuppagenumbering}{reglenumerotationpage}
+\setinterfacecommand{setuppagetransitions}{regletransitionspage}
+\setinterfacecommand{setuppalet}{reglepalette}
+\setinterfacecommand{setuppaper}{reglepapier}
+\setinterfacecommand{setuppapersize}{regletaillepapier}
+\setinterfacecommand{setupparagraphnumbering}{reglenumerotationparagraphe}
+\setinterfacecommand{setupparagraphs}{regleparagraphes}
+\setinterfacecommand{setupplacement}{setupplacement}
+\setinterfacecommand{setuppositioning}{reglepositionnement}
+\setinterfacecommand{setupprofiles}{regleprofils}
+\setinterfacecommand{setupprograms}{regleprogrammes}
+\setinterfacecommand{setuppublications}{reglepublications}
+\setinterfacecommand{setupquote}{demarreciter}
+\setinterfacecommand{setupreferencelist}{reglelistereference}
+\setinterfacecommand{setupreferencing}{reglereferencage}
+\setinterfacecommand{setupregister}{regleregistre}
+\setinterfacecommand{setuprotate}{regleoriente}
+\setinterfacecommand{setuprule}{regleregle}
+\setinterfacecommand{setups}{reglages}
+\setinterfacecommand{setupscreens}{regleecrans}
+\setinterfacecommand{setupsection}{reglesection}
+\setinterfacecommand{setupsectionblock}{regleblocsection}
+\setinterfacecommand{setupsorting}{regletri}
+\setinterfacecommand{setupspacing}{regleespacement}
+\setinterfacecommand{setupstartstop}{regledemarrestoppe}
+\setinterfacecommand{setupstrut}{reglestrut}
+\setinterfacecommand{setupsubpagenumber}{reglesousnumeropage}
+\setinterfacecommand{setupsymbolset}{reglejeusymboles}
+\setinterfacecommand{setupsynchronization}{reglesynchronisation}
+\setinterfacecommand{setupsynchronizationbar}{reglebarresynchronisation}
+\setinterfacecommand{setupsynonyms}{reglesynonymes}
+\setinterfacecommand{setupsystem}{reglesysteme}
+\setinterfacecommand{setuptab}{regletab}
+\setinterfacecommand{setuptables}{regletableaux}
+\setinterfacecommand{setuptabulate}{regletabulation}
+\setinterfacecommand{setuptext}{regletexte}
+\setinterfacecommand{setuptextposition}{reglepositiontexte}
+\setinterfacecommand{setuptextrules}{reglelignesreglestexte}
+\setinterfacecommand{setuptexttexts}{regletextestexte}
+\setinterfacecommand{setuptextvariable}{reglevariabletexte}
+\setinterfacecommand{setupthinrules}{regletraitsfins}
+\setinterfacecommand{setuptolerance}{regletolerance}
+\setinterfacecommand{setuptop}{reglesup}
+\setinterfacecommand{setuptoptexts}{regletextessup}
+\setinterfacecommand{setuptype}{regletype}
+\setinterfacecommand{setuptyping}{regledactylo}
+\setinterfacecommand{setupunderbar}{reglesouslignage}
+\setinterfacecommand{setupurl}{regleurl}
+\setinterfacecommand{setupversions}{regleversions}
+\setinterfacecommand{setupwhitespace}{regleespaceblanc}
+\setinterfacecommand{showbodyfont}{montrepolicecorps}
+\setinterfacecommand{showbodyfontenvironment}{montreenvironnementpolicecorps}
+\setinterfacecommand{showcolor}{montrecouleur}
+\setinterfacecommand{showcolorgroup}{montregroupecouleur}
+\setinterfacecommand{showexternalfigures}{montrefiguresexternes}
+\setinterfacecommand{showfields}{montrechamps}
+\setinterfacecommand{showframe}{montrecadre}
+\setinterfacecommand{showgrid}{montregrille}
+\setinterfacecommand{showlayout}{montredisposition}
+\setinterfacecommand{showmakeup}{montremakeup}
+\setinterfacecommand{showpalet}{montrepalette}
+\setinterfacecommand{showprint}{montreedition}
+\setinterfacecommand{showsetups}{montrereglages}
+\setinterfacecommand{showstruts}{montrestruts}
+\setinterfacecommand{showsymbolset}{montrejeusymboles}
+\setinterfacecommand{smallcapped}{cap}
+\setinterfacecommand{someline}{uneligne}
+\setinterfacecommand{somewhere}{qqpart}
+\setinterfacecommand{space}{espace}
+\setinterfacecommand{splitfloat}{separeflottant}
+\setinterfacecommand{startalignment}{demarrealignement}
+\setinterfacecommand{startbackground}{demarrearriereplan}
+\setinterfacecommand{startcoding}{demarrecodage}
+\setinterfacecommand{startcolor}{demarrecouleur}
+\setinterfacecommand{startcolumnmakeup}{startcolumnmakeup}
+\setinterfacecommand{startcolumns}{demarrecolonnes}
+\setinterfacecommand{startcolumnset}{demarrejeucolonne}
+\setinterfacecommand{startcombination}{demarrecombinaison}
+\setinterfacecommand{startcomponent}{demarrecomposant}
+\setinterfacecommand{startdocument}{demarredocument}
+\setinterfacecommand{startenvironment}{demarreenvironement}
+\setinterfacecommand{startfigure}{demarrefigure}
+\setinterfacecommand{startglobal}{demarreglobal}
+\setinterfacecommand{startline}{demarreligne}
+\setinterfacecommand{startlinecorrection}{demarrecorrectionligne}
+\setinterfacecommand{startlinenumbering}{demarrenumerotationligne}
+\setinterfacecommand{startlines}{demarrelignes}
+\setinterfacecommand{startlocal}{demarrelocal}
+\setinterfacecommand{startlocalfootnotes}{demarrenotespdplocales}
+\setinterfacecommand{startmakeup}{demarremakeup}
+\setinterfacecommand{startmarginblock}{demarreblocmarge}
+\setinterfacecommand{startmarginrule}{demarremargereglee}
+\setinterfacecommand{startnarrower}{demarrecompoetroite}
+\setinterfacecommand{startopposite}{demarreopposition}
+\setinterfacecommand{startoverlay}{demarrerevetement}
+\setinterfacecommand{startoverzicht}{demarrevuedensemble}
+\setinterfacecommand{startpacked}{demarregroupe}
+\setinterfacecommand{startpositioning}{demarrepositionnement}
+\setinterfacecommand{startproduct}{demarreproduit}
+\setinterfacecommand{startprofile}{demarreprofil}
+\setinterfacecommand{startproject}{demarreprojet}
+\setinterfacecommand{startquotation}{demarrecitation}
+\setinterfacecommand{startraster}{demarreraster}
+\setinterfacecommand{startsymbolset}{demarrejeusymboles}
+\setinterfacecommand{startsynchronization}{demarresynchronisation}
+\setinterfacecommand{starttable}{demarretableau}
+\setinterfacecommand{starttables}{demarretableaux}
+\setinterfacecommand{starttext}{demarretexte}
+\setinterfacecommand{starttextrule}{demarreligneregleetexte}
+\setinterfacecommand{startunpacked}{demarredegroupe}
+\setinterfacecommand{startversion}{demarreversion}
+\setinterfacecommand{stopalignment}{stoppealignement}
+\setinterfacecommand{stopbackground}{stoppearriereplan}
+\setinterfacecommand{stopcoding}{stoppecodage}
+\setinterfacecommand{stopcolor}{stoppecouleur}
+\setinterfacecommand{stopcolumnmakeup}{stopcolumnmakeup}
+\setinterfacecommand{stopcolumns}{stoppecolonnes}
+\setinterfacecommand{stopcolumnset}{stoppejeucolonne}
+\setinterfacecommand{stopcombination}{stoppecombinaison}
+\setinterfacecommand{stopcomponent}{stoppecomposant}
+\setinterfacecommand{stopdocument}{stoppedocument}
+\setinterfacecommand{stopenvironment}{stoppeenvironement}
+\setinterfacecommand{stopglobal}{stoppeglobal}
+\setinterfacecommand{stopline}{stoppeligne}
+\setinterfacecommand{stoplinecorrection}{stoppecorrectionligne}
+\setinterfacecommand{stoplinenumbering}{stoppenumerotationligne}
+\setinterfacecommand{stoplines}{stoppelignes}
+\setinterfacecommand{stoplocal}{stoppelocal}
+\setinterfacecommand{stoplocalfootnotes}{stoppenotespdplocales}
+\setinterfacecommand{stopmakeup}{stoppemakeup}
+\setinterfacecommand{stopmarginblock}{stoppeblocmarge}
+\setinterfacecommand{stopmarginrule}{stoppemargereglee}
+\setinterfacecommand{stopnarrower}{stopcompoetroite}
+\setinterfacecommand{stopopposite}{stoppeopposition}
+\setinterfacecommand{stopoverlay}{stopperevetement}
+\setinterfacecommand{stopoverzicht}{stoppevuedensemble}
+\setinterfacecommand{stoppacked}{stoppegroupe}
+\setinterfacecommand{stoppositioning}{stoppepositionnement}
+\setinterfacecommand{stopproduct}{stoppeproduit}
+\setinterfacecommand{stopprofile}{stoppeprofil}
+\setinterfacecommand{stopproject}{stoppeprojet}
+\setinterfacecommand{stopquotation}{stoppecitation}
+\setinterfacecommand{stopraster}{stopperaster}
+\setinterfacecommand{stopsynchronization}{stoppesynchronisation}
+\setinterfacecommand{stoptable}{stoppetableau}
+\setinterfacecommand{stoptables}{stoppetableaux}
+\setinterfacecommand{stoptext}{stoppetexte}
+\setinterfacecommand{stoptextrule}{stoppeligneregleetexte}
+\setinterfacecommand{stopunpacked}{stoppedegroupe}
+\setinterfacecommand{stopversion}{stoppeversion}
+\setinterfacecommand{stretched}{etire}
+\setinterfacecommand{subformulanumber}{numerosousformule}
+\setinterfacecommand{subpagenumber}{sousnumeropage}
+\setinterfacecommand{switchtobodyfont}{changepolicecorps}
+\setinterfacecommand{switchtorawfont}{changepolicebrute}
+\setinterfacecommand{sym}{sym}
+\setinterfacecommand{symbol}{symbole}
+\setinterfacecommand{synchronizationbar}{barresynchronisation}
+\setinterfacecommand{synchronize}{synchronise}
+\setinterfacecommand{tab}{tab}
+\setinterfacecommand{testcolumn}{testcolumn}
+\setinterfacecommand{testpage}{testpage}
+\setinterfacecommand{tex}{tex}
+\setinterfacecommand{textheight}{hauteurtexte}
+\setinterfacecommand{textreference}{referencetexte}
+\setinterfacecommand{textrule}{ligneregleetexte}
+\setinterfacecommand{textvariable}{variabletexte}
+\setinterfacecommand{textwidth}{largeurtexte}
+\setinterfacecommand{thinrule}{traitfin}
+\setinterfacecommand{thinrules}{traitsfins}
+\setinterfacecommand{tooltip}{suggestion}
+\setinterfacecommand{topdistance}{distancesup}
+\setinterfacecommand{topheight}{hauteursup}
+\setinterfacecommand{topspace}{espacesup}
+\setinterfacecommand{totalnumberofpages}{nombretotaldepages}
+\setinterfacecommand{translate}{traduire}
+\setinterfacecommand{txt}{txt}
+\setinterfacecommand{typ}{typ}
+\setinterfacecommand{type}{dactylographier}
+\setinterfacecommand{typebuffer}{tapebuffer}
+\setinterfacecommand{typefile}{fichierdactylo}
+\setinterfacecommand{underbar}{souslignetout}
+\setinterfacecommand{underbars}{sousligne}
+\setinterfacecommand{unitmeaning}{sensunite}
+\setinterfacecommand{unknown}{inconnu}
+\setinterfacecommand{useJSscripts}{utiliseJSscripts}
+\setinterfacecommand{useURL}{utiliseURL}
+\setinterfacecommand{useXMLfilter}{useXMLfilter}
+\setinterfacecommand{useblocks}{utiliseblocs}
+\setinterfacecommand{usecommands}{utilisecommandes}
+\setinterfacecommand{useencoding}{utiliseencodage}
+\setinterfacecommand{useexternaldocument}{utilisedocumentexterne}
+\setinterfacecommand{useexternalfigure}{utilisefigureexterne}
+\setinterfacecommand{useexternalfile}{utilisefichierexterne}
+\setinterfacecommand{useexternalfiles}{utilisefichiersexternes}
+\setinterfacecommand{useexternalsoundtrack}{utilisepsiteaudioexterne}
+\setinterfacecommand{usemodule}{utilisemodule}
+\setinterfacecommand{usemodules}{utilisemodules}
+\setinterfacecommand{usepath}{utilisechemin}
+\setinterfacecommand{usereferences}{utilisereferences}
+\setinterfacecommand{usespecials}{utilisespecialites}
+\setinterfacecommand{usesymbols}{utilisesymboles}
+\setinterfacecommand{usetypescript}{usetypescript}
+\setinterfacecommand{usetypescriptfile}{usetypescriptfile}
+\setinterfacecommand{useurl}{utiliseurl}
+\setinterfacecommand{version}{version}
+\setinterfacecommand{vl}{vl}
+\setinterfacecommand{weekday}{joursemaine}
+\setinterfacecommand{whitespace}{espaceblanc}
+\setinterfacecommand{wordright}{motdroit}
+\setinterfacecommand{writebetweenlist}{ecritentreliste}
+\setinterfacecommand{writetolist}{ecritdansliste}
+\setinterfacecommand{writetoreferencelist}{ecritdanslistereference}
+\setinterfacecommand{writetoregister}{ecritregistre}
+%
+\endinput
\ No newline at end of file
diff --git a/tex/context/base/mult-fst.tex b/tex/context/base/mult-fst.tex
index af915e000..c237f5743 100644
--- a/tex/context/base/mult-fst.tex
+++ b/tex/context/base/mult-fst.tex
@@ -20,10 +20,33 @@
\startinterface english
- \def\dosetevalue #1#2{\@EA\edef\csname#1#2\endcsname}
- \def\dosetgvalue #1#2{\@EA\gdef\csname#1#2\endcsname}
- \def\dosetvalue #1#2{\@EA\def \csname#1#2\endcsname}
- \def\docopyvalue#1#2#3{\@EA\def \csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}}
+ \def\dosetvalue #1#2{\@EA\def \csname#1#2\endcsname}
+ \def\dosetevalue #1#2{\@EA\edef\csname#1#2\endcsname}
+ \def\dosetgvalue #1#2{\@EA\gdef\csname#1#2\endcsname}
+ \def\dosetxvalue #1#2{\@EA\gdef\csname#1#2\endcsname}
+ \def\docopyvalue#1#2#3{\@EA\def \csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}}
+
+ \ifx\ctxlua\undefined
+
+ \def\setinterfaceconstant#1#2%
+ {\setvalue{\c!prefix!#1}{#1}}
+
+ \def\setinterfacevariable#1#2%
+ {\setvalue{\v!prefix!#1}{#2}}
+
+ \else
+
+ \def\setinterfaceconstant#1#2%
+ {\ctxlua{interfaces.setconstant("#1","#2")}%
+ \setvalue{\c!prefix!#1}{#1}}
+
+ \def\setinterfacevariable#1#2%
+ {\ctxlua{interfaces.setvariable("#1","#2")}%
+ \setvalue{\v!prefix!#1}{#2}}
+
+ \fi
+
+ \def\interfaced#1{#1}
\stopinterface
diff --git a/tex/context/base/mult-his.tex b/tex/context/base/mult-his.tex
new file mode 100644
index 000000000..40010499d
--- /dev/null
+++ b/tex/context/base/mult-his.tex
@@ -0,0 +1,1164 @@
+%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 \startmessages english library: alfa
+%D title: something
+%D 1: first message
+%D 2: second (--) message --
+%D \stopmessages
+%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 \startmessages english library: alfa
+%D 10: tenth message
+%D \stopmessages
+%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 \ {12cm}
+%D \ {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 \ {21.0cm}
+%D \ {27.9cm}
+%D \stoptyping
+%D
+%D The prefixes \type{} and \type{} 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 \ {}
+%D \ {}
+%D \ {}
+%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 \ {}
+%D \ {12cm}
+%D \stoptyping
+%D
+%D A (minor) complication is that where in english we use
+%D \type{}, in dutch we find both \type{} and
+%D \type{}. 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 \
+%D \
+%D \stoptyping
+%D
+%D But in dutch we have the following:
+%D
+%D \starttyping
+%D \
+%D \
+%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 \
+%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}, but in dutch we
+%D have: \type{\stelin}. 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 }%
+ \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
+ {\ifx\normalyear \undefined\the\year \else\the\normalyear \fi.%
+ \ifx\normalmonth\undefined\the\month\else\the\normalmonth\fi.%
+ \ifx\normalday \undefined\the\day \else\the\normalday \fi}
+
+\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\normaldump
+ \newtoks\everydump
+ \let\normaldump\dump
+ \def\dump{\the\everydump\normaldump}
+\fi
+
+\appendtoks \showcontextbanner \to \everydump
+
+\protect \endinput
diff --git a/tex/context/base/mult-ini.mkii b/tex/context/base/mult-ini.mkii
index fff800df1..8697057c8 100644
--- a/tex/context/base/mult-ini.mkii
+++ b/tex/context/base/mult-ini.mkii
@@ -1,6 +1,6 @@
%D \module
%D [ file=mult-ini,
-%D version=1996.06.01,
+%D version=2008.10.22, % 1996.06.01,
%D title=\CONTEXT\ Multilingual Macros,
%D subtitle=Initialization,
%D author=Hans Hagen,
@@ -11,9 +11,341 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D This module is a stripped down version of \type {mult-ini.tex},
+%D which we keep around as \type {mult-kep.tex} for sentimental
+%D reasons. There you will find some more historic information.
+
+\writestatus{loading}{Context Multilingual Macros / Initialization}
+
\unprotect
-%D This is the oldest variant. Here we filter messages from a big string.
+%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 \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!}
+
+%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\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
+ {\doifnot{#1}{all}{\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 \startmessages english library: alfa
+%D title: something
+%D 1: first message
+%D 2: second (--) message --
+%D \stopmessages
+%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 \startmessages english library: alfa
+%D 10: tenth message
+%D \stopmessages
+%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}.
\def\findinterfacemessage#1#2%
{\let#2\empty
@@ -128,4 +460,475 @@
\setxvalue{\??ms\currentmessagelibrary#1}{#2}%
\futurelet\next\getinterfacemessage}
+%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.
+
+\def\doresetvalue#1#2%
+ {\dosetvalue{#1}{#2}{}}
+
+\def\doignorevalue#1#2#3%
+ {\dosetvalue{#1}{#2}{}}
+
+\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 \ {12cm}
+%D \ {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 \ {21.0cm}
+%D \ {27.9cm}
+%D \stoptyping
+%D
+%D The prefixes \type{} and \type{} 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 \ {}
+%D \ {}
+%D \ {}
+%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 \ {}
+%D \ {12cm}
+%D \stoptyping
+%D
+%D A (minor) complication is that where in english we use
+%D \type{}, in dutch we find both \type{} and
+%D \type{}. 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 \
+%D \
+%D \stoptyping
+%D
+%D But in dutch we have the following:
+%D
+%D \starttyping
+%D \
+%D \
+%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 \
+%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 Anno 2003 I've forgotten why the \type {\c!internal} is
+%D still in there; it's probably a left over from an experiment.
+
+\let\c!internal!y \string
+\def\c!internal!n {-}
+\let\c!internal! \c!internal!y
+
+\def\setinterfaceconstant#1#2%
+ {\setvalue{\c!prefix!#1}{\c!internal!#1}%
+ \setvalue{\k!prefix!#2}{#1}}
+
+\def\setinterfacevariable#1#2%
+ {\setvalue{\v!prefix!#1}{#2}}
+
+%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 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}, but in dutch we
+%D have: \type{\stelin}. Such split elements are no
+%D problem, because we just define two elements. When no second
+%D part is needed, we use a \type{-}:
+
+\def\setinterfaceelement#1#2%
+ {\ifcsname\e!prefix!#1\endcsname
+ \doifnotvalue{\e!prefix!#1}{#2}{\setvalue{\e!prefix!#1}{#2}}%
+ \else
+ \setvalue{\e!prefix!#1}{#2}%
+ \fi}
+
+\def\setinterfacecommand#1#2%
+ {\doifnot{#1}{#2}{\@EA\def\csname#2\@EA\endcsname\@EA{\csname#1\endcsname}}}% or just \let ?
+
+%D We just ignore these:
+
+\def\startvariables{\gobbleuntil\stopvariables}
+\def\startconstants{\gobbleuntil\stopconstants}
+\def\startelements {\gobbleuntil\stopelements}
+\def\startcommands {\gobbleuntil\stopcommands}
+
+%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
+ {\ifx\normalyear \undefined\the\year \else\the\normalyear \fi.%
+ \ifx\normalmonth\undefined\the\month\else\the\normalmonth\fi.%
+ \ifx\normalday \undefined\the\day \else\the\normalday \fi}
+
+\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\normaldump
+ \newtoks\everydump
+ \let\normaldump\dump
+ \def\dump{\the\everydump\normaldump}
+\fi
+
+\appendtoks \showcontextbanner \to \everydump
+
\protect \endinput
diff --git a/tex/context/base/mult-ini.mkiv b/tex/context/base/mult-ini.mkiv
index e785624f5..c83a0b61d 100644
--- a/tex/context/base/mult-ini.mkiv
+++ b/tex/context/base/mult-ini.mkiv
@@ -1,6 +1,6 @@
%D \module
%D [ file=mult-ini,
-%D version=2008.02.15,
+%D version=2008.10.22, % 1996.06.01,
%D title=\CONTEXT\ Multilingual Macros,
%D subtitle=Initialization,
%D author=Hans Hagen,
@@ -11,13 +11,347 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D This module is a stripped down version of \type {mult-ini.tex},
+%D which we keep around as \type {mult-kep.tex} for sentimental
+%D reasons. There you will find some more historic information.
+
+\writestatus{loading}{Context Multilingual Macros / Initialization}
+
\unprotect
\registerctxluafile{mult-ini}{1.001}
+%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 \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!}
+
+%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\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
+ {\doifnot{#1}{all}{\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 \startmessages english library: alfa
+%D title: something
+%D 1: first message
+%D 2: second (--) message --
+%D \stopmessages
+%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 \startmessages english library: alfa
+%D 10: tenth message
+%D \stopmessages
+%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}.
+
\def\startmessages #1 library: #2 %
{\bgroup
- \doifundefined{\m!prefix!#2}{\setgvalue{\m!prefix!#2}{#2}}%
+ \ifcsname\m!prefix!#2\endcsname\else\setgvalue{\m!prefix!#2}{#2}\fi
\catcode13=\active
\doifinsetelse{#1}{\currentresponses,all}\dostartmessages\nostartmessages{#2}}
@@ -33,9 +367,478 @@
\unexpanded\def\makemessage #1#2#3{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.makemessage("#1","#2","#3"))}}
\unexpanded\def\showmessage #1#2#3{\ctxlua{interfaces.showmessage("#1","#2","#3")}}
-%D This way we also have the keywords at the lua end:
+%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.
+
+\def\doresetvalue#1#2%
+ {\dosetvalue{#1}{#2}{}}
+
+\def\doignorevalue#1#2#3%
+ {\dosetvalue{#1}{#2}{}}
+
+\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 \ {12cm}
+%D \ {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 \ {21.0cm}
+%D \ {27.9cm}
+%D \stoptyping
+%D
+%D The prefixes \type{} and \type{} 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 \ {}
+%D \ {}
+%D \ {}
+%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 \ {}
+%D \ {12cm}
+%D \stoptyping
+%D
+%D A (minor) complication is that where in english we use
+%D \type{}, in dutch we find both \type{} and
+%D \type{}. 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 \
+%D \
+%D \stoptyping
+%D
+%D But in dutch we have the following:
+%D
+%D \starttyping
+%D \
+%D \
+%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 \
+%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 Anno 2003 I've forgotten why the \type {\c!internal} is
+%D still in there; it's probably a left over from an experiment.
+
+\let\c!internal!y \string
+\def\c!internal!n {-}
+\let\c!internal! \c!internal!y
+
+% temporary mkiv hack (we can best just store the whole table in memory)
+
+\def\setinterfaceconstant#1#2%
+ {\ctxlua{interfaces.setconstant("#1","#2")}%
+ \setvalue{\c!prefix!#1}{\c!internal!#1}%
+ \setvalue{\k!prefix!#2}{#1}}
+
+\def\setinterfacevariable#1#2%
+ {\ctxlua{interfaces.setvariable("#1","#2")}%
+ \setvalue{\v!prefix!#1}{#2}}
+
+%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 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}, but in dutch we
+%D have: \type{\stelin}. Such split elements are no
+%D problem, because we just define two elements. When no second
+%D part is needed, we use a \type{-}:
+
+\def\setinterfaceelement#1#2%
+ {\ifcsname\e!prefix!#1\endcsname
+ \doifnotvalue{\e!prefix!#1}{#2}{\setvalue{\e!prefix!#1}{#2}}%
+ \else
+ \setvalue{\e!prefix!#1}{#2}%
+ \fi}
+
+\def\setinterfacecommand#1#2%
+ {\doifnot{#1}{#2}{\@EA\def\csname#2\@EA\endcsname\@EA{\csname#1\endcsname}}}% or just \let ?
+
+%D We just ignore these:
+
+\def\startvariables{\gobbleuntil\stopvariables}
+\def\startconstants{\gobbleuntil\stopconstants}
+\def\startelements {\gobbleuntil\stopelements}
+\def\startcommands {\gobbleuntil\stopcommands}
+
+%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
+ {\ifx\normalyear \undefined\the\year \else\the\normalyear \fi.%
+ \ifx\normalmonth\undefined\the\month\else\the\normalmonth\fi.%
+ \ifx\normalday \undefined\the\day \else\the\normalday \fi}
+
+\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\normaldump
+ \newtoks\everydump
+ \let\normaldump\dump
+ \def\dump{\the\everydump\normaldump}
+\fi
-\def\dowithinterfaceconstant#1#2{\ctxlua{interfaces.setconstant("#1","#2")}}
-\def\dowithinterfacevariable#1#2{\ctxlua{interfaces.setvariable("#1","#2")}}
+\appendtoks \showcontextbanner \to \everydump
\protect \endinput
diff --git a/tex/context/base/mult-ini.tex b/tex/context/base/mult-ini.tex
deleted file mode 100644
index 53a1014c5..000000000
--- a/tex/context/base/mult-ini.tex
+++ /dev/null
@@ -1,1493 +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
-% {\doifinsetelse{\currentinterface}{#1}
-% {\let\next\relax}
-% {\long\def\next##1\stopinterface{}}%
-% \next}
-
-\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 \startmessages english library: alfa
-%D title: something
-%D 1: first message
-%D 2: second (--) message --
-%D \stopmessages
-%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 \startmessages english library: alfa
-%D 10: tenth message
-%D \stopmessages
-%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.
-
-\beginTEX
-
-% \def\dosetvalue#1#2#3%
-% {\let\c!internal!\c!internal!n
-% \@EA\ifx\csname\k!prefix!#2\endcsname\relax
-% \let\c!internal!\c!internal!y
-% \@EA\def\csname#1#2\endcsname{#3}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EA\def\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}%
-% \fi}
-%
-% \def\dosetevalue#1#2#3%
-% {\let\c!internal!\c!internal!n
-% \@EA\ifx\csname\k!prefix!#2\endcsname\relax
-% \let\c!internal!\c!internal!y
-% \@EA\edef\csname#1#2\endcsname{#3}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EA\edef\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}%
-% \fi}
-%
-% \def\dosetgvalue#1#2#3%
-% {\let\c!internal!\c!internal!n
-% \@EA\ifx\csname\k!prefix!#2\endcsname\relax
-% \let\c!internal!\c!internal!y
-% \@EA\gdef\csname#1#2\endcsname{#3}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EA\gdef\csname#1\csname\k!prefix!#2\endcsname\endcsname{#3}%
-% \fi}
-%
-% cleaner (not that much faster) don't pass #3 yet:
-
-\def\dosetvalue#1#2%
- {\let\c!internal!\c!internal!n
- \@EA\ifx\csname\k!prefix!#2\endcsname\relax
- \let\c!internal!\c!internal!y
- \@EAEAEA\def\@EA\@EA\csname#1#2\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EAEAEA\def\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
- \fi}
-
-\def\dosetevalue#1#2%
- {\let\c!internal!\c!internal!n
- \@EA\ifx\csname\k!prefix!#2\endcsname\relax
- \let\c!internal!\c!internal!y
- \@EAEAEA\edef\@EA\@EA\csname#1#2\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EAEAEA\edef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
- \fi}
-
-\def\dosetgvalue#1#2%
- {\let\c!internal!\c!internal!n
- \@EA\ifx\csname\k!prefix!#2\endcsname\relax
- \let\c!internal!\c!internal!y
- \@EAEAEA\gdef\@EA\@EA\csname#1#2\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EAEAEA\gdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
- \fi}
-
-\def\dosetxvalue#1#2%
- {\let\c!internal!\c!internal!n
- \@EA\ifx\csname\k!prefix!#2\endcsname\relax
- \let\c!internal!\c!internal!y
- \@EAEAEA\xdef\@EA\@EA\csname#1#2\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EAEAEA\xdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
- \fi}
-
-% so far
-
-\def\docopyvalue#1#2#3%
- {\let\c!internal!\c!internal!n
- \@EA\ifx\csname\k!prefix!#3\endcsname\relax
- \let\c!internal!\c!internal!y
- \@EAEAEA\def\@EA
- \csname\@EA#1\@EA#3\@EA
- \endcsname\@EA{\csname#2#3\endcsname}%
- \else
- \let\c!internal!\c!internal!y
- \@EAEAEA\def\@EA
- \csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA
- \endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
- \fi}
-
-\endTEX
-
-\beginETEX \protected
-
-% \def\dosetvalue#1#2#3%
-% {\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{#3}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EA\def\csname#1#2\endcsname{#3}%
-% \fi}
-%
-% \def\dosetevalue#1#2#3%
-% {\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{#3}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EA\edef\csname#1#2\endcsname{#3}%
-% \fi}
-%
-% \def\dosetgvalue#1#2#3%
-% {\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{#3}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EA\gdef\csname#1#2\endcsname{#3}%
-% \fi}
-%
-% \def\dosetxvalue#1#2#3%
-% {\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{#3}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EA\xdef\csname#1#2\endcsname{#3}%
-% \fi}
-%
-% cleaner (not that much faster) don't pass #3 yet:
-%
-% \def\dosetvalue#1#2%
-% {\let\c!internal!\c!internal!n
-% \ifcsname\k!prefix!#2\endcsname
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\def\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
-% \else
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\def\@EA\@EA\csname#1#2\endcsname
-% \fi}
-%
-% \def\dosetevalue#1#2%
-% {\let\c!internal!\c!internal!n
-% \ifcsname\k!prefix!#2\endcsname
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\edef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
-% \else
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\edef\@EA\@EA\csname#1#2\endcsname
-% \fi}
-%
-% \def\dosetgvalue#1#2%
-% {\let\c!internal!\c!internal!n
-% \ifcsname\k!prefix!#2\endcsname
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\gdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
-% \else
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\gdef\@EA\@EA\csname#1#2\endcsname
-% \fi}
-%
-% \def\dosetxvalue#1#2%
-% {\let\c!internal!\c!internal!n
-% \ifcsname\k!prefix!#2\endcsname
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\xdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
-% \else
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\xdef\@EA\@EA\csname#1#2\endcsname
-% \fi}
-%
-% \def\docopyvalue#1#2#3%
-% {\let\c!internal!\c!internal!n
-% \ifcsname\k!prefix!#3\endcsname
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\def\@EA
-% \csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA
-% \endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
-% \else
-% \let\c!internal!\c!internal!y
-% \@EAEAEA\def\@EA
-% \csname\@EA#1\@EA#3\@EA
-% \endcsname\@EA{\csname#2#3\endcsname}%
-% \fi}
-%
-% slightly more efficient (but not faster in day to day runs)
-
-\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}
-
-\endETEX
-
-%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 \ {12cm}
-%D \ {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 \ {21.0cm}
-%D \ {27.9cm}
-%D \stoptyping
-%D
-%D The prefixes \type{} and \type{} 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 \ {}
-%D \ {}
-%D \ {}
-%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 \ {}
-%D \ {12cm}
-%D \stoptyping
-%D
-%D A (minor) complication is that where in english we use
-%D \type{}, in dutch we find both \type{} and
-%D \type{}. 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 \
-%D \
-%D \stoptyping
-%D
-%D But in dutch we have the following:
-%D
-%D \starttyping
-%D \
-%D \
-%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 \
-%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.
-
-%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
-
-% \def\setinterfaceconstant#1#2%
-% {\setvalue{\c!prefix!#1}{\c!internal!#1}%
-% \doifelse{#2}\nointerfaceobject % ?
-% {\debuggerinfo{constant}{#1 defined as #1 by default}%
-% }% \setvalue{\k!prefix!#1}{#1}} % was #2 -> #1
-% {\debuggerinfo{constant}{#1 defined as #2}%
-% \ifinterfacetranslation
-% \setvalue{\x!prefix!#1}{#2}%
-% \fi
-% \checksetvalue{\k!prefix!#2}{#1}%
-% \setvalue{\k!prefix!#2}{#1}}}
-
-% 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\checksetvalue#1#2%
-% {\expandafter\ifx\csname#1\endcsname\relax\else
-% \expandafter\ifx\csname#1\endcsname\empty\else
-% \def\!!stringa{#1}%
-% \def\!!stringb{#2}%
-% \ifx\!!stringa\!!stringb\else
-% \writestatus{problems}{set #1 to #2 overloads \getvalue{#1}}%
-% \fi
-% \fi
-% \fi}
-
-\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}%
-% \ifinterfacetranslation
-% \setvalue{\x!prefix!#1}{#2}%
-% \fi}
-
-\def\defineinterfaceconstant#1#2%
- {\setvalue{\c!prefix!#1}{#2}}
-
-% %D \macros
-% %D {startinterfacesetupconstant}
-% %D
-% %D The next command, \type{\startinterfacesetupconstant}, which
-% %D behavior also depends on the boolean, is used for constants
-% %D that are only needed in these quick reference macro's. The
-% %D following, more efficient approach does not work here,
-% %D because it sometimes generates spaces.
-% %D
-% %D \starttyping
-% %D \def\setinterfacesetupconstant
-% %D {\ifinterfacetranslation
-% %D \expandafter\setinterfaceconstant
-% %D \fi}
-% %D \stoptyping
-% %D
-% %D We therefore use the more redundant but robust method:
-
-% \def\setinterfacesetupvariable#1#2%
-% {\ifinterfacetranslation
-% \doifelse{#2}\nointerfaceobject
-% {\setvalue{\y!prefix!#1}{#1}}
-% {\setvalue{\y!prefix!#1}{#2}}%
-% \fi}
-%
-% \def\startsetupvariables{\startinterfaceobjects\setinterfacesetupvariable\stopsetupvariables}
-%
-% \let\stopsetupvariables\relax
-
-%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}, but in dutch we
-%D have: \type{\stelin}. 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 }%
- \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
-
-% %D Here we also have to take care of the optional translation
-% %D needed for reference cards.
-
-% \def\setinterfacecommand#1#2%
-% {\doifelse{#2}\nointerfaceobject
-% {\debuggerinfo{command}{no link to #1}%
-% \setinterfacesetupvariable{#1}{#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}}%
-% %\@EAEAEA\def\@EA\csname\@EA#2\@EA\endcsname\@EA{\csname#1\endcsname}}%
-% \@EA\def\csname#2\@EA\endcsname\@EA{\csname#1\endcsname}}% ugly but faster
-% \setinterfacesetupvariable{#1}{#2}}}
-
-\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 {getinterfaceconstant, getinterfacevariable}
-% %D
-% %D Generating the interface translation macro's that are used
-% %D in the reference lists, is enabled by setting the boolean:
-% %D
-% %D \starttyping
-% %D \interfacetranslationtrue
-% %D \stoptyping
-% %D
-% %D Keep in mind that enabling interfacetranslation costs a
-% %D bit of hash space.
-%
-% %D Interface translation is obsolete now that we use an \XML\
-% %D definition base.
-
-% \newif\ifinterfacetranslation
-
-% \def\getinterfaceconstant#1%
-% {\ifinterfacetranslation
-% \executeifdefined{\x!prefix!#1}{#1}%
-% \else
-% #1%
-% \fi}
-
-% \def\getinterfacevariable#1%
-% {\ifinterfacetranslation
-% \executeifdefined{\y!prefix!#1}{#1}%
-% \else
-% #1%
-% \fi}
-
-%D When a reference list is generated, one does not need to
-%D generate a new format. Just reloading the relevant
-%D definition files suits:
-%D
-%D \starttyping
-%D \interfacetranslationtrue
-%D \input mult-con
-%D \input mult-com
-%D \stoptyping
-
-%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.
-
-\beginTEX
-
-\def\interfaced#1%
- {\expandafter\ifx\csname\k!prefix!#1\endcsname\relax
- #1%
- \else
- \csname\k!prefix!#1\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
-\def\interfaced#1%
- {\ifcsname\k!prefix!#1\endcsname
- \csname\k!prefix!#1\endcsname
- \else
- #1%
- \fi}
-
-\endETEX
-
-%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
- {\ifx\normalyear \undefined\the\year \else\the\normalyear \fi.%
- \ifx\normalmonth\undefined\the\month\else\the\normalmonth\fi.%
- \ifx\normalday \undefined\the\day \else\the\normalday \fi}
-
-\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\normaldump
- \newtoks\everydump
- \let\normaldump\dump
- \def\dump{\the\everydump\normaldump}
-\fi
-
-\appendtoks \showcontextbanner \to \everydump
-
-\protect \endinput
diff --git a/tex/context/base/mult-it.tex b/tex/context/base/mult-it.tex
new file mode 100644
index 000000000..e08d169d1
--- /dev/null
+++ b/tex/context/base/mult-it.tex
@@ -0,0 +1,1576 @@
+% this file is auto-generated, don't edit this file
+%
+% definitions for interface variables for language it
+%
+\setinterfacevariable{Addition}{Aggiunta}
+\setinterfacevariable{Balloon}{Pallone}
+\setinterfacevariable{Character}{Lettera}
+\setinterfacevariable{Characters}{Lettere}
+\setinterfacevariable{CloseDocument}{ChiudiDocumento}
+\setinterfacevariable{ExitViewer}{EsciVisualizzatore}
+\setinterfacevariable{FirstPage}{PrimaPagina}
+\setinterfacevariable{FitHeight}{FitHeight}
+\setinterfacevariable{FitWidth}{FitWidth}
+\setinterfacevariable{GotoPage}{VaiAPagina}
+\setinterfacevariable{Greek}{Greco}
+\setinterfacevariable{Help}{Aiuto}
+\setinterfacevariable{HideField}{NascondiCampo}
+\setinterfacevariable{HideLayer}{HideLayer}
+\setinterfacevariable{Key}{Tasto}
+\setinterfacevariable{LastPage}{UltimaPagina}
+\setinterfacevariable{LoadForm}{CaricaForm}
+\setinterfacevariable{MONTH}{MESE}
+\setinterfacevariable{New}{Nuovo}
+\setinterfacevariable{NextJump}{SaltoSuccessivo}
+\setinterfacevariable{NextPage}{PaginaSuccessiva}
+\setinterfacevariable{Numbers}{Numeri}
+\setinterfacevariable{OpenNamedDocument}{OpenNamedDocument}
+\setinterfacevariable{Paragraph}{Capoverso}
+\setinterfacevariable{PauseMovie}{PausaFilm}
+\setinterfacevariable{PauseRendering}{PauseRendering}
+\setinterfacevariable{PauseSound}{PausaSuono}
+\setinterfacevariable{PreviousJump}{SaltoPrecedente}
+\setinterfacevariable{PreviousPage}{PaginaPrecedente}
+\setinterfacevariable{PrintDocument}{StampaDocumento}
+\setinterfacevariable{Query}{Richiesta}
+\setinterfacevariable{QueryAgain}{RinnovaRichiesta}
+\setinterfacevariable{ResetForm}{ReimpostaForm}
+\setinterfacevariable{ResumeMovie}{RiprendiFilm}
+\setinterfacevariable{ResumeRendering}{ResumeRendering}
+\setinterfacevariable{ResumeSound}{RiprendiSuono}
+\setinterfacevariable{Romannumerals}{Numeriromani}
+\setinterfacevariable{SaveDocument}{SalvaDocumento}
+\setinterfacevariable{SaveForm}{SalvaForm}
+\setinterfacevariable{SaveNamedDocument}{SaveNamedDocument}
+\setinterfacevariable{SearchAgain}{CercaAncora}
+\setinterfacevariable{SearchDocument}{CercaDocumento}
+\setinterfacevariable{ShowBookmarks}{MostraSegnalibro}
+\setinterfacevariable{ShowField}{MostraCampo}
+\setinterfacevariable{ShowThumbs}{MostraThumbs}
+\setinterfacevariable{StartMovie}{IniziaFilm}
+\setinterfacevariable{StartRendering}{StartRendering}
+\setinterfacevariable{StartSound}{IniziaSuono}
+\setinterfacevariable{StopMovie}{FermaFilm}
+\setinterfacevariable{StopRendering}{StopRendering}
+\setinterfacevariable{StopSound}{FermaSuono}
+\setinterfacevariable{SubmitForm}{MandaForm}
+\setinterfacevariable{ToggleLayer}{ToggleLayer}
+\setinterfacevariable{ToggleViewer}{ScambiaVisualizzatore}
+\setinterfacevariable{URL}{URL}
+\setinterfacevariable{VideLayer}{VideLayer}
+\setinterfacevariable{ViewerHelp}{AiutoVisualizzatore}
+\setinterfacevariable{WEEKDAY}{GIORNOSETTIMANA}
+\setinterfacevariable{WORD}{PAROLA}
+\setinterfacevariable{abbreviation}{abbreviazione}
+\setinterfacevariable{abbreviations}{abbreviazioni}
+\setinterfacevariable{absolute}{assoluto}
+\setinterfacevariable{action}{azione}
+\setinterfacevariable{after}{dopo}
+\setinterfacevariable{all}{tutti}
+\setinterfacevariable{always}{sempre}
+\setinterfacevariable{appendices}{appendici}
+\setinterfacevariable{appendix}{appendice}
+\setinterfacevariable{april}{aprile}
+\setinterfacevariable{atmargin}{almargine}
+\setinterfacevariable{atpage}{apagina}
+\setinterfacevariable{august}{agosto}
+\setinterfacevariable{auto}{auto}
+\setinterfacevariable{autointro}{autointro}
+\setinterfacevariable{back}{dietro}
+\setinterfacevariable{background}{sfondo}
+\setinterfacevariable{backmatter}{postambolo}
+\setinterfacevariable{backpart}{postfazione}
+\setinterfacevariable{backspace}{backspace}
+\setinterfacevariable{backward}{indietro}
+\setinterfacevariable{before}{prima}
+\setinterfacevariable{big}{grande}
+\setinterfacevariable{bigbodyfont}{grossofontdeltesto}
+\setinterfacevariable{bigpreference}{grandepreferenza}
+\setinterfacevariable{blank}{rigovuoto}
+\setinterfacevariable{blockquote}{blockquote}
+\setinterfacevariable{bodymatter}{testiprincipali}
+\setinterfacevariable{bodypart}{testoprincipale}
+\setinterfacevariable{bold}{grassetto}
+\setinterfacevariable{bolditalic}{grassettocorsivo}
+\setinterfacevariable{boldslanted}{grassettoinclinato}
+\setinterfacevariable{bookmark}{segnalibro}
+\setinterfacevariable{both}{entrambi}
+\setinterfacevariable{bottom}{fondo}
+\setinterfacevariable{brief}{brief}
+\setinterfacevariable{broad}{ampio}
+\setinterfacevariable{buffer}{buffer}
+\setinterfacevariable{by}{da}
+\setinterfacevariable{calligraphic}{calligrafico}
+\setinterfacevariable{cap}{cap}
+\setinterfacevariable{capital}{maiuscolo}
+\setinterfacevariable{center}{center}
+\setinterfacevariable{chapter}{capitolo}
+\setinterfacevariable{character}{lettera}
+\setinterfacevariable{characters}{lettere}
+\setinterfacevariable{color}{colore}
+\setinterfacevariable{column}{colonna}
+\setinterfacevariable{columns}{colonne}
+\setinterfacevariable{command}{comando}
+\setinterfacevariable{commands}{comandi}
+\setinterfacevariable{comment}{commento}
+\setinterfacevariable{component}{componente}
+\setinterfacevariable{concept}{concetto}
+\setinterfacevariable{content}{indice}
+\setinterfacevariable{contents}{indici}
+\setinterfacevariable{continue}{continua}
+\setinterfacevariable{controls}{controlli}
+\setinterfacevariable{conversion}{coversione}
+\setinterfacevariable{current}{corrente}
+\setinterfacevariable{cutspace}{cutspace}
+\setinterfacevariable{date}{data}
+\setinterfacevariable{day}{giorno}
+\setinterfacevariable{december}{dicembre}
+\setinterfacevariable{default}{implicito}
+\setinterfacevariable{depth}{profondita}
+\setinterfacevariable{description}{descrizione}
+\setinterfacevariable{disable}{disattiva}
+\setinterfacevariable{display}{schermo}
+\setinterfacevariable{dot}{punto}
+\setinterfacevariable{doublesided}{doppiafaccia}
+\setinterfacevariable{each}{ogni}
+\setinterfacevariable{edge}{bordo}
+\setinterfacevariable{empty}{vuoto}
+\setinterfacevariable{endnote}{endnote}
+\setinterfacevariable{enumeration}{enumerazione}
+\setinterfacevariable{environment}{ambiente}
+\setinterfacevariable{even}{pari}
+\setinterfacevariable{external}{esterno}
+\setinterfacevariable{fact}{fatto}
+\setinterfacevariable{february}{febbraio}
+\setinterfacevariable{figure}{figura}
+\setinterfacevariable{figures}{figure}
+\setinterfacevariable{file}{file}
+\setinterfacevariable{final}{finale}
+\setinterfacevariable{first}{primo}
+\setinterfacevariable{firstcolumn}{firstcolumn}
+\setinterfacevariable{firstpage}{primapagina}
+\setinterfacevariable{firstsubpage}{primasottopagina}
+\setinterfacevariable{fit}{adatta}
+\setinterfacevariable{five}{cinque}
+\setinterfacevariable{fix}{fisso}
+\setinterfacevariable{fixed}{fisso}
+\setinterfacevariable{flexible}{flessibile}
+\setinterfacevariable{float}{oggettomobile}
+\setinterfacevariable{flushinner}{flushinner}
+\setinterfacevariable{flushleft}{flushleft}
+\setinterfacevariable{flushouter}{flushouter}
+\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{footer}{piedipagina}
+\setinterfacevariable{footnote}{notapdp}
+\setinterfacevariable{force}{forza}
+\setinterfacevariable{foreground}{foreground}
+\setinterfacevariable{formeel}{formeel}
+\setinterfacevariable{formula}{formula}
+\setinterfacevariable{formulae}{formule}
+\setinterfacevariable{forward}{avanti}
+\setinterfacevariable{four}{quattro}
+\setinterfacevariable{frame}{cornice}
+\setinterfacevariable{framedtext}{testoincorniciato}
+\setinterfacevariable{friday}{venerdi}
+\setinterfacevariable{frontmatter}{preambolo}
+\setinterfacevariable{frontpart}{prefazione}
+\setinterfacevariable{global}{globale}
+\setinterfacevariable{graphic}{grafico}
+\setinterfacevariable{graphics}{grafici}
+\setinterfacevariable{gray}{grigio}
+\setinterfacevariable{greek}{greco}
+\setinterfacevariable{grid}{griglia}
+\setinterfacevariable{halfline}{mezzariga}
+\setinterfacevariable{handwritten}{grafiamanuale}
+\setinterfacevariable{hang}{sospendi}
+\setinterfacevariable{hanging}{sospeso}
+\setinterfacevariable{head}{testa}
+\setinterfacevariable{header}{intestazione}
+\setinterfacevariable{height}{altezza}
+\setinterfacevariable{helptext}{testoaiuto}
+\setinterfacevariable{hencefore}{precedente}
+\setinterfacevariable{here}{qui}
+\setinterfacevariable{hereafter}{seguente}
+\setinterfacevariable{hidden}{nascosto}
+\setinterfacevariable{hiding}{nascondere}
+\setinterfacevariable{high}{alto}
+\setinterfacevariable{horizontal}{orizzontale}
+\setinterfacevariable{hyphenated}{sillabato}
+\setinterfacevariable{hz}{hz}
+\setinterfacevariable{inbetween}{tra}
+\setinterfacevariable{index}{indiceanalitico}
+\setinterfacevariable{indices}{indicianalitici}
+\setinterfacevariable{informeel}{informeel}
+\setinterfacevariable{inherit}{inherit}
+\setinterfacevariable{inleft}{insinistra}
+\setinterfacevariable{inmargin}{inmargine}
+\setinterfacevariable{inner}{interno}
+\setinterfacevariable{inneredge}{bordointerno}
+\setinterfacevariable{innermargin}{margineinterno}
+\setinterfacevariable{inright}{indestra}
+\setinterfacevariable{interaction}{interazione}
+\setinterfacevariable{interactionmenu}{menuinterattivo}
+\setinterfacevariable{intermezzi}{intermezzi}
+\setinterfacevariable{intermezzo}{intermezzo}
+\setinterfacevariable{intext}{intesto}
+\setinterfacevariable{intro}{intro}
+\setinterfacevariable{italic}{corsivo}
+\setinterfacevariable{italicbold}{corsivograssetto}
+\setinterfacevariable{item}{elemento}
+\setinterfacevariable{itemize}{elenco}
+\setinterfacevariable{its}{its}
+\setinterfacevariable{january}{gennaio}
+\setinterfacevariable{joinedup}{unito}
+\setinterfacevariable{july}{luglio}
+\setinterfacevariable{june}{giugno}
+\setinterfacevariable{keep}{mantieni}
+\setinterfacevariable{knockout}{knockout}
+\setinterfacevariable{label}{etichetta}
+\setinterfacevariable{landscape}{orizzontale}
+\setinterfacevariable{last}{ultimo}
+\setinterfacevariable{lastcolumn}{lastcolumn}
+\setinterfacevariable{lastpage}{ultimapagina}
+\setinterfacevariable{lastpagenumber}{lastpagenumber}
+\setinterfacevariable{lastsubpage}{ultimasottopagina}
+\setinterfacevariable{left}{sinistra}
+\setinterfacevariable{leftedge}{bordosinistro}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{marginesinistro}
+\setinterfacevariable{leftpage}{paginasinistra}
+\setinterfacevariable{legend}{legenda}
+\setinterfacevariable{lesshyphenation}{lesshyphenation}
+\setinterfacevariable{line}{riga}
+\setinterfacevariable{linenote}{linenote}
+\setinterfacevariable{lines}{righe}
+\setinterfacevariable{list}{elenco}
+\setinterfacevariable{local}{locale}
+\setinterfacevariable{localenvironment}{ambientelocale}
+\setinterfacevariable{logo}{logo}
+\setinterfacevariable{logos}{loghi}
+\setinterfacevariable{lohi}{pedap}
+\setinterfacevariable{loose}{lento}
+\setinterfacevariable{low}{basso}
+\setinterfacevariable{ls}{ls}
+\setinterfacevariable{makeup}{makeup}
+\setinterfacevariable{mar}{mar}
+\setinterfacevariable{march}{marzo}
+\setinterfacevariable{margin}{margine}
+\setinterfacevariable{marginedge}{bordomargine}
+\setinterfacevariable{margintitle}{titoloinmargine}
+\setinterfacevariable{marking}{marcatura}
+\setinterfacevariable{mathalignment}{mathalignment}
+\setinterfacevariable{mathcases}{mathcases}
+\setinterfacevariable{mathmatrix}{mathmatrix}
+\setinterfacevariable{max}{max}
+\setinterfacevariable{may}{maggio}
+\setinterfacevariable{mediaeval}{medievale}
+\setinterfacevariable{medium}{medio}
+\setinterfacevariable{middle}{centro}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{minheight}{altezzamin}
+\setinterfacevariable{minwidth}{ampiezzamin}
+\setinterfacevariable{mirrored}{riflesso}
+\setinterfacevariable{monday}{lunedi}
+\setinterfacevariable{mono}{mono}
+\setinterfacevariable{month}{mese}
+\setinterfacevariable{morehyphenation}{morehyphenation}
+\setinterfacevariable{name}{nome}
+\setinterfacevariable{narrow}{stretto}
+\setinterfacevariable{negative}{negativo}
+\setinterfacevariable{never}{mai}
+\setinterfacevariable{new}{nuovo}
+\setinterfacevariable{next}{successivo}
+\setinterfacevariable{nextevenpage}{paginaparisuccessiva}
+\setinterfacevariable{nextoddpage}{paginadisparisuccessiva}
+\setinterfacevariable{nextpage}{paginasuccessiva}
+\setinterfacevariable{nextsubpage}{sottopaginasuccessiva}
+\setinterfacevariable{no}{no}
+\setinterfacevariable{nocheck}{nocheck}
+\setinterfacevariable{nofit}{nofit}
+\setinterfacevariable{nogrid}{nogrid}
+\setinterfacevariable{nohz}{nohz}
+\setinterfacevariable{nomarking}{nomarcature}
+\setinterfacevariable{none}{nessuno}
+\setinterfacevariable{nonumber}{nonumber}
+\setinterfacevariable{normal}{normale}
+\setinterfacevariable{nospacing}{nospacing}
+\setinterfacevariable{not}{non}
+\setinterfacevariable{nothanging}{nonsospeso}
+\setinterfacevariable{nothyphenated}{nonsillabato}
+\setinterfacevariable{november}{novembre}
+\setinterfacevariable{nowhere}{danessunaparte}
+\setinterfacevariable{nowhite}{nobianco}
+\setinterfacevariable{number}{numero}
+\setinterfacevariable{numbers}{numeri}
+\setinterfacevariable{october}{ottobre}
+\setinterfacevariable{odd}{dispari}
+\setinterfacevariable{off}{disattivo}
+\setinterfacevariable{offset}{offset}
+\setinterfacevariable{old}{old}
+\setinterfacevariable{on}{attivo}
+\setinterfacevariable{one}{uno}
+\setinterfacevariable{opposite}{opposto}
+\setinterfacevariable{outer}{esterno}
+\setinterfacevariable{outeredge}{bordoesterno}
+\setinterfacevariable{outermargin}{margineesterno}
+\setinterfacevariable{overlay}{sovrapponi}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{packed}{impaccato}
+\setinterfacevariable{page}{pagina}
+\setinterfacevariable{pagecomment}{commentopagina}
+\setinterfacevariable{pagenumber}{numeropagina}
+\setinterfacevariable{paper}{carta}
+\setinterfacevariable{paragraph}{capoverso}
+\setinterfacevariable{part}{parte}
+\setinterfacevariable{positive}{positivo}
+\setinterfacevariable{postponing}{posporre}
+\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{preference}{preferenza}
+\setinterfacevariable{preview}{anteprima}
+\setinterfacevariable{previous}{precedente}
+\setinterfacevariable{previousevenpage}{paginapariprecedente}
+\setinterfacevariable{previousoddpage}{paginadispariprecedente}
+\setinterfacevariable{previouspage}{paginaprecedente}
+\setinterfacevariable{previoussubpage}{sottopaginaprecedente}
+\setinterfacevariable{printable}{stampabile}
+\setinterfacevariable{process}{process}
+\setinterfacevariable{product}{prodotto}
+\setinterfacevariable{program}{programma}
+\setinterfacevariable{project}{progetto}
+\setinterfacevariable{protected}{protetto}
+\setinterfacevariable{quadruple}{quadruplo}
+\setinterfacevariable{quotation}{citazione}
+\setinterfacevariable{quote}{menzione}
+\setinterfacevariable{ran}{corse}
+\setinterfacevariable{random}{casuale}
+\setinterfacevariable{readonly}{solalettura}
+\setinterfacevariable{rectangular}{rettangolare}
+\setinterfacevariable{referral}{referral}
+\setinterfacevariable{register}{registro}
+\setinterfacevariable{regular}{regolare}
+\setinterfacevariable{rekening}{rekening}
+\setinterfacevariable{relative}{relativo}
+\setinterfacevariable{repeat}{ripeti}
+\setinterfacevariable{required}{richiestp}
+\setinterfacevariable{reset}{reimposta}
+\setinterfacevariable{reverse}{invertito}
+\setinterfacevariable{right}{destra}
+\setinterfacevariable{rightedge}{bordodestro}
+\setinterfacevariable{righthanging}{righthanging}
+\setinterfacevariable{rightmargin}{marginedestro}
+\setinterfacevariable{rightpage}{paginadestra}
+\setinterfacevariable{roman}{roman}
+\setinterfacevariable{romannumerals}{numeriromani}
+\setinterfacevariable{rotate}{ruota}
+\setinterfacevariable{rotated}{ruotato}
+\setinterfacevariable{round}{rotondo}
+\setinterfacevariable{row}{row}
+\setinterfacevariable{rule}{linea}
+\setinterfacevariable{samepage}{stessapagina}
+\setinterfacevariable{sans}{sans}
+\setinterfacevariable{sansbold}{sansgrassetto}
+\setinterfacevariable{sansserif}{sansserif}
+\setinterfacevariable{saturday}{sabato}
+\setinterfacevariable{screen}{schermo}
+\setinterfacevariable{section}{capoverso}
+\setinterfacevariable{sectionblockenvironment}{ambientebloccosezione}
+\setinterfacevariable{sectionnumber}{numerosezione}
+\setinterfacevariable{see}{vedi}
+\setinterfacevariable{september}{settembre}
+\setinterfacevariable{serif}{serif}
+\setinterfacevariable{serried}{vicino}
+\setinterfacevariable{setups}{nastaveni}
+\setinterfacevariable{sheet}{sheet}
+\setinterfacevariable{singlesided}{facciasingola}
+\setinterfacevariable{slanted}{inclinato}
+\setinterfacevariable{slantedbold}{inclinatograssetto}
+\setinterfacevariable{small}{piccolo}
+\setinterfacevariable{smallbodyfont}{piccolofontdelcorpo}
+\setinterfacevariable{smallbold}{piccolograssetto}
+\setinterfacevariable{smallbolditalic}{piccolograssettocorsivo}
+\setinterfacevariable{smallboldslanted}{piccolograssettoinclinato}
+\setinterfacevariable{smallcaps}{maiuscoletto}
+\setinterfacevariable{smallitalic}{piccolocorsivo}
+\setinterfacevariable{smallitalicbold}{piccolocorsivograssetto}
+\setinterfacevariable{smallnormal}{piccolonormale}
+\setinterfacevariable{smallslanted}{piccoloinclinato}
+\setinterfacevariable{smallslantedbold}{piccoloinclinatograssetto}
+\setinterfacevariable{smalltype}{piccolotype}
+\setinterfacevariable{somewhere}{daqualcheparte}
+\setinterfacevariable{sorted}{ordinato}
+\setinterfacevariable{space}{spazio}
+\setinterfacevariable{spacing}{spaziatura}
+\setinterfacevariable{speech}{speech}
+\setinterfacevariable{split}{separa}
+\setinterfacevariable{spot}{spot}
+\setinterfacevariable{standard}{standard}
+\setinterfacevariable{start}{inizia}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{termina}
+\setinterfacevariable{stopper}{stopper}
+\setinterfacevariable{stretch}{dilata}
+\setinterfacevariable{strict}{rigido}
+\setinterfacevariable{strong}{strong}
+\setinterfacevariable{strut}{strut}
+\setinterfacevariable{sub}{sotto}
+\setinterfacevariable{subbackward}{sottoindietro}
+\setinterfacevariable{subformula}{subformula}
+\setinterfacevariable{subforward}{sottoavanti}
+\setinterfacevariable{subject}{argomento}
+\setinterfacevariable{subpage}{sottopagina}
+\setinterfacevariable{subsection}{sottocapoverso}
+\setinterfacevariable{subsubject}{sottoargomento}
+\setinterfacevariable{subsubsection}{sottosottocapoverso}
+\setinterfacevariable{subsubsubject}{sottosottoargomento}
+\setinterfacevariable{subsubsubsection}{sottosottosottocapoverso}
+\setinterfacevariable{subsubsubsubject}{sottosottosottoargomento}
+\setinterfacevariable{subsubsubsubsection}{sottosottosottosottocapoverso}
+\setinterfacevariable{subsubsubsubsubject}{sottosottosottosottoargomento}
+\setinterfacevariable{subsubsubsubsubsection}{sottosottosottosottosottocapoverso}
+\setinterfacevariable{subsubsubsubsubsubject}{sottosottosottosottosottoargomento}
+\setinterfacevariable{sunday}{domenica}
+\setinterfacevariable{support}{supporto}
+\setinterfacevariable{sym}{sim}
+\setinterfacevariable{symbol}{simbolo}
+\setinterfacevariable{synchronize}{synchronize}
+\setinterfacevariable{system}{sistema}
+\setinterfacevariable{table}{tabella}
+\setinterfacevariable{tablehead}{testatabella}
+\setinterfacevariable{tables}{tabelle}
+\setinterfacevariable{tabletail}{codatabella}
+\setinterfacevariable{tabulate}{tabulato}
+\setinterfacevariable{tabulatehead}{testatabulato}
+\setinterfacevariable{tabulatetail}{codatabulato}
+\setinterfacevariable{tall}{alto}
+\setinterfacevariable{teletype}{teletype}
+\setinterfacevariable{temporary}{temporaneo}
+\setinterfacevariable{test}{test}
+\setinterfacevariable{text}{testo}
+\setinterfacevariable{three}{tre}
+\setinterfacevariable{thursday}{giovedi}
+\setinterfacevariable{title}{titolo}
+\setinterfacevariable{toggle}{toggle}
+\setinterfacevariable{tolerant}{tollerante}
+\setinterfacevariable{top}{cima}
+\setinterfacevariable{tuesday}{martedi}
+\setinterfacevariable{two}{due}
+\setinterfacevariable{txt}{txt}
+\setinterfacevariable{type}{type}
+\setinterfacevariable{typing}{typing}
+\setinterfacevariable{unavailable}{nondisponibile}
+\setinterfacevariable{unit}{unita}
+\setinterfacevariable{units}{unita}
+\setinterfacevariable{unknown}{ignoto}
+\setinterfacevariable{unpacked}{unpacked}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{usato}
+\setinterfacevariable{value}{valore}
+\setinterfacevariable{vertical}{verticale}
+\setinterfacevariable{very}{molto}
+\setinterfacevariable{verystrict}{moltorigido}
+\setinterfacevariable{verytolerant}{moltotollerante}
+\setinterfacevariable{weak}{weak}
+\setinterfacevariable{wednesday}{mercoledi}
+\setinterfacevariable{week}{settimana}
+\setinterfacevariable{weekday}{giornosettimana}
+\setinterfacevariable{white}{bianco}
+\setinterfacevariable{wide}{ampio}
+\setinterfacevariable{width}{ampiezza}
+\setinterfacevariable{xml}{xml}
+\setinterfacevariable{year}{anno}
+\setinterfacevariable{yes}{si}
+% definitions for interface constants for language it
+%
+\setinterfaceconstant{action}{azione}
+\setinterfaceconstant{address}{indirizzo}
+\setinterfaceconstant{after}{dopo}
+\setinterfaceconstant{afterhead}{dopotesta}
+\setinterfaceconstant{afterkey}{dopotasto}
+\setinterfaceconstant{align}{allinea}
+\setinterfaceconstant{aligncharacter}{allineacarattere}
+\setinterfaceconstant{alignmentcharacter}{carattereallineamento}
+\setinterfaceconstant{aligntitle}{allineatitolo}
+\setinterfaceconstant{alternative}{alternativa}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{freccia}
+\setinterfaceconstant{at}{ad}
+\setinterfaceconstant{author}{autore}
+\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autofile}{autofile}
+\setinterfaceconstant{autofocus}{autofocus}
+\setinterfaceconstant{autohang}{autohang}
+\setinterfaceconstant{autostrut}{autostrut}
+\setinterfaceconstant{autowidth}{autoampiezza}
+\setinterfaceconstant{axis}{asse}
+\setinterfaceconstant{background}{sfondo}
+\setinterfaceconstant{backgroundcolor}{coloresfondo}
+\setinterfaceconstant{backgroundcorner}{angolosfondo}
+\setinterfaceconstant{backgrounddepth}{profonditasfondo}
+\setinterfaceconstant{backgroundoffset}{offsetsfondo}
+\setinterfaceconstant{backgroundradius}{raggiosfondo}
+\setinterfaceconstant{backgroundscreen}{schermosfondo}
+\setinterfaceconstant{backspace}{backspace}
+\setinterfaceconstant{balance}{bilanciamento}
+\setinterfaceconstant{before}{prima}
+\setinterfaceconstant{beforehead}{primaditesta}
+\setinterfaceconstant{bet}{bet}
+\setinterfaceconstant{big}{grande}
+\setinterfaceconstant{blank}{rigovuoto}
+\setinterfaceconstant{blockway}{blockway}
+\setinterfaceconstant{bodyfont}{fonttesto}
+\setinterfaceconstant{bookmark}{segnalibro}
+\setinterfaceconstant{bottom}{fondo}
+\setinterfaceconstant{bottomdistance}{distanzafondo}
+\setinterfaceconstant{bottomframe}{cornicefondo}
+\setinterfaceconstant{bottomoffset}{offsetfondo}
+\setinterfaceconstant{bottomspace}{spaziofondo}
+\setinterfaceconstant{bottomstate}{statofondo}
+\setinterfaceconstant{cache}{cache}
+\setinterfaceconstant{calculate}{calcola}
+\setinterfaceconstant{ccommand}{ccomando}
+\setinterfaceconstant{click}{click}
+\setinterfaceconstant{clickin}{clickdentro}
+\setinterfaceconstant{clickout}{clickfuori}
+\setinterfaceconstant{clipoffset}{clipoffset}
+\setinterfaceconstant{closeaction}{azionechiudi}
+\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepageaction}{azionechiudipagina}
+\setinterfaceconstant{closesymbol}{closesymbol}
+\setinterfaceconstant{color}{colore}
+\setinterfaceconstant{column}{colonna}
+\setinterfaceconstant{columndistance}{distanzacolonne}
+\setinterfaceconstant{columns}{colonne}
+\setinterfaceconstant{command}{comando}
+\setinterfaceconstant{commandafter}{comdandodopo}
+\setinterfaceconstant{commandbefore}{comandoprima}
+\setinterfaceconstant{commands}{comandi}
+\setinterfaceconstant{component}{component}
+\setinterfaceconstant{compoundhyphen}{compoundhyphen}
+\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{continue}{continua}
+\setinterfaceconstant{contrastcolor}{colorecontrasto}
+\setinterfaceconstant{controls}{controlli}
+\setinterfaceconstant{conversion}{conversione}
+\setinterfaceconstant{convertfile}{convertifile}
+\setinterfaceconstant{corner}{angolo}
+\setinterfaceconstant{coupling}{accoppiamento}
+\setinterfaceconstant{couplingway}{modoaccoppiamento}
+\setinterfaceconstant{criterium}{criterio}
+\setinterfaceconstant{current}{corrente}
+\setinterfaceconstant{cutspace}{cutspace}
+\setinterfaceconstant{dash}{dash}
+\setinterfaceconstant{dat}{dat}
+\setinterfaceconstant{date}{data}
+\setinterfaceconstant{deepnumbercommand}{deepnumbercommand}
+\setinterfaceconstant{deeptextcommand}{deeptextcommand}
+\setinterfaceconstant{default}{implicito}
+\setinterfaceconstant{delay}{attesa}
+\setinterfaceconstant{depth}{profondita}
+\setinterfaceconstant{depthcorrection}{correzioneprofondita}
+\setinterfaceconstant{direction}{direzione}
+\setinterfaceconstant{directory}{directory}
+\setinterfaceconstant{display}{display}
+\setinterfaceconstant{distance}{distanza}
+\setinterfaceconstant{dot}{punto}
+\setinterfaceconstant{doublesided}{doppiafaccia}
+\setinterfaceconstant{dummy}{dummy}
+\setinterfaceconstant{dx}{dx}
+\setinterfaceconstant{dy}{dy}
+\setinterfaceconstant{edge}{bordo}
+\setinterfaceconstant{edgedistance}{distanzabordo}
+\setinterfaceconstant{empty}{vuoto}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{marginepari}
+\setinterfaceconstant{expansion}{espansione}
+\setinterfaceconstant{extras}{extras}
+\setinterfaceconstant{factor}{fattore}
+\setinterfaceconstant{fallback}{fallback}
+\setinterfaceconstant{family}{famiglia}
+\setinterfaceconstant{fieldbackgroundcolor}{coloresfondocampo}
+\setinterfaceconstant{fieldframecolor}{colorecornicecampo}
+\setinterfaceconstant{fieldlayer}{fieldlayer}
+\setinterfaceconstant{fieldoffset}{offsetcampo}
+\setinterfaceconstant{file}{file}
+\setinterfaceconstant{focus}{focus}
+\setinterfaceconstant{focusin}{focusin}
+\setinterfaceconstant{focusout}{focusout}
+\setinterfaceconstant{footer}{piedipagina}
+\setinterfaceconstant{footerdistance}{distanzapdp}
+\setinterfaceconstant{footerstate}{statopdp}
+\setinterfaceconstant{foregroundcolor}{coloreprimopiano}
+\setinterfaceconstant{foregroundstyle}{foregroundstyle}
+\setinterfaceconstant{format}{format}
+\setinterfaceconstant{frame}{cornice}
+\setinterfaceconstant{framecolor}{colorecornice}
+\setinterfaceconstant{framecorner}{angolocornice}
+\setinterfaceconstant{framedepth}{profonditacornice}
+\setinterfaceconstant{frameoffset}{offsetcornice}
+\setinterfaceconstant{frameradius}{raggiocornice}
+\setinterfaceconstant{frames}{cornici}
+\setinterfaceconstant{from}{da}
+\setinterfaceconstant{get}{prendi}
+\setinterfaceconstant{global}{globale}
+\setinterfaceconstant{grid}{griglia}
+\setinterfaceconstant{hang}{sospendi}
+\setinterfaceconstant{headcolor}{coloretesta}
+\setinterfaceconstant{headcommand}{headcommand}
+\setinterfaceconstant{headconversion}{conversionetesta}
+\setinterfaceconstant{header}{intestazione}
+\setinterfaceconstant{headerdistance}{distanzaintestazione}
+\setinterfaceconstant{headerstate}{statointestazione}
+\setinterfaceconstant{headlabel}{etichettatesta}
+\setinterfaceconstant{headnumber}{numerotesta}
+\setinterfaceconstant{headstyle}{stiletesta}
+\setinterfaceconstant{height}{altezza}
+\setinterfaceconstant{hfactor}{hfactor}
+\setinterfaceconstant{hfil}{hfil}
+\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horoffset}{horoffset}
+\setinterfaceconstant{hyphen}{hyphen}
+\setinterfaceconstant{icommand}{icomando}
+\setinterfaceconstant{in}{in}
+\setinterfaceconstant{inbetween}{tra}
+\setinterfaceconstant{increment}{incremento}
+\setinterfaceconstant{incrementnumber}{incrementanumero}
+\setinterfaceconstant{indenting}{rientro}
+\setinterfaceconstant{indentnext}{rientrasuccessivo}
+\setinterfaceconstant{indicator}{indicatore}
+\setinterfaceconstant{inner}{interno}
+\setinterfaceconstant{innermargin}{margineinterno}
+\setinterfaceconstant{inputfile}{inputfile}
+\setinterfaceconstant{interaction}{interazione}
+\setinterfaceconstant{interlinespace}{interlinea}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{elementi}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{parolachiave}
+\setinterfaceconstant{label}{etichetta}
+\setinterfaceconstant{left}{sinistra}
+\setinterfaceconstant{leftcolor}{coloresinistra}
+\setinterfaceconstant{leftcompoundhyphen}{leftcompoundhyphen}
+\setinterfaceconstant{leftedge}{bordosinistro}
+\setinterfaceconstant{leftedgedistance}{distanzabordosinistro}
+\setinterfaceconstant{leftframe}{cornicesinistra}
+\setinterfaceconstant{lefthyphen}{lefthyphen}
+\setinterfaceconstant{leftmargin}{marginesinistro}
+\setinterfaceconstant{leftmargindistance}{distanzamarginesinistro}
+\setinterfaceconstant{leftoffset}{offsetsinistro}
+\setinterfaceconstant{leftquotation}{citazionesinistra}
+\setinterfaceconstant{leftquote}{menzionesinistra}
+\setinterfaceconstant{leftsentence}{frasesinistra}
+\setinterfaceconstant{leftspeech}{leftspeech}
+\setinterfaceconstant{leftstyle}{stilesinistra}
+\setinterfaceconstant{leftsubsentence}{sottofrasesinistra}
+\setinterfaceconstant{lefttext}{testosinistro}
+\setinterfaceconstant{leftwidth}{ampiezzasinistra}
+\setinterfaceconstant{level}{livello}
+\setinterfaceconstant{levels}{livelli}
+\setinterfaceconstant{limittext}{limittext}
+\setinterfaceconstant{line}{riga}
+\setinterfaceconstant{linecorrection}{correzioneriga}
+\setinterfaceconstant{lines}{righe}
+\setinterfaceconstant{list}{elenco}
+\setinterfaceconstant{listtext}{listtext}
+\setinterfaceconstant{local}{locale}
+\setinterfaceconstant{location}{luogo}
+\setinterfaceconstant{logo}{logo}
+\setinterfaceconstant{logos}{loghi}
+\setinterfaceconstant{marcolor}{coloremarcatura}
+\setinterfaceconstant{margin}{margine}
+\setinterfaceconstant{margindistance}{distanzamargine}
+\setinterfaceconstant{marginedge}{bordomargine}
+\setinterfaceconstant{marginedgetext}{testobordomargine}
+\setinterfaceconstant{margintext}{testomargine}
+\setinterfaceconstant{marking}{marcatura}
+\setinterfaceconstant{marstyle}{stilemarcatura}
+\setinterfaceconstant{max}{max}
+\setinterfaceconstant{maxheight}{altezzamax}
+\setinterfaceconstant{maxwidth}{ampiezzamax}
+\setinterfaceconstant{menu}{menu}
+\setinterfaceconstant{method}{metodo}
+\setinterfaceconstant{middle}{centro}
+\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middletext}{testocentro}
+\setinterfaceconstant{midsentence}{midsentence}
+\setinterfaceconstant{min}{min}
+\setinterfaceconstant{mindepth}{mindeoth}
+\setinterfaceconstant{minheight}{altezzamin}
+\setinterfaceconstant{minwidth}{ampiezzamin}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{nome}
+\setinterfaceconstant{nbottom}{nfondo}
+\setinterfaceconstant{nc}{nc}
+\setinterfaceconstant{next}{successivo}
+\setinterfaceconstant{nl}{nl}
+\setinterfaceconstant{nleft}{nsinistra}
+\setinterfaceconstant{nlines}{nrighe}
+\setinterfaceconstant{norm}{norma}
+\setinterfaceconstant{nr}{nr}
+\setinterfaceconstant{nright}{ndestra}
+\setinterfaceconstant{ntop}{ncima}
+\setinterfaceconstant{number}{numero}
+\setinterfaceconstant{numbercolor}{colorenumero}
+\setinterfaceconstant{numbercommand}{comandonumero}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numerazione}
+\setinterfaceconstant{numberseparator}{separatorenumero}
+\setinterfaceconstant{numberstyle}{stilenumero}
+\setinterfaceconstant{numberwidth}{numberwidth}
+\setinterfaceconstant{nx}{nx}
+\setinterfaceconstant{ny}{ny}
+\setinterfaceconstant{object}{oggetto}
+\setinterfaceconstant{obstruction}{ostruzione}
+\setinterfaceconstant{oddmargin}{marginedispari}
+\setinterfaceconstant{offset}{offset}
+\setinterfaceconstant{openaction}{azioneapri}
+\setinterfaceconstant{openpageaction}{azioneapripagina}
+\setinterfaceconstant{option}{opzione}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{outermargin}{margineesterno}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{numeroproprio}
+\setinterfaceconstant{page}{pagina}
+\setinterfaceconstant{pageboundaries}{limitipagina}
+\setinterfaceconstant{pagecolor}{colorepagina}
+\setinterfaceconstant{pagecommand}{comandopagina}
+\setinterfaceconstant{pagenumber}{numeropagina}
+\setinterfaceconstant{pagestate}{statopagina}
+\setinterfaceconstant{pagestyle}{stilepagina}
+\setinterfaceconstant{palet}{tavolozza}
+\setinterfaceconstant{paper}{carta}
+\setinterfaceconstant{paragraph}{capoverso}
+\setinterfaceconstant{place}{metti}
+\setinterfaceconstant{placehead}{mettitesta}
+\setinterfaceconstant{placestopper}{mettistopper}
+\setinterfaceconstant{position}{posizione}
+\setinterfaceconstant{prefix}{prefisso}
+\setinterfaceconstant{preset}{preimpostato}
+\setinterfaceconstant{preview}{anteprima}
+\setinterfaceconstant{previous}{precedente}
+\setinterfaceconstant{previousnumber}{numeroprecedente}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{radius}{raggio}
+\setinterfaceconstant{random}{casuale}
+\setinterfaceconstant{reduction}{riduzione}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{reference}{riferimento}
+\setinterfaceconstant{referencing}{referencing}
+\setinterfaceconstant{regionin}{entraregione}
+\setinterfaceconstant{regionout}{esciregione}
+\setinterfaceconstant{repeat}{ripeti}
+\setinterfaceconstant{reset}{reset}
+\setinterfaceconstant{resetnumber}{resetnumber}
+\setinterfaceconstant{resolution}{risoluzione}
+\setinterfaceconstant{right}{destra}
+\setinterfaceconstant{rightcolor}{coloredestra}
+\setinterfaceconstant{rightcompoundhyphen}{rightcompoundhyphen}
+\setinterfaceconstant{rightedge}{bordodestro}
+\setinterfaceconstant{rightedgedistance}{distanzabordodestro}
+\setinterfaceconstant{rightframe}{cornicedestra}
+\setinterfaceconstant{righthyphen}{righthyphen}
+\setinterfaceconstant{rightmargin}{marginedestro}
+\setinterfaceconstant{rightmargindistance}{distanzamarginedestro}
+\setinterfaceconstant{rightoffset}{offsetdestro}
+\setinterfaceconstant{rightquotation}{citazionedestra}
+\setinterfaceconstant{rightquote}{menzionedestra}
+\setinterfaceconstant{rightsentence}{frasedestra}
+\setinterfaceconstant{rightspeech}{rightspeech}
+\setinterfaceconstant{rightstyle}{stiledestra}
+\setinterfaceconstant{rightsubsentence}{sottofrasedestra}
+\setinterfaceconstant{righttext}{testodestro}
+\setinterfaceconstant{rightwidth}{ampiezzadestra}
+\setinterfaceconstant{rotation}{rotazione}
+\setinterfaceconstant{rule}{linea}
+\setinterfaceconstant{rulecolor}{colorelinea}
+\setinterfaceconstant{rulethickness}{spessorelinea}
+\setinterfaceconstant{samepage}{stessapagina}
+\setinterfaceconstant{sample}{campione}
+\setinterfaceconstant{scale}{scala}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{schermo}
+\setinterfaceconstant{section}{sezione}
+\setinterfaceconstant{sectionnumber}{numerosezione}
+\setinterfaceconstant{separator}{separatore}
+\setinterfaceconstant{set}{set}
+\setinterfaceconstant{setups}{setups}
+\setinterfaceconstant{side}{lato}
+\setinterfaceconstant{sidealign}{sidealign}
+\setinterfaceconstant{sidemethod}{sidemethod}
+\setinterfaceconstant{sidespaceafter}{spaziolateraledopo}
+\setinterfaceconstant{sidespacebefore}{spaziolateraleprima}
+\setinterfaceconstant{sign}{segno}
+\setinterfaceconstant{size}{dimensione}
+\setinterfaceconstant{small}{piccolo}
+\setinterfaceconstant{sorttype}{sorttype}
+\setinterfaceconstant{source}{origine}
+\setinterfaceconstant{space}{spazio}
+\setinterfaceconstant{spaceafter}{spaziodopo}
+\setinterfaceconstant{spacebefore}{spazioprima}
+\setinterfaceconstant{spaceinbetween}{spaceinbetween}
+\setinterfaceconstant{spacing}{spaziatura}
+\setinterfaceconstant{split}{separa}
+\setinterfaceconstant{splitcolor}{splitcolor}
+\setinterfaceconstant{splitmethod}{splitmethod}
+\setinterfaceconstant{splitoffset}{splitoffset}
+\setinterfaceconstant{spot}{spot}
+\setinterfaceconstant{stack}{stack}
+\setinterfaceconstant{start}{inizia}
+\setinterfaceconstant{state}{stato}
+\setinterfaceconstant{step}{passo}
+\setinterfaceconstant{stop}{termina}
+\setinterfaceconstant{stopper}{stopper}
+\setinterfaceconstant{stretch}{dilata}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{stile}
+\setinterfaceconstant{sub}{sotto}
+\setinterfaceconstant{subtitle}{sottotitolo}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{sx}{sx}
+\setinterfaceconstant{sy}{sy}
+\setinterfaceconstant{symalign}{symallinea}
+\setinterfaceconstant{symbol}{simbolo}
+\setinterfaceconstant{symbolset}{setsimboli}
+\setinterfaceconstant{symcolor}{coloresimbolo}
+\setinterfaceconstant{symstyle}{stilesimbolo}
+\setinterfaceconstant{synonym}{sinonimo}
+\setinterfaceconstant{synonymcolor}{coloresinonimi}
+\setinterfaceconstant{synonymstyle}{stilesinonimi}
+\setinterfaceconstant{tab}{tab}
+\setinterfaceconstant{text}{testo}
+\setinterfaceconstant{textcolor}{coloretesto}
+\setinterfaceconstant{textcommand}{comandotesto}
+\setinterfaceconstant{textdistance}{distanzatesto}
+\setinterfaceconstant{textlayer}{textlayer}
+\setinterfaceconstant{textmargin}{textmargin}
+\setinterfaceconstant{textmethod}{textmethod}
+\setinterfaceconstant{textseparator}{separatoretesto}
+\setinterfaceconstant{textsize}{dimensionetesto}
+\setinterfaceconstant{textstate}{statotesto}
+\setinterfaceconstant{textstyle}{stiletesto}
+\setinterfaceconstant{textwidth}{ampiezzatesto}
+\setinterfaceconstant{title}{titolo}
+\setinterfaceconstant{titlecolor}{coloretitolo}
+\setinterfaceconstant{titlecommand}{titlecommand}
+\setinterfaceconstant{titledistance}{distanzatitolo}
+\setinterfaceconstant{titleleft}{titleleft}
+\setinterfaceconstant{titleright}{titleright}
+\setinterfaceconstant{titlestyle}{stiletitolo}
+\setinterfaceconstant{to}{verso}
+\setinterfaceconstant{tolerance}{tolleranza}
+\setinterfaceconstant{top}{cima}
+\setinterfaceconstant{topdistance}{distanzacima}
+\setinterfaceconstant{topframe}{cornicecima}
+\setinterfaceconstant{topoffset}{offsetcima}
+\setinterfaceconstant{topspace}{spaziocima}
+\setinterfaceconstant{topstate}{statocima}
+\setinterfaceconstant{type}{type}
+\setinterfaceconstant{unit}{unita}
+\setinterfaceconstant{unknownreference}{riferimentoingoto}
+\setinterfaceconstant{urlalternative}{alternativaurl}
+\setinterfaceconstant{urlspace}{spaziourl}
+\setinterfaceconstant{validate}{verifica}
+\setinterfaceconstant{vcommand}{vcomando}
+\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vfil}{vfil}
+\setinterfaceconstant{voffset}{voffset}
+\setinterfaceconstant{way}{modo}
+\setinterfaceconstant{wfactor}{wfactor}
+\setinterfaceconstant{white}{bianco}
+\setinterfaceconstant{width}{ampiezza}
+\setinterfaceconstant{xfactor}{xfactor}
+\setinterfaceconstant{xmax}{xmax}
+\setinterfaceconstant{xoffset}{xoffset}
+\setinterfaceconstant{xscale}{xscale}
+\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yfactor}{yfactor}
+\setinterfaceconstant{ymax}{ymax}
+\setinterfaceconstant{yoffset}{yoffset}
+\setinterfaceconstant{yscale}{yscale}
+\setinterfaceconstant{ystep}{ystep}
+% definitions for interface elements for language it
+%
+\setinterfaceelement{begin}{inizio}
+\setinterfaceelement{complete}{completo}
+\setinterfaceelement{coupled}{accoppiato}
+\setinterfaceelement{currentlocal}{correntelocale}
+\setinterfaceelement{emptyone}{prazdne}
+\setinterfaceelement{emptytwo}{vuoti}
+\setinterfaceelement{end}{fine}
+\setinterfaceelement{endsetup}{}
+\setinterfaceelement{get}{prendi}
+\setinterfaceelement{increment}{incrementa}
+\setinterfaceelement{list}{elenco}
+\setinterfaceelement{listof}{elencodi}
+\setinterfaceelement{load}{carica}
+\setinterfaceelement{local}{locale}
+\setinterfaceelement{makeup}{makeup}
+\setinterfaceelement{next}{successivo}
+\setinterfaceelement{place}{metti}
+\setinterfaceelement{previous}{precedente}
+\setinterfaceelement{previouslocal}{precedentelocale}
+\setinterfaceelement{reserve}{riserva}
+\setinterfaceelement{see}{vedi}
+\setinterfaceelement{setup}{imposta}
+\setinterfaceelement{start}{inizia}
+\setinterfaceelement{stop}{termina}
+\setinterfaceelement{text}{testo}
+\setinterfaceelement{type}{type}
+% definitions for interface commands for language it
+%
+\setinterfacecommand{CAPPED}{CAP}
+\setinterfacecommand{Character}{Lettera}
+\setinterfacecommand{Characters}{Lettere}
+\setinterfacecommand{LABELTEXT}{TESTOETICHETTA}
+\setinterfacecommand{MONTH}{MESE}
+\setinterfacecommand{Numbers}{Numeri}
+\setinterfacecommand{Romannumerals}{Numeriromani}
+\setinterfacecommand{SmallCapped}{Cap}
+\setinterfacecommand{SmallCaps}{Caps}
+\setinterfacecommand{WEEKDAY}{GIORNOSETTIMANA}
+\setinterfacecommand{WORD}{PAROLA}
+\setinterfacecommand{WORDS}{PAROLE}
+\setinterfacecommand{Word}{Parola}
+\setinterfacecommand{Words}{Parole}
+\setinterfacecommand{about}{intorno}
+\setinterfacecommand{adaptlayout}{adattalayout}
+\setinterfacecommand{arg}{arg}
+\setinterfacecommand{at}{al}
+\setinterfacecommand{atleftmargin}{atleftmargin}
+\setinterfacecommand{atpage}{apagina}
+\setinterfacecommand{atrightmargin}{atrightmargin}
+\setinterfacecommand{background}{sfondo}
+\setinterfacecommand{backspace}{spaziodietro}
+\setinterfacecommand{blackrule}{lineanera}
+\setinterfacecommand{blackrules}{lineenere}
+\setinterfacecommand{blank}{rigovuoto}
+\setinterfacecommand{bookmark}{segnalibro}
+\setinterfacecommand{bottomdistance}{distanzafondo}
+\setinterfacecommand{bottomheight}{altezzafondo}
+\setinterfacecommand{bottomspace}{spaziofondo}
+\setinterfacecommand{but}{fondo}
+\setinterfacecommand{button}{pulsante}
+\setinterfacecommand{bypassblocks}{saltablocchi}
+\setinterfacecommand{character}{lettera}
+\setinterfacecommand{characters}{lettere}
+\setinterfacecommand{chem}{chim}
+\setinterfacecommand{clip}{clip}
+\setinterfacecommand{clonefield}{clonacampo}
+\setinterfacecommand{color}{colore}
+\setinterfacecommand{colorbar}{barracolori}
+\setinterfacecommand{colorvalue}{valorecolore}
+\setinterfacecommand{column}{colonna}
+\setinterfacecommand{comment}{commento}
+\setinterfacecommand{comparecolorgroup}{confrontagruppocolori}
+\setinterfacecommand{comparepalet}{confrontatavolozza}
+\setinterfacecommand{completepagenumber}{numeropaginacompleto}
+\setinterfacecommand{completeregister}{completeregister}
+\setinterfacecommand{component}{componenet}
+\setinterfacecommand{convertnumber}{convertinumero}
+\setinterfacecommand{copyfield}{copiacampo}
+\setinterfacecommand{correctwhitespace}{correggispaziobianco}
+\setinterfacecommand{coupledocument}{accoppiadocumento}
+\setinterfacecommand{couplemarking}{accoppiamarcatura}
+\setinterfacecommand{couplepage}{accoppiapagina}
+\setinterfacecommand{couplepaper}{accoppiacarta}
+\setinterfacecommand{coupleregister}{accoppiaregistro}
+\setinterfacecommand{crlf}{crlf}
+\setinterfacecommand{currentdate}{datadioggi}
+\setinterfacecommand{currentheadnumber}{numerotestacorrente}
+\setinterfacecommand{cutspace}{cutspace}
+\setinterfacecommand{date}{data}
+\setinterfacecommand{decouplemarking}{separamarcatura}
+\setinterfacecommand{decrementnumber}{decrementnumber}
+\setinterfacecommand{define}{definisci}
+\setinterfacecommand{defineaccent}{definisciaccento}
+\setinterfacecommand{defineblank}{definiscirigovuoto}
+\setinterfacecommand{defineblock}{definisciblocco}
+\setinterfacecommand{definebodyfont}{definiscifontdeltesto}
+\setinterfacecommand{definebodyfontenvironment}{definisciambientefontdeltesto}
+\setinterfacecommand{definebuffer}{definiscibuffer}
+\setinterfacecommand{definecharacter}{definiscicarattere}
+\setinterfacecommand{definecolor}{definiscicolore}
+\setinterfacecommand{definecolorgroup}{definiscigruppocolori}
+\setinterfacecommand{definecolumnbreak}{definecolumnbreak}
+\setinterfacecommand{definecolumnset}{definiscigruppocolonne}
+\setinterfacecommand{definecombination}{definecombination}
+\setinterfacecommand{definecombinedlist}{definiscielencocombinato}
+\setinterfacecommand{definecommand}{definiscicomando}
+\setinterfacecommand{defineconversion}{definisciconversione}
+\setinterfacecommand{definedescription}{definiscidescrizione}
+\setinterfacecommand{defineenumeration}{definiscienumerazione}
+\setinterfacecommand{definefield}{definiscicampo}
+\setinterfacecommand{definefieldstack}{definiscistackcampi}
+\setinterfacecommand{definefiguresymbol}{definiscifigurasimbolo}
+\setinterfacecommand{definefloat}{definiscioggettomobile}
+\setinterfacecommand{definefont}{definiscifont}
+\setinterfacecommand{definefontstyle}{definiscistilefont}
+\setinterfacecommand{definefontsynonym}{definiscisinonimofont}
+\setinterfacecommand{defineframed}{definisciincorniciato}
+\setinterfacecommand{defineframedtext}{definiscitestoincorniciato}
+\setinterfacecommand{definehbox}{definiscihbox}
+\setinterfacecommand{definehead}{definiscitesta}
+\setinterfacecommand{defineindenting}{definiscirientro}
+\setinterfacecommand{defineinmargin}{defineinmargin}
+\setinterfacecommand{defineinteractionmenu}{definiscimenuinterazione}
+\setinterfacecommand{defineitemgroup}{defineitemgroup}
+\setinterfacecommand{definelabel}{definiscietichetta}
+\setinterfacecommand{definelayer}{definelayer}
+\setinterfacecommand{definelayout}{definiscilayout}
+\setinterfacecommand{definelist}{definiscielenco}
+\setinterfacecommand{definelogo}{definiscilogo}
+\setinterfacecommand{definemainfield}{definiscicampoprincipale}
+\setinterfacecommand{definemakeup}{definiscimakeup}
+\setinterfacecommand{definemarking}{definiscimarcatura}
+\setinterfacecommand{definemathalignment}{definemathalignment}
+\setinterfacecommand{defineoutput}{definiscioutput}
+\setinterfacecommand{defineoverlay}{definiscisovrapposizione}
+\setinterfacecommand{definepagebreak}{definepagebreak}
+\setinterfacecommand{definepalet}{definiscitavolozza}
+\setinterfacecommand{definepapersize}{definiscidimensionicarta}
+\setinterfacecommand{defineparagraphs}{definiscicapoversi}
+\setinterfacecommand{defineplacement}{defineplacement}
+\setinterfacecommand{defineprofile}{definisciprofilo}
+\setinterfacecommand{defineprogram}{definisciprogramma}
+\setinterfacecommand{definerawfont}{definiscifontgrezzo}
+\setinterfacecommand{definereference}{definisciriferimento}
+\setinterfacecommand{definereferenceformat}{definisciformatoriferimento}
+\setinterfacecommand{definereferencelist}{definiscilistariferimenti}
+\setinterfacecommand{defineregister}{definisciregistro}
+\setinterfacecommand{definerule}{definiscilinea}
+\setinterfacecommand{definesection}{definiscisezione}
+\setinterfacecommand{definesectionblock}{definiscibloccosezione}
+\setinterfacecommand{definesorting}{definisciordinamento}
+\setinterfacecommand{definestartstop}{definisciiniziatermina}
+\setinterfacecommand{definestyle}{definiscistile}
+\setinterfacecommand{definesubfield}{definiscisottocampo}
+\setinterfacecommand{definesymbol}{definiscisimbolo}
+\setinterfacecommand{definesynonyms}{definiscisinonimi}
+\setinterfacecommand{definetabletemplate}{definiscimodellotabella}
+\setinterfacecommand{definetabulate}{definiscitabulato}
+\setinterfacecommand{definetext}{definiscitesto}
+\setinterfacecommand{definetextposition}{definisciposizionetesto}
+\setinterfacecommand{definetextvariable}{definiscivariabiletesto}
+\setinterfacecommand{definetype}{definiscitype}
+\setinterfacecommand{definetyping}{definiscityping}
+\setinterfacecommand{defineversion}{definisciversion}
+\setinterfacecommand{determineheadnumber}{determinanumerotesta}
+\setinterfacecommand{determinelistcharacteristics}{determinacarattersticheelenco}
+\setinterfacecommand{determineregistercharacteristics}{determinacaratteristicheregistro}
+\setinterfacecommand{dimension}{dimensione}
+\setinterfacecommand{disableinteractionmenu}{disabilitamenuinterazione}
+\setinterfacecommand{domicile}{domicilio}
+\setinterfacecommand{donttest}{notest}
+\setinterfacecommand{edgedistance}{distanzabordo}
+\setinterfacecommand{edgewidth}{ampiezzabordo}
+\setinterfacecommand{emptylines}{emptylines}
+\setinterfacecommand{environment}{ambiente}
+\setinterfacecommand{externalfigure}{figuraesterna}
+\setinterfacecommand{fact}{fatto}
+\setinterfacecommand{field}{campi}
+\setinterfacecommand{fieldstack}{stackcampi}
+\setinterfacecommand{fillinfield}{camporiempimento}
+\setinterfacecommand{fillinline}{rigariempimento}
+\setinterfacecommand{fillinrules}{lineeriempimento}
+\setinterfacecommand{fillintext}{testoriempimento}
+\setinterfacecommand{fitfield}{adattacampo}
+\setinterfacecommand{fixedspace}{spaziofisso}
+\setinterfacecommand{fixedspaces}{spazifissi}
+\setinterfacecommand{followprofile}{seguiprofilo}
+\setinterfacecommand{followprofileversion}{seguiversioneprofilo}
+\setinterfacecommand{followversion}{seguiversione}
+\setinterfacecommand{footerdistance}{distanzapdp}
+\setinterfacecommand{footerheight}{altezzapdp}
+\setinterfacecommand{footnote}{notapdp}
+\setinterfacecommand{footnotetext}{testonotapdp}
+\setinterfacecommand{forceblocks}{forzablocchi}
+\setinterfacecommand{formulanumber}{numeroformula}
+\setinterfacecommand{fraction}{frazione}
+\setinterfacecommand{framed}{incorniciato}
+\setinterfacecommand{from}{da}
+\setinterfacecommand{getbuffer}{prendibuffer}
+\setinterfacecommand{getmarking}{prendimarcatura}
+\setinterfacecommand{getnumber}{getnumber}
+\setinterfacecommand{godown}{vaigiu}
+\setinterfacecommand{goto}{vaia}
+\setinterfacecommand{gotobox}{vaiabox}
+\setinterfacecommand{gotopage}{vaiapagina}
+\setinterfacecommand{graycolor}{coloregrigio}
+\setinterfacecommand{greyvalue}{valoregrigio}
+\setinterfacecommand{grid}{griglia}
+\setinterfacecommand{hairline}{capello}
+\setinterfacecommand{head}{testa}
+\setinterfacecommand{headerdistance}{distanzaintestazione}
+\setinterfacecommand{headerheight}{altezzaintestazione}
+\setinterfacecommand{headlevel}{livellotesta}
+\setinterfacecommand{headnumber}{numerotesta}
+\setinterfacecommand{headsym}{headsym}
+\setinterfacecommand{headtext}{testoinstestazioni}
+\setinterfacecommand{hideblocks}{nascondiblocchi}
+\setinterfacecommand{high}{ap}
+\setinterfacecommand{hl}{hl}
+\setinterfacecommand{immediatebetweenlist}{immediatebetweenlist}
+\setinterfacecommand{immediatetolist}{immediatetolist}
+\setinterfacecommand{in}{in}
+\setinterfacecommand{incrementnumber}{incrementanumero}
+\setinterfacecommand{indenting}{rientro}
+\setinterfacecommand{inframed}{circondato}
+\setinterfacecommand{infull}{perlungo}
+\setinterfacecommand{ininner}{ininner}
+\setinterfacecommand{inleft}{insinistra}
+\setinterfacecommand{inleftedge}{inlatosinistro}
+\setinterfacecommand{inleftmargin}{inmarginesinistro}
+\setinterfacecommand{inline}{inriga}
+\setinterfacecommand{inmargin}{inmargine}
+\setinterfacecommand{inmframed}{inmaframed}
+\setinterfacecommand{inneredgedistance}{inneredgedistance}
+\setinterfacecommand{inneredgewidth}{inneredgewidth}
+\setinterfacecommand{innermargindistance}{innermargindistance}
+\setinterfacecommand{innermarginwidth}{innermarginwidth}
+\setinterfacecommand{inothermargin}{inaltromargine}
+\setinterfacecommand{inouter}{inouter}
+\setinterfacecommand{inright}{indestra}
+\setinterfacecommand{inrightedge}{inlatodestro}
+\setinterfacecommand{inrightmargin}{inmarginedestro}
+\setinterfacecommand{installlanguage}{installalingua}
+\setinterfacecommand{interactionbar}{barrainterazione}
+\setinterfacecommand{interactionbuttons}{pulsantinterazione}
+\setinterfacecommand{interactionmenu}{menuinterattivo}
+\setinterfacecommand{item}{elemento}
+\setinterfacecommand{items}{elementi}
+\setinterfacecommand{its}{el}
+\setinterfacecommand{keepblocks}{tieniblocchi}
+\setinterfacecommand{label}{etichetta}
+\setinterfacecommand{labels}{etichette}
+\setinterfacecommand{labeltext}{testoetichetta}
+\setinterfacecommand{language}{lingua}
+\setinterfacecommand{leftaligned}{allineasinistra}
+\setinterfacecommand{leftedgedistance}{distanzabordosinistro}
+\setinterfacecommand{leftedgewidth}{ampiezzabordosinistro}
+\setinterfacecommand{leftmargindistance}{distanzamarginesinistro}
+\setinterfacecommand{leftmarginwidth}{ampiezzamarginesinistro}
+\setinterfacecommand{leg}{leg}
+\setinterfacecommand{linewidth}{spessoreriga}
+\setinterfacecommand{listheight}{altezzaelenco}
+\setinterfacecommand{listlength}{lunghezzaelenco}
+\setinterfacecommand{listsymbol}{listsymbol}
+\setinterfacecommand{listwidth}{ampiezzaelenco}
+\setinterfacecommand{logfields}{logcampi}
+\setinterfacecommand{lohi}{pedap}
+\setinterfacecommand{low}{ped}
+\setinterfacecommand{macroname}{nome}
+\setinterfacecommand{mainlanguage}{linguaprincipale}
+\setinterfacecommand{makeupheight}{altezzamakeup}
+\setinterfacecommand{makeupwidth}{ampiezzamakeup}
+\setinterfacecommand{mar}{mar}
+\setinterfacecommand{margindistance}{distanzamargine}
+\setinterfacecommand{marginrule}{lineamargine}
+\setinterfacecommand{margintext}{testoinmargine}
+\setinterfacecommand{margintitle}{titoloinmargine}
+\setinterfacecommand{marginwidth}{ampiezzamargine}
+\setinterfacecommand{marginword}{parolainmargine}
+\setinterfacecommand{marking}{marcatura}
+\setinterfacecommand{markversion}{marcaversione}
+\setinterfacecommand{mathematics}{matematica}
+\setinterfacecommand{menubutton}{pulsantemenu}
+\setinterfacecommand{mframed}{maframed}
+\setinterfacecommand{midaligned}{allineacentro}
+\setinterfacecommand{mirror}{riflessione}
+\setinterfacecommand{month}{mese}
+\setinterfacecommand{moveformula}{spostaformula}
+\setinterfacecommand{moveongrid}{spostaagriglia}
+\setinterfacecommand{movesidefloat}{movesidefloat}
+\setinterfacecommand{navigating}{navigating}
+\setinterfacecommand{nodimension}{nientedimensioni}
+\setinterfacecommand{noheaderandfooterlines}{nientelineintestazionepdp}
+\setinterfacecommand{noindenting}{nienterientro}
+\setinterfacecommand{nolist}{nienteelenco}
+\setinterfacecommand{nomarking}{nientemarcatura}
+\setinterfacecommand{nomoreblocks}{bastablocchi}
+\setinterfacecommand{nomorefiles}{bastafile}
+\setinterfacecommand{nop}{nop}
+\setinterfacecommand{nospace}{nientespazio}
+\setinterfacecommand{note}{nota}
+\setinterfacecommand{notopandbottomlines}{nientelineecimafondo}
+\setinterfacecommand{notsmallcapped}{nocap}
+\setinterfacecommand{nowhitespace}{nientespaziobianco}
+\setinterfacecommand{numberofsubpages}{numberofsubpages}
+\setinterfacecommand{numbers}{numeri}
+\setinterfacecommand{outeredgedistance}{outeredgedistance}
+\setinterfacecommand{outeredgewidth}{outeredgewidth}
+\setinterfacecommand{outermargindistance}{outermargindistance}
+\setinterfacecommand{outermarginwidth}{outermarginwidth}
+\setinterfacecommand{overbar}{sopralinea}
+\setinterfacecommand{overbars}{sopralinee}
+\setinterfacecommand{overstrike}{sbarrato}
+\setinterfacecommand{overstrikes}{sbarrati}
+\setinterfacecommand{packed}{impaccato}
+\setinterfacecommand{page}{pagina}
+\setinterfacecommand{pagedepth}{pagedepth}
+\setinterfacecommand{pagenumber}{numeropagina}
+\setinterfacecommand{pageoffset}{pageoffset}
+\setinterfacecommand{pagereference}{riferimentopagina}
+\setinterfacecommand{pagetype}{tipopagina}
+\setinterfacecommand{paperheight}{altezzacarta}
+\setinterfacecommand{paperwidth}{ampiezzacarta}
+\setinterfacecommand{periods}{punti}
+\setinterfacecommand{plaatsruwelijst}{placerawlist}
+\setinterfacecommand{placebookmarks}{mettisegnalibro}
+\setinterfacecommand{placecombinedlist}{mettielencocombinato}
+\setinterfacecommand{placefloat}{placefloat}
+\setinterfacecommand{placefootnotes}{mettinotepdp}
+\setinterfacecommand{placeformula}{mettiformula}
+\setinterfacecommand{placeheadnumber}{posizionanumerotesta}
+\setinterfacecommand{placeheadtext}{posizionatestotesta}
+\setinterfacecommand{placelegend}{mettilegenda}
+\setinterfacecommand{placelist}{mettielenco}
+\setinterfacecommand{placelocalfootnotes}{mettinotepdplocali}
+\setinterfacecommand{placelogos}{mettiloghi}
+\setinterfacecommand{placeongrid}{mettiingriglia}
+\setinterfacecommand{placeontopofeachother}{mettiunosullaltro}
+\setinterfacecommand{placepagenumber}{mettinumeropagina}
+\setinterfacecommand{placereferencelist}{placereferencelist}
+\setinterfacecommand{placeregister}{mettiregistro}
+\setinterfacecommand{placerule}{mettilinea}
+\setinterfacecommand{placesidebyside}{mettifiancoafianco}
+\setinterfacecommand{placesubformula}{mettisottoformula}
+\setinterfacecommand{placetextvariable}{mettivariabiletesto}
+\setinterfacecommand{position}{posizione}
+\setinterfacecommand{positiontext}{posizionatesto}
+\setinterfacecommand{printpaperheight}{altezzacartastampa}
+\setinterfacecommand{printpaperwidth}{ampiezzacartastampa}
+\setinterfacecommand{processblocks}{elaborablocchi}
+\setinterfacecommand{processpage}{elaborapagina}
+\setinterfacecommand{product}{prodotto}
+\setinterfacecommand{program}{programma}
+\setinterfacecommand{project}{progetto}
+\setinterfacecommand{publication}{pubblicazione}
+\setinterfacecommand{quotation}{citazione}
+\setinterfacecommand{quote}{menzione}
+\setinterfacecommand{ran}{ran}
+\setinterfacecommand{redo}{rifai}
+\setinterfacecommand{ref}{rif}
+\setinterfacecommand{reference}{riferimento}
+\setinterfacecommand{referral}{referral}
+\setinterfacecommand{referraldate}{datareferral}
+\setinterfacecommand{referring}{referring}
+\setinterfacecommand{remark}{commento}
+\setinterfacecommand{reset}{reimposta}
+\setinterfacecommand{resetmarking}{reimpostamarcatura}
+\setinterfacecommand{resetnumber}{resetnumber}
+\setinterfacecommand{resettext}{resettextcontent}
+\setinterfacecommand{rightaligned}{allineadestra}
+\setinterfacecommand{rightedgedistance}{distanzabordodestro}
+\setinterfacecommand{rightedgewidth}{ampiezzabordodestro}
+\setinterfacecommand{rightmargindistance}{distanzamarginedestro}
+\setinterfacecommand{rightmarginwidth}{ampiezzamarginedestro}
+\setinterfacecommand{romannumerals}{numeriromani}
+\setinterfacecommand{rotate}{ruota}
+\setinterfacecommand{scale}{scala}
+\setinterfacecommand{screen}{schermo}
+\setinterfacecommand{selectblocks}{selezionablocchi}
+\setinterfacecommand{selectpaper}{selezionacarta}
+\setinterfacecommand{selectversion}{selezionaversione}
+\setinterfacecommand{setnumber}{setnumber}
+\setinterfacecommand{settextcontent}{settext}
+\setinterfacecommand{settextvariable}{setvariabiletesto}
+\setinterfacecommand{setupalign}{impostaallineamento}
+\setinterfacecommand{setuparranging}{impostaparranging}
+\setinterfacecommand{setupbackground}{impostasfondo}
+\setinterfacecommand{setupbackgrounds}{impostasfondi}
+\setinterfacecommand{setupblackrules}{impostalineenere}
+\setinterfacecommand{setupblank}{impostarigovuoto}
+\setinterfacecommand{setupblock}{impostablocco}
+\setinterfacecommand{setupbodyfont}{impostafontdeltesto}
+\setinterfacecommand{setupbodyfontenvironment}{impostaambientefontdeltesto}
+\setinterfacecommand{setupbottom}{impostafondo}
+\setinterfacecommand{setupbottomtexts}{impostatestifondo}
+\setinterfacecommand{setupbuffer}{impostabuffer}
+\setinterfacecommand{setupbuttons}{impostapulsanti}
+\setinterfacecommand{setupcapitals}{impostamaiuscole}
+\setinterfacecommand{setupcaption}{impostacaption}
+\setinterfacecommand{setupcaptions}{impostacaptions}
+\setinterfacecommand{setupclipping}{impostaclippling}
+\setinterfacecommand{setupcolor}{impostacolore}
+\setinterfacecommand{setupcolors}{impostacolori}
+\setinterfacecommand{setupcolumns}{impostacolonne}
+\setinterfacecommand{setupcolumnset}{impostagruppocolonne}
+\setinterfacecommand{setupcolumnsetlines}{setupcolumnsetlines}
+\setinterfacecommand{setupcolumnsetstart}{setupcolumnsetstart}
+\setinterfacecommand{setupcombinations}{impostacombinazioni}
+\setinterfacecommand{setupcombinedlist}{impostaelencocombinato}
+\setinterfacecommand{setupcomment}{impostacommento}
+\setinterfacecommand{setupdescriptions}{impostadescrizioni}
+\setinterfacecommand{setupenumerations}{impostaenumerazioni}
+\setinterfacecommand{setupexternalfigures}{impostafigureesterne}
+\setinterfacecommand{setupfield}{impostacampo}
+\setinterfacecommand{setupfields}{impostacampi}
+\setinterfacecommand{setupfillinlines}{impostarigheriempimento}
+\setinterfacecommand{setupfillinrules}{impostalineeriempimento}
+\setinterfacecommand{setupfloat}{impostaoggettomobile}
+\setinterfacecommand{setupfloats}{impostaoggettimobili}
+\setinterfacecommand{setupfloatsplitting}{impostaspezzamentooggettomobile}
+\setinterfacecommand{setupfooter}{impostapdp}
+\setinterfacecommand{setupfootertexts}{impostatestipdp}
+\setinterfacecommand{setupfootnotedefinition}{impostadefinizionenotepdp}
+\setinterfacecommand{setupfootnotes}{impostanotepdp}
+\setinterfacecommand{setupforms}{impostaforms}
+\setinterfacecommand{setupformulas}{impostaformule}
+\setinterfacecommand{setupframed}{impostaincorniciato}
+\setinterfacecommand{setupframedtexts}{impostatestiincorniciati}
+\setinterfacecommand{setuphead}{impostatesta}
+\setinterfacecommand{setupheader}{impostainstestazione}
+\setinterfacecommand{setupheadertexts}{impostatestiintestazioni}
+\setinterfacecommand{setupheadnumber}{impostanumerotesta}
+\setinterfacecommand{setupheads}{impostateste}
+\setinterfacecommand{setupheadtext}{impostatestointestazioni}
+\setinterfacecommand{setuphyphenmark}{impostasegnosillabazione}
+\setinterfacecommand{setupindentations}{impostarientri}
+\setinterfacecommand{setupindenting}{impostarientro}
+\setinterfacecommand{setupinmargin}{impostainmargine}
+\setinterfacecommand{setupinteraction}{impostainterazione}
+\setinterfacecommand{setupinteractionbar}{impostabarrainterazione}
+\setinterfacecommand{setupinteractionmenu}{impostamenuinterazione}
+\setinterfacecommand{setupinteractionscreen}{impostaschermointerazione}
+\setinterfacecommand{setupinterlinespace}{impostainterlinea}
+\setinterfacecommand{setupitemgroup}{setupitemgroup}
+\setinterfacecommand{setupitemgroups}{impostaelencazioni}
+\setinterfacecommand{setupitems}{impostaelementi}
+\setinterfacecommand{setuplabeltext}{impostatestoetichette}
+\setinterfacecommand{setuplanguage}{impostalingua}
+\setinterfacecommand{setuplayout}{impostalayout}
+\setinterfacecommand{setuplegend}{impostalegenda}
+\setinterfacecommand{setuplinenumbering}{impostanumerazionerighe}
+\setinterfacecommand{setuplines}{impostarighe}
+\setinterfacecommand{setuplinewidth}{impostaampiezzariga}
+\setinterfacecommand{setuplist}{impostaelenco}
+\setinterfacecommand{setupmakeup}{impostamakeup}
+\setinterfacecommand{setupmarginblocks}{impostablocchimargine}
+\setinterfacecommand{setupmarginrules}{impostalineemargine}
+\setinterfacecommand{setupmarking}{impostamarcatura}
+\setinterfacecommand{setupmathalignment}{setupmathalignment}
+\setinterfacecommand{setupnarrower}{impostapiustretto}
+\setinterfacecommand{setupnumber}{impostanumerazione}
+\setinterfacecommand{setupnumbering}{impostanumerazione}
+\setinterfacecommand{setupoppositeplacing}{impostaposizionamentoopposti}
+\setinterfacecommand{setupoutput}{impostaoutput}
+\setinterfacecommand{setuppagecomment}{impostacommentopagina}
+\setinterfacecommand{setuppagenumber}{impostanumeropagina}
+\setinterfacecommand{setuppagenumbering}{impostanumerazionepagina}
+\setinterfacecommand{setuppagetransitions}{impostatransizionepagina}
+\setinterfacecommand{setuppalet}{impostatavolozza}
+\setinterfacecommand{setuppaper}{setuppaper}
+\setinterfacecommand{setuppapersize}{impostadimensionicarta}
+\setinterfacecommand{setupparagraphnumbering}{impostanumerazionecapoversi}
+\setinterfacecommand{setupparagraphs}{impostacapoversi}
+\setinterfacecommand{setupplacement}{setupplacement}
+\setinterfacecommand{setuppositioning}{impostaposizionamento}
+\setinterfacecommand{setupprofiles}{impostaprofili}
+\setinterfacecommand{setupprograms}{impostaprogrammi}
+\setinterfacecommand{setuppublications}{impostapubblicazioni}
+\setinterfacecommand{setupquote}{impostamenzione}
+\setinterfacecommand{setupreferencelist}{impostalistariferimenti}
+\setinterfacecommand{setupreferencing}{impostariferimento}
+\setinterfacecommand{setupregister}{impostaregistro}
+\setinterfacecommand{setuprotate}{impostarotazione}
+\setinterfacecommand{setuprule}{impostalinea}
+\setinterfacecommand{setups}{impostazioni}
+\setinterfacecommand{setupscreens}{impostaschermi}
+\setinterfacecommand{setupsection}{impostasezione}
+\setinterfacecommand{setupsectionblock}{impostabloccosezione}
+\setinterfacecommand{setupsorting}{impostaordinamento}
+\setinterfacecommand{setupspacing}{impostaspaziatura}
+\setinterfacecommand{setupstartstop}{impostainiziatermina}
+\setinterfacecommand{setupstrut}{impostastrut}
+\setinterfacecommand{setupsubpagenumber}{impostanumerosottopagina}
+\setinterfacecommand{setupsymbolset}{impostasetsimboli}
+\setinterfacecommand{setupsynchronization}{impostasincronizzazione}
+\setinterfacecommand{setupsynchronizationbar}{impostabarrasincronizzazione}
+\setinterfacecommand{setupsynonyms}{impostasinonimi}
+\setinterfacecommand{setupsystem}{impostasistema}
+\setinterfacecommand{setuptab}{impostatab}
+\setinterfacecommand{setuptables}{impostatabelle}
+\setinterfacecommand{setuptabulate}{impostatabulato}
+\setinterfacecommand{setuptext}{impostatesto}
+\setinterfacecommand{setuptextposition}{impostaposizionetesto}
+\setinterfacecommand{setuptextrules}{impostalineetesto}
+\setinterfacecommand{setuptexttexts}{impostatestotesti}
+\setinterfacecommand{setuptextvariable}{impostavariabiletesto}
+\setinterfacecommand{setupthinrules}{impostalineesottili}
+\setinterfacecommand{setuptolerance}{impostatolleranza}
+\setinterfacecommand{setuptop}{impostacima}
+\setinterfacecommand{setuptoptexts}{impostatesticima}
+\setinterfacecommand{setuptype}{impostatype}
+\setinterfacecommand{setuptyping}{impostatyping}
+\setinterfacecommand{setupunderbar}{impostasottolinea}
+\setinterfacecommand{setupurl}{impostaurl}
+\setinterfacecommand{setupversions}{impostaversioni}
+\setinterfacecommand{setupwhitespace}{impostaspaziobianco}
+\setinterfacecommand{showbodyfont}{mostrafontdeltesto}
+\setinterfacecommand{showbodyfontenvironment}{mostraambientefontdeltesto}
+\setinterfacecommand{showcolor}{mostracolore}
+\setinterfacecommand{showcolorgroup}{mostragruppocolori}
+\setinterfacecommand{showexternalfigures}{mostrafiguresterne}
+\setinterfacecommand{showfields}{mostracampi}
+\setinterfacecommand{showframe}{mostracornice}
+\setinterfacecommand{showgrid}{mostragriglia}
+\setinterfacecommand{showlayout}{mostralyout}
+\setinterfacecommand{showmakeup}{mostramakeup}
+\setinterfacecommand{showpalet}{mostratavolozza}
+\setinterfacecommand{showprint}{mostrastampa}
+\setinterfacecommand{showsetups}{mostraimpostazioni}
+\setinterfacecommand{showstruts}{mostrastruts}
+\setinterfacecommand{showsymbolset}{mostrasetsimboli}
+\setinterfacecommand{smallcapped}{cap}
+\setinterfacecommand{someline}{qualcheriga}
+\setinterfacecommand{somewhere}{daqualcheparte}
+\setinterfacecommand{space}{spazio}
+\setinterfacecommand{splitfloat}{spezzaoggettomobile}
+\setinterfacecommand{startalignment}{iniziaallineamento}
+\setinterfacecommand{startbackground}{iniziasfondo}
+\setinterfacecommand{startcoding}{iniziacodifica}
+\setinterfacecommand{startcolor}{iniziacolore}
+\setinterfacecommand{startcolumnmakeup}{startcolumnmakeup}
+\setinterfacecommand{startcolumns}{iniziacolonne}
+\setinterfacecommand{startcolumnset}{iniziagruppocolonne}
+\setinterfacecommand{startcombination}{iniziacombinazione}
+\setinterfacecommand{startcomponent}{iniziacomponente}
+\setinterfacecommand{startdocument}{iniziadocumento}
+\setinterfacecommand{startenvironment}{iniziaambiente}
+\setinterfacecommand{startfigure}{iniziafigura}
+\setinterfacecommand{startglobal}{iniziaglobale}
+\setinterfacecommand{startline}{iniziariga}
+\setinterfacecommand{startlinecorrection}{iniziacorrezioneriga}
+\setinterfacecommand{startlinenumbering}{inizianumerazionerighe}
+\setinterfacecommand{startlines}{iniziarighe}
+\setinterfacecommand{startlocal}{inizialocale}
+\setinterfacecommand{startlocalfootnotes}{inizianotepdplocali}
+\setinterfacecommand{startmakeup}{iniziamakeup}
+\setinterfacecommand{startmarginblock}{iniziabloccomargine}
+\setinterfacecommand{startmarginrule}{inizialineamargine}
+\setinterfacecommand{startnarrower}{iniziapiustretto}
+\setinterfacecommand{startopposite}{iniziaopposto}
+\setinterfacecommand{startoverlay}{iniziasovrapposizione}
+\setinterfacecommand{startoverzicht}{iniziaoverview}
+\setinterfacecommand{startpacked}{iniziaimpaccato}
+\setinterfacecommand{startpositioning}{iniziaposizionamento}
+\setinterfacecommand{startproduct}{iniziaprodotto}
+\setinterfacecommand{startprofile}{iniziaprofilo}
+\setinterfacecommand{startproject}{iniziaprogetto}
+\setinterfacecommand{startquotation}{iniziacitazione}
+\setinterfacecommand{startraster}{iniziaraster}
+\setinterfacecommand{startsymbolset}{iniziasetsimboli}
+\setinterfacecommand{startsynchronization}{iniziasincronizzazione}
+\setinterfacecommand{starttable}{iniziatabella}
+\setinterfacecommand{starttables}{iniziatabelle}
+\setinterfacecommand{starttext}{iniziatesto}
+\setinterfacecommand{starttextrule}{inizialineatesto}
+\setinterfacecommand{startunpacked}{iniziaunpacked}
+\setinterfacecommand{startversion}{iniziaversione}
+\setinterfacecommand{stopalignment}{terminaallineamento}
+\setinterfacecommand{stopbackground}{terminasfondo}
+\setinterfacecommand{stopcoding}{terminacodifica}
+\setinterfacecommand{stopcolor}{terminacolore}
+\setinterfacecommand{stopcolumnmakeup}{stopcolumnmakeup}
+\setinterfacecommand{stopcolumns}{terminacolonne}
+\setinterfacecommand{stopcolumnset}{terminagruppocolonne}
+\setinterfacecommand{stopcombination}{terminacombinazione}
+\setinterfacecommand{stopcomponent}{terminacomponente}
+\setinterfacecommand{stopdocument}{terminadocumento}
+\setinterfacecommand{stopenvironment}{terminaambiente}
+\setinterfacecommand{stopglobal}{terminaglobale}
+\setinterfacecommand{stopline}{terminariga}
+\setinterfacecommand{stoplinecorrection}{terminacorrezioneriga}
+\setinterfacecommand{stoplinenumbering}{terminanumerazionerighe}
+\setinterfacecommand{stoplines}{terminarighe}
+\setinterfacecommand{stoplocal}{terminalocale}
+\setinterfacecommand{stoplocalfootnotes}{terminanotepdplocali}
+\setinterfacecommand{stopmakeup}{terminamakeup}
+\setinterfacecommand{stopmarginblock}{terminabloccomargine}
+\setinterfacecommand{stopmarginrule}{terminalineamargine}
+\setinterfacecommand{stopnarrower}{terminapiustretto}
+\setinterfacecommand{stopopposite}{terminaopposto}
+\setinterfacecommand{stopoverlay}{terminasovrapposizione}
+\setinterfacecommand{stopoverzicht}{terminaoverview}
+\setinterfacecommand{stoppacked}{terminaimpaccato}
+\setinterfacecommand{stoppositioning}{terminaposizionamento}
+\setinterfacecommand{stopproduct}{terminaprodotto}
+\setinterfacecommand{stopprofile}{terminaprofili}
+\setinterfacecommand{stopproject}{terminaprogetto}
+\setinterfacecommand{stopquotation}{terminacitazione}
+\setinterfacecommand{stopraster}{terminaraster}
+\setinterfacecommand{stopsynchronization}{terminasincronizzazione}
+\setinterfacecommand{stoptable}{terminatabella}
+\setinterfacecommand{stoptables}{terminatabelle}
+\setinterfacecommand{stoptext}{terminatesto}
+\setinterfacecommand{stoptextrule}{terminalineatesto}
+\setinterfacecommand{stopunpacked}{terminaunpacked}
+\setinterfacecommand{stopversion}{terminaversioni}
+\setinterfacecommand{stretched}{stirato}
+\setinterfacecommand{subformulanumber}{numerosottoformula}
+\setinterfacecommand{subpagenumber}{subpagenumber}
+\setinterfacecommand{switchtobodyfont}{cambiaafontdeltesto}
+\setinterfacecommand{switchtorawfont}{passaafontgrezzo}
+\setinterfacecommand{sym}{sim}
+\setinterfacecommand{symbol}{simbolo}
+\setinterfacecommand{synchronizationbar}{barrasincronizzazione}
+\setinterfacecommand{synchronize}{sincronizza}
+\setinterfacecommand{tab}{tab}
+\setinterfacecommand{testcolumn}{testcolumn}
+\setinterfacecommand{testpage}{testpage}
+\setinterfacecommand{tex}{tex}
+\setinterfacecommand{textheight}{altezzatesto}
+\setinterfacecommand{textreference}{riferimentotesto}
+\setinterfacecommand{textrule}{lineatesto}
+\setinterfacecommand{textvariable}{variabiletesto}
+\setinterfacecommand{textwidth}{ampiezzatesto}
+\setinterfacecommand{thinrule}{lineasottile}
+\setinterfacecommand{thinrules}{lineesottili}
+\setinterfacecommand{tooltip}{tooltip}
+\setinterfacecommand{topdistance}{distanzacima}
+\setinterfacecommand{topheight}{altezzacima}
+\setinterfacecommand{topspace}{spaziocima}
+\setinterfacecommand{totalnumberofpages}{numerototaledipagine}
+\setinterfacecommand{translate}{traduci}
+\setinterfacecommand{txt}{txt}
+\setinterfacecommand{typ}{typ}
+\setinterfacecommand{type}{type}
+\setinterfacecommand{typebuffer}{typebuffer}
+\setinterfacecommand{typefile}{typefile}
+\setinterfacecommand{underbar}{sottolinea}
+\setinterfacecommand{underbars}{sottolinee}
+\setinterfacecommand{unitmeaning}{nomeunita}
+\setinterfacecommand{unknown}{ignoto}
+\setinterfacecommand{useJSscripts}{usaJSscripts}
+\setinterfacecommand{useURL}{usaURL}
+\setinterfacecommand{useXMLfilter}{useXMLfilter}
+\setinterfacecommand{useblocks}{usablocco}
+\setinterfacecommand{usecommands}{usacomandi}
+\setinterfacecommand{useencoding}{usacodifica}
+\setinterfacecommand{useexternaldocument}{usadocumentoesterno}
+\setinterfacecommand{useexternalfigure}{usafiguraesterna}
+\setinterfacecommand{useexternalfile}{usafileesterno}
+\setinterfacecommand{useexternalfiles}{usafileesterni}
+\setinterfacecommand{useexternalsoundtrack}{usacolonnasonoraesterna}
+\setinterfacecommand{usemodule}{usamodulo}
+\setinterfacecommand{usemodules}{usamoduli}
+\setinterfacecommand{usepath}{usacartella}
+\setinterfacecommand{usereferences}{usariferimenti}
+\setinterfacecommand{usespecials}{usaspecialita}
+\setinterfacecommand{usesymbols}{usasimboli}
+\setinterfacecommand{usetypescript}{usetypescript}
+\setinterfacecommand{usetypescriptfile}{usetypescriptfile}
+\setinterfacecommand{useurl}{usaurl}
+\setinterfacecommand{version}{versione}
+\setinterfacecommand{vl}{vl}
+\setinterfacecommand{weekday}{giornosettimana}
+\setinterfacecommand{whitespace}{spaziobianco}
+\setinterfacecommand{wordright}{paroladestra}
+\setinterfacecommand{writebetweenlist}{scrividentroelenco}
+\setinterfacecommand{writetolist}{scriviinelenco}
+\setinterfacecommand{writetoreferencelist}{scriviinlistariferimenti}
+\setinterfacecommand{writetoregister}{scriviinregistro}
+%
+\endinput
\ No newline at end of file
diff --git a/tex/context/base/mult-nl.tex b/tex/context/base/mult-nl.tex
new file mode 100644
index 000000000..827b8fd80
--- /dev/null
+++ b/tex/context/base/mult-nl.tex
@@ -0,0 +1,1576 @@
+% this file is auto-generated, don't edit this file
+%
+% definitions for interface variables for language nl
+%
+\setinterfacevariable{Addition}{Toevoeging}
+\setinterfacevariable{Balloon}{Ballon}
+\setinterfacevariable{Character}{Letter}
+\setinterfacevariable{Characters}{Letters}
+\setinterfacevariable{CloseDocument}{SluitDocument}
+\setinterfacevariable{ExitViewer}{VerlaatViewer}
+\setinterfacevariable{FirstPage}{EerstePagina}
+\setinterfacevariable{FitHeight}{HoogtePassend}
+\setinterfacevariable{FitWidth}{BreedtePassend}
+\setinterfacevariable{GotoPage}{GaNaarPagina}
+\setinterfacevariable{Greek}{Grieks}
+\setinterfacevariable{Help}{Help}
+\setinterfacevariable{HideField}{VerbergVeld}
+\setinterfacevariable{HideLayer}{VerbergLaag}
+\setinterfacevariable{Key}{Sleutel}
+\setinterfacevariable{LastPage}{LaatstePagina}
+\setinterfacevariable{LoadForm}{LaadFormulier}
+\setinterfacevariable{MONTH}{MAAND}
+\setinterfacevariable{New}{Nieuw}
+\setinterfacevariable{NextJump}{VolgendeSprong}
+\setinterfacevariable{NextPage}{VolgendePagina}
+\setinterfacevariable{Numbers}{Cijfers}
+\setinterfacevariable{OpenNamedDocument}{OpenDocumentOpNaam}
+\setinterfacevariable{Paragraph}{Paragraaf}
+\setinterfacevariable{PauseMovie}{PauzeerFilm}
+\setinterfacevariable{PauseRendering}{PauzeerRendering}
+\setinterfacevariable{PauseSound}{PauzeerGeluid}
+\setinterfacevariable{PreviousJump}{VorigeSprong}
+\setinterfacevariable{PreviousPage}{VorigePagina}
+\setinterfacevariable{PrintDocument}{PrintDocument}
+\setinterfacevariable{Query}{RaadpleegDocument}
+\setinterfacevariable{QueryAgain}{HerhaalRaadplegen}
+\setinterfacevariable{ResetForm}{ResetFormulier}
+\setinterfacevariable{ResumeMovie}{HervatFilm}
+\setinterfacevariable{ResumeRendering}{HervatRendering}
+\setinterfacevariable{ResumeSound}{HervatGeluid}
+\setinterfacevariable{Romannumerals}{Romeins}
+\setinterfacevariable{SaveDocument}{BewaarDocument}
+\setinterfacevariable{SaveForm}{BewaarFormulier}
+\setinterfacevariable{SaveNamedDocument}{BewaarDocumentOpNaam}
+\setinterfacevariable{SearchAgain}{HerhaalZoeken}
+\setinterfacevariable{SearchDocument}{DoorzoekDocument}
+\setinterfacevariable{ShowBookmarks}{ShowBookmarks}
+\setinterfacevariable{ShowField}{ToonVeld}
+\setinterfacevariable{ShowThumbs}{ShowThumbs}
+\setinterfacevariable{StartMovie}{StartFilm}
+\setinterfacevariable{StartRendering}{StartRendering}
+\setinterfacevariable{StartSound}{StartGeluid}
+\setinterfacevariable{StopMovie}{StopFilm}
+\setinterfacevariable{StopRendering}{StopRendering}
+\setinterfacevariable{StopSound}{StopGeluid}
+\setinterfacevariable{SubmitForm}{VerzendFormulier}
+\setinterfacevariable{ToggleLayer}{WisselLaag}
+\setinterfacevariable{ToggleViewer}{WisselViewer}
+\setinterfacevariable{URL}{URL}
+\setinterfacevariable{VideLayer}{ToonLaag}
+\setinterfacevariable{ViewerHelp}{ViewerHelp}
+\setinterfacevariable{WEEKDAY}{WEEKDAG}
+\setinterfacevariable{WORD}{WOORD}
+\setinterfacevariable{abbreviation}{afkorting}
+\setinterfacevariable{abbreviations}{afkortingen}
+\setinterfacevariable{absolute}{absoluut}
+\setinterfacevariable{action}{actie}
+\setinterfacevariable{after}{na}
+\setinterfacevariable{all}{alles}
+\setinterfacevariable{always}{altijd}
+\setinterfacevariable{appendices}{bijlagen}
+\setinterfacevariable{appendix}{bijlage}
+\setinterfacevariable{april}{april}
+\setinterfacevariable{atmargin}{opmarge}
+\setinterfacevariable{atpage}{oppagina}
+\setinterfacevariable{august}{augustus}
+\setinterfacevariable{auto}{auto}
+\setinterfacevariable{autointro}{autointro}
+\setinterfacevariable{back}{terug}
+\setinterfacevariable{background}{achtergrond}
+\setinterfacevariable{backmatter}{uitleidingen}
+\setinterfacevariable{backpart}{uitleiding}
+\setinterfacevariable{backspace}{rugwit}
+\setinterfacevariable{backward}{achteruit}
+\setinterfacevariable{before}{voor}
+\setinterfacevariable{big}{groot}
+\setinterfacevariable{bigbodyfont}{grootkorps}
+\setinterfacevariable{bigpreference}{grotevoorkeur}
+\setinterfacevariable{blank}{blanko}
+\setinterfacevariable{blockquote}{blokcitaat}
+\setinterfacevariable{bodymatter}{hoofdteksten}
+\setinterfacevariable{bodypart}{hoofdtekst}
+\setinterfacevariable{bold}{vet}
+\setinterfacevariable{bolditalic}{vetitalic}
+\setinterfacevariable{boldslanted}{vetschuin}
+\setinterfacevariable{bookmark}{bookmark}
+\setinterfacevariable{both}{beide}
+\setinterfacevariable{bottom}{onder}
+\setinterfacevariable{brief}{brief}
+\setinterfacevariable{broad}{ruim}
+\setinterfacevariable{buffer}{buffer}
+\setinterfacevariable{by}{per}
+\setinterfacevariable{calligraphic}{calligrafie}
+\setinterfacevariable{cap}{kap}
+\setinterfacevariable{capital}{kapitaal}
+\setinterfacevariable{center}{centreer}
+\setinterfacevariable{chapter}{hoofdstuk}
+\setinterfacevariable{character}{letter}
+\setinterfacevariable{characters}{letters}
+\setinterfacevariable{color}{kleur}
+\setinterfacevariable{column}{kolom}
+\setinterfacevariable{columns}{kolommen}
+\setinterfacevariable{command}{commando}
+\setinterfacevariable{commands}{commandos}
+\setinterfacevariable{comment}{commentaar}
+\setinterfacevariable{component}{onderdeel}
+\setinterfacevariable{concept}{concept}
+\setinterfacevariable{content}{inhoud}
+\setinterfacevariable{contents}{inhouden}
+\setinterfacevariable{continue}{verder}
+\setinterfacevariable{controls}{sturing}
+\setinterfacevariable{conversion}{conversie}
+\setinterfacevariable{current}{huidige}
+\setinterfacevariable{cutspace}{snijwit}
+\setinterfacevariable{date}{datum}
+\setinterfacevariable{day}{dag}
+\setinterfacevariable{december}{december}
+\setinterfacevariable{default}{default}
+\setinterfacevariable{depth}{diepte}
+\setinterfacevariable{description}{doordefinitie}
+\setinterfacevariable{disable}{blokkeer}
+\setinterfacevariable{display}{scherm}
+\setinterfacevariable{dot}{punt}
+\setinterfacevariable{doublesided}{dubbelzijdig}
+\setinterfacevariable{each}{elk}
+\setinterfacevariable{edge}{rand}
+\setinterfacevariable{empty}{leeg}
+\setinterfacevariable{endnote}{eindnoot}
+\setinterfacevariable{enumeration}{doornummering}
+\setinterfacevariable{environment}{omgeving}
+\setinterfacevariable{even}{even}
+\setinterfacevariable{external}{extern}
+\setinterfacevariable{fact}{gegeven}
+\setinterfacevariable{february}{februari}
+\setinterfacevariable{figure}{figuur}
+\setinterfacevariable{figures}{figuren}
+\setinterfacevariable{file}{file}
+\setinterfacevariable{final}{definitief}
+\setinterfacevariable{first}{eerste}
+\setinterfacevariable{firstcolumn}{eerstekolom}
+\setinterfacevariable{firstpage}{eerstepagina}
+\setinterfacevariable{firstsubpage}{eerstesubpagina}
+\setinterfacevariable{fit}{passend}
+\setinterfacevariable{five}{vijf}
+\setinterfacevariable{fix}{herstel}
+\setinterfacevariable{fixed}{vast}
+\setinterfacevariable{flexible}{flexibel}
+\setinterfacevariable{float}{blok}
+\setinterfacevariable{flushinner}{lijnbinnen}
+\setinterfacevariable{flushleft}{lijnlinks}
+\setinterfacevariable{flushouter}{lijnbuiten}
+\setinterfacevariable{flushright}{lijnrechts}
+\setinterfacevariable{footer}{voet}
+\setinterfacevariable{footnote}{voetnoot}
+\setinterfacevariable{force}{forceer}
+\setinterfacevariable{foreground}{voorgrond}
+\setinterfacevariable{formeel}{formeel}
+\setinterfacevariable{formula}{formule}
+\setinterfacevariable{formulae}{formules}
+\setinterfacevariable{forward}{vooruit}
+\setinterfacevariable{four}{vier}
+\setinterfacevariable{frame}{kader}
+\setinterfacevariable{framedtext}{kadertekst}
+\setinterfacevariable{friday}{vrijdag}
+\setinterfacevariable{frontmatter}{inleidingen}
+\setinterfacevariable{frontpart}{inleiding}
+\setinterfacevariable{global}{globaal}
+\setinterfacevariable{graphic}{grafiek}
+\setinterfacevariable{graphics}{grafieken}
+\setinterfacevariable{gray}{grijs}
+\setinterfacevariable{greek}{grieks}
+\setinterfacevariable{grid}{grid}
+\setinterfacevariable{halfline}{halveregel}
+\setinterfacevariable{handwritten}{handschrift}
+\setinterfacevariable{hang}{hang}
+\setinterfacevariable{hanging}{hangend}
+\setinterfacevariable{head}{kop}
+\setinterfacevariable{header}{hoofd}
+\setinterfacevariable{height}{hoogte}
+\setinterfacevariable{helptext}{helptekst}
+\setinterfacevariable{hencefore}{hierboven}
+\setinterfacevariable{here}{hier}
+\setinterfacevariable{hereafter}{hieronder}
+\setinterfacevariable{hidden}{verborgen}
+\setinterfacevariable{hiding}{verbergen}
+\setinterfacevariable{high}{hoog}
+\setinterfacevariable{horizontal}{horizontaal}
+\setinterfacevariable{hyphenated}{afgebroken}
+\setinterfacevariable{hz}{hz}
+\setinterfacevariable{inbetween}{tussen}
+\setinterfacevariable{index}{index}
+\setinterfacevariable{indices}{indices}
+\setinterfacevariable{informeel}{informeel}
+\setinterfacevariable{inherit}{erf}
+\setinterfacevariable{inleft}{inlinker}
+\setinterfacevariable{inmargin}{inmarge}
+\setinterfacevariable{inner}{binnen}
+\setinterfacevariable{inneredge}{binnenrand}
+\setinterfacevariable{innermargin}{binnenmarge}
+\setinterfacevariable{inright}{inrechter}
+\setinterfacevariable{interaction}{interactie}
+\setinterfacevariable{interactionmenu}{interactiemenu}
+\setinterfacevariable{intermezzi}{intermezzos}
+\setinterfacevariable{intermezzo}{intermezzo}
+\setinterfacevariable{intext}{intekst}
+\setinterfacevariable{intro}{intro}
+\setinterfacevariable{italic}{italic}
+\setinterfacevariable{italicbold}{italicvet}
+\setinterfacevariable{item}{som}
+\setinterfacevariable{itemize}{opsomming}
+\setinterfacevariable{its}{its}
+\setinterfacevariable{january}{januari}
+\setinterfacevariable{joinedup}{aansluitend}
+\setinterfacevariable{july}{juli}
+\setinterfacevariable{june}{juni}
+\setinterfacevariable{keep}{handhaaf}
+\setinterfacevariable{knockout}{knockout}
+\setinterfacevariable{label}{label}
+\setinterfacevariable{landscape}{liggend}
+\setinterfacevariable{last}{laatste}
+\setinterfacevariable{lastcolumn}{laatstekolom}
+\setinterfacevariable{lastpage}{laatstepagina}
+\setinterfacevariable{lastpagenumber}{laatstepaginanummer}
+\setinterfacevariable{lastsubpage}{laatstesubpagina}
+\setinterfacevariable{left}{links}
+\setinterfacevariable{leftedge}{linkerrand}
+\setinterfacevariable{lefthanging}{linkshangend}
+\setinterfacevariable{leftmargin}{linkermarge}
+\setinterfacevariable{leftpage}{linkerpagina}
+\setinterfacevariable{legend}{legenda}
+\setinterfacevariable{lesshyphenation}{lesshyphenation}
+\setinterfacevariable{line}{regel}
+\setinterfacevariable{linenote}{regelnoot}
+\setinterfacevariable{lines}{regels}
+\setinterfacevariable{list}{lijst}
+\setinterfacevariable{local}{lokaal}
+\setinterfacevariable{localenvironment}{deelomgeving}
+\setinterfacevariable{logo}{logo}
+\setinterfacevariable{logos}{logos}
+\setinterfacevariable{lohi}{laho}
+\setinterfacevariable{loose}{los}
+\setinterfacevariable{low}{laag}
+\setinterfacevariable{ls}{ls}
+\setinterfacevariable{makeup}{opmaak}
+\setinterfacevariable{mar}{mar}
+\setinterfacevariable{march}{maart}
+\setinterfacevariable{margin}{marge}
+\setinterfacevariable{marginedge}{kantlijn}
+\setinterfacevariable{margintitle}{margetitel}
+\setinterfacevariable{marking}{markering}
+\setinterfacevariable{mathalignment}{wiskundeuitlijnen}
+\setinterfacevariable{mathcases}{mathcases}
+\setinterfacevariable{mathmatrix}{wiskundematrix}
+\setinterfacevariable{max}{max}
+\setinterfacevariable{may}{mei}
+\setinterfacevariable{mediaeval}{mediaeval}
+\setinterfacevariable{medium}{middel}
+\setinterfacevariable{middle}{midden}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{minheight}{minhoogte}
+\setinterfacevariable{minwidth}{minbreedte}
+\setinterfacevariable{mirrored}{gespiegeld}
+\setinterfacevariable{monday}{maandag}
+\setinterfacevariable{mono}{mono}
+\setinterfacevariable{month}{maand}
+\setinterfacevariable{morehyphenation}{morehyphenation}
+\setinterfacevariable{name}{naam}
+\setinterfacevariable{narrow}{smal}
+\setinterfacevariable{negative}{negatief}
+\setinterfacevariable{never}{nooit}
+\setinterfacevariable{new}{nieuw}
+\setinterfacevariable{next}{volgende}
+\setinterfacevariable{nextevenpage}{volgendeevenpagina}
+\setinterfacevariable{nextoddpage}{volgendeonevenpagina}
+\setinterfacevariable{nextpage}{volgendepagina}
+\setinterfacevariable{nextsubpage}{volgendesubpagina}
+\setinterfacevariable{no}{nee}
+\setinterfacevariable{nocheck}{geencontrole}
+\setinterfacevariable{nofit}{nietpassend}
+\setinterfacevariable{nogrid}{geengrid}
+\setinterfacevariable{nohz}{geenhz}
+\setinterfacevariable{nomarking}{geenmarkering}
+\setinterfacevariable{none}{geen}
+\setinterfacevariable{nonumber}{geennummer}
+\setinterfacevariable{normal}{normaal}
+\setinterfacevariable{nospacing}{geenspatiering}
+\setinterfacevariable{not}{niet}
+\setinterfacevariable{nothanging}{niethangend}
+\setinterfacevariable{nothyphenated}{nietafgebroken}
+\setinterfacevariable{november}{november}
+\setinterfacevariable{nowhere}{nergens}
+\setinterfacevariable{nowhite}{geenwit}
+\setinterfacevariable{number}{nummer}
+\setinterfacevariable{numbers}{cijfers}
+\setinterfacevariable{october}{oktober}
+\setinterfacevariable{odd}{oneven}
+\setinterfacevariable{off}{uit}
+\setinterfacevariable{offset}{offset}
+\setinterfacevariable{old}{oud}
+\setinterfacevariable{on}{aan}
+\setinterfacevariable{one}{een}
+\setinterfacevariable{opposite}{naast}
+\setinterfacevariable{outer}{buiten}
+\setinterfacevariable{outeredge}{buitenrand}
+\setinterfacevariable{outermargin}{buitenmarge}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{packed}{opelkaar}
+\setinterfacevariable{page}{pagina}
+\setinterfacevariable{pagecomment}{paginacommentaar}
+\setinterfacevariable{pagenumber}{paginanummer}
+\setinterfacevariable{paper}{papier}
+\setinterfacevariable{paragraph}{alinea}
+\setinterfacevariable{part}{deel}
+\setinterfacevariable{positive}{positief}
+\setinterfacevariable{postponing}{uitstellen}
+\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{preference}{voorkeur}
+\setinterfacevariable{preview}{preview}
+\setinterfacevariable{previous}{vorige}
+\setinterfacevariable{previousevenpage}{vorigeevenpagina}
+\setinterfacevariable{previousoddpage}{vorigeonevenpagina}
+\setinterfacevariable{previouspage}{vorigepagina}
+\setinterfacevariable{previoussubpage}{vorigesubpagina}
+\setinterfacevariable{printable}{printbaar}
+\setinterfacevariable{process}{proces}
+\setinterfacevariable{product}{produkt}
+\setinterfacevariable{program}{programma}
+\setinterfacevariable{project}{project}
+\setinterfacevariable{protected}{beschermd}
+\setinterfacevariable{quadruple}{viertal}
+\setinterfacevariable{quotation}{citaat}
+\setinterfacevariable{quote}{citeer}
+\setinterfacevariable{ran}{ran}
+\setinterfacevariable{random}{willekeurig}
+\setinterfacevariable{readonly}{alleenleesbaar}
+\setinterfacevariable{rectangular}{recht}
+\setinterfacevariable{referral}{kenmerk}
+\setinterfacevariable{register}{register}
+\setinterfacevariable{regular}{regular}
+\setinterfacevariable{rekening}{rekening}
+\setinterfacevariable{relative}{relatief}
+\setinterfacevariable{repeat}{herhaal}
+\setinterfacevariable{required}{verplicht}
+\setinterfacevariable{reset}{reset}
+\setinterfacevariable{reverse}{omgekeerd}
+\setinterfacevariable{right}{rechts}
+\setinterfacevariable{rightedge}{rechterrand}
+\setinterfacevariable{righthanging}{rechtshangend}
+\setinterfacevariable{rightmargin}{rechtermarge}
+\setinterfacevariable{rightpage}{rechterpagina}
+\setinterfacevariable{roman}{romaan}
+\setinterfacevariable{romannumerals}{romeins}
+\setinterfacevariable{rotate}{roteer}
+\setinterfacevariable{rotated}{geroteerd}
+\setinterfacevariable{round}{rond}
+\setinterfacevariable{row}{rij}
+\setinterfacevariable{rule}{lijn}
+\setinterfacevariable{samepage}{zelfdepagina}
+\setinterfacevariable{sans}{sans}
+\setinterfacevariable{sansbold}{sansvet}
+\setinterfacevariable{sansserif}{schreefloos}
+\setinterfacevariable{saturday}{zaterdag}
+\setinterfacevariable{screen}{raster}
+\setinterfacevariable{section}{paragraaf}
+\setinterfacevariable{sectionblockenvironment}{sectieblokomgeving}
+\setinterfacevariable{sectionnumber}{sectienummer}
+\setinterfacevariable{see}{zie}
+\setinterfacevariable{september}{september}
+\setinterfacevariable{serif}{serif}
+\setinterfacevariable{serried}{aanelkaar}
+\setinterfacevariable{setups}{instellingen}
+\setinterfacevariable{sheet}{sheet}
+\setinterfacevariable{singlesided}{enkelzijdig}
+\setinterfacevariable{slanted}{schuin}
+\setinterfacevariable{slantedbold}{schuinvet}
+\setinterfacevariable{small}{klein}
+\setinterfacevariable{smallbodyfont}{kleinkorps}
+\setinterfacevariable{smallbold}{kleinvet}
+\setinterfacevariable{smallbolditalic}{kleinvetitalic}
+\setinterfacevariable{smallboldslanted}{kleinvetschuin}
+\setinterfacevariable{smallcaps}{smallcaps}
+\setinterfacevariable{smallitalic}{kleinitalic}
+\setinterfacevariable{smallitalicbold}{kleinitalicvet}
+\setinterfacevariable{smallnormal}{kleinnormaal}
+\setinterfacevariable{smallslanted}{kleinschuin}
+\setinterfacevariable{smallslantedbold}{kleinschuinvet}
+\setinterfacevariable{smalltype}{kleintype}
+\setinterfacevariable{somewhere}{ergens}
+\setinterfacevariable{sorted}{gesorteerd}
+\setinterfacevariable{space}{spatie}
+\setinterfacevariable{spacing}{spatiering}
+\setinterfacevariable{speech}{spraak}
+\setinterfacevariable{split}{splitsen}
+\setinterfacevariable{spot}{spot}
+\setinterfacevariable{standard}{standaard}
+\setinterfacevariable{start}{start}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{stop}
+\setinterfacevariable{stopper}{afsluiter}
+\setinterfacevariable{stretch}{rek}
+\setinterfacevariable{strict}{streng}
+\setinterfacevariable{strong}{strong}
+\setinterfacevariable{strut}{strut}
+\setinterfacevariable{sub}{sub}
+\setinterfacevariable{subbackward}{subachteruit}
+\setinterfacevariable{subformula}{subformule}
+\setinterfacevariable{subforward}{subvooruit}
+\setinterfacevariable{subject}{onderwerp}
+\setinterfacevariable{subpage}{subpagina}
+\setinterfacevariable{subsection}{subparagraaf}
+\setinterfacevariable{subsubject}{subonderwerp}
+\setinterfacevariable{subsubsection}{subsubparagraaf}
+\setinterfacevariable{subsubsubject}{subsubonderwerp}
+\setinterfacevariable{subsubsubsection}{subsubsubparagraaf}
+\setinterfacevariable{subsubsubsubject}{subsubsubonderwerp}
+\setinterfacevariable{subsubsubsubsection}{subsubsubsubparagraaf}
+\setinterfacevariable{subsubsubsubsubject}{subsubsubsubonderwerp}
+\setinterfacevariable{subsubsubsubsubsection}{subsubsubsubsubparagraaf}
+\setinterfacevariable{subsubsubsubsubsubject}{subsubsubsubsubonderwerp}
+\setinterfacevariable{sunday}{zondag}
+\setinterfacevariable{support}{support}
+\setinterfacevariable{sym}{sym}
+\setinterfacevariable{symbol}{symbool}
+\setinterfacevariable{synchronize}{synchroniseer}
+\setinterfacevariable{system}{systeem}
+\setinterfacevariable{table}{tabel}
+\setinterfacevariable{tablehead}{tabelkop}
+\setinterfacevariable{tables}{tabellen}
+\setinterfacevariable{tabletail}{tabelstaart}
+\setinterfacevariable{tabulate}{tabulatie}
+\setinterfacevariable{tabulatehead}{tabulatiekop}
+\setinterfacevariable{tabulatetail}{tabulatiestaart}
+\setinterfacevariable{tall}{lang}
+\setinterfacevariable{teletype}{teletype}
+\setinterfacevariable{temporary}{voorlopig}
+\setinterfacevariable{test}{test}
+\setinterfacevariable{text}{tekst}
+\setinterfacevariable{three}{drie}
+\setinterfacevariable{thursday}{donderdag}
+\setinterfacevariable{title}{titel}
+\setinterfacevariable{toggle}{toggle}
+\setinterfacevariable{tolerant}{soepel}
+\setinterfacevariable{top}{boven}
+\setinterfacevariable{tuesday}{dinsdag}
+\setinterfacevariable{two}{twee}
+\setinterfacevariable{txt}{txt}
+\setinterfacevariable{type}{type}
+\setinterfacevariable{typing}{typen}
+\setinterfacevariable{unavailable}{nietbeschikbaar}
+\setinterfacevariable{unit}{eenheid}
+\setinterfacevariable{units}{eenheden}
+\setinterfacevariable{unknown}{onbekend}
+\setinterfacevariable{unpacked}{vanelkaar}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{gebruikt}
+\setinterfacevariable{value}{waarde}
+\setinterfacevariable{vertical}{vertikaal}
+\setinterfacevariable{very}{zeer}
+\setinterfacevariable{verystrict}{zeerstreng}
+\setinterfacevariable{verytolerant}{zeersoepel}
+\setinterfacevariable{weak}{weak}
+\setinterfacevariable{wednesday}{woensdag}
+\setinterfacevariable{week}{week}
+\setinterfacevariable{weekday}{weekdag}
+\setinterfacevariable{white}{wit}
+\setinterfacevariable{wide}{breed}
+\setinterfacevariable{width}{breedte}
+\setinterfacevariable{xml}{xml}
+\setinterfacevariable{year}{jaar}
+\setinterfacevariable{yes}{ja}
+% definitions for interface constants for language nl
+%
+\setinterfaceconstant{action}{actie}
+\setinterfaceconstant{address}{adres}
+\setinterfaceconstant{after}{na}
+\setinterfaceconstant{afterhead}{kopna}
+\setinterfaceconstant{afterkey}{natoets}
+\setinterfaceconstant{align}{uitlijnen}
+\setinterfaceconstant{aligncharacter}{karakteruitlijnen}
+\setinterfaceconstant{alignmentcharacter}{uitlijnkarakter}
+\setinterfaceconstant{aligntitle}{titeluitlijnen}
+\setinterfaceconstant{alternative}{variant}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{pijl}
+\setinterfaceconstant{at}{op}
+\setinterfaceconstant{author}{auteur}
+\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autofile}{autofile}
+\setinterfaceconstant{autofocus}{autofocus}
+\setinterfaceconstant{autohang}{autohang}
+\setinterfaceconstant{autostrut}{autostrut}
+\setinterfaceconstant{autowidth}{autobreedte}
+\setinterfaceconstant{axis}{assenstelsel}
+\setinterfaceconstant{background}{achtergrond}
+\setinterfaceconstant{backgroundcolor}{achtergrondkleur}
+\setinterfaceconstant{backgroundcorner}{achtergrondhoek}
+\setinterfaceconstant{backgrounddepth}{achtergronddiepte}
+\setinterfaceconstant{backgroundoffset}{achtergrondoffset}
+\setinterfaceconstant{backgroundradius}{achtergrondstraal}
+\setinterfaceconstant{backgroundscreen}{achtergrondraster}
+\setinterfaceconstant{backspace}{rugwit}
+\setinterfaceconstant{balance}{balanceren}
+\setinterfaceconstant{before}{voor}
+\setinterfaceconstant{beforehead}{kopvoor}
+\setinterfaceconstant{bet}{bet}
+\setinterfaceconstant{big}{groot}
+\setinterfaceconstant{blank}{blanko}
+\setinterfaceconstant{blockway}{blokwijze}
+\setinterfaceconstant{bodyfont}{korps}
+\setinterfaceconstant{bookmark}{bookmark}
+\setinterfaceconstant{bottom}{onder}
+\setinterfaceconstant{bottomdistance}{onderafstand}
+\setinterfaceconstant{bottomframe}{onderkader}
+\setinterfaceconstant{bottomoffset}{onderoffset}
+\setinterfaceconstant{bottomspace}{bodemwit}
+\setinterfaceconstant{bottomstate}{onderstatus}
+\setinterfaceconstant{cache}{cache}
+\setinterfaceconstant{calculate}{bereken}
+\setinterfaceconstant{ccommand}{ccommando}
+\setinterfaceconstant{click}{klik}
+\setinterfaceconstant{clickin}{klikin}
+\setinterfaceconstant{clickout}{klikuit}
+\setinterfaceconstant{clipoffset}{clipoffset}
+\setinterfaceconstant{closeaction}{sluitactie}
+\setinterfaceconstant{closecommand}{sluitcommando}
+\setinterfaceconstant{closepageaction}{sluitpaginaactie}
+\setinterfaceconstant{closesymbol}{sluitsymbool}
+\setinterfaceconstant{color}{kleur}
+\setinterfaceconstant{column}{kolom}
+\setinterfaceconstant{columndistance}{kolomafstand}
+\setinterfaceconstant{columns}{kolommen}
+\setinterfaceconstant{command}{commando}
+\setinterfaceconstant{commandafter}{nacommando}
+\setinterfaceconstant{commandbefore}{voorcommando}
+\setinterfaceconstant{commands}{commandos}
+\setinterfaceconstant{component}{component}
+\setinterfaceconstant{compoundhyphen}{koppelteken}
+\setinterfaceconstant{compress}{comprimeren}
+\setinterfaceconstant{continue}{doorgaan}
+\setinterfaceconstant{contrastcolor}{contrastkleur}
+\setinterfaceconstant{controls}{sturing}
+\setinterfaceconstant{conversion}{conversie}
+\setinterfaceconstant{convertfile}{converteerfile}
+\setinterfaceconstant{corner}{hoek}
+\setinterfaceconstant{coupling}{koppeling}
+\setinterfaceconstant{couplingway}{koppelwijze}
+\setinterfaceconstant{criterium}{criterium}
+\setinterfaceconstant{current}{huidige}
+\setinterfaceconstant{cutspace}{snijwit}
+\setinterfaceconstant{dash}{streep}
+\setinterfaceconstant{dat}{dat}
+\setinterfaceconstant{date}{datum}
+\setinterfaceconstant{deepnumbercommand}{diepnummercommando}
+\setinterfaceconstant{deeptextcommand}{dieptekstcommando}
+\setinterfaceconstant{default}{default}
+\setinterfaceconstant{delay}{wachttijd}
+\setinterfaceconstant{depth}{diepte}
+\setinterfaceconstant{depthcorrection}{dieptecorrectie}
+\setinterfaceconstant{direction}{richting}
+\setinterfaceconstant{directory}{gebied}
+\setinterfaceconstant{display}{scherm}
+\setinterfaceconstant{distance}{afstand}
+\setinterfaceconstant{dot}{punt}
+\setinterfaceconstant{doublesided}{dubbelzijdig}
+\setinterfaceconstant{dummy}{dummy}
+\setinterfaceconstant{dx}{dx}
+\setinterfaceconstant{dy}{dy}
+\setinterfaceconstant{edge}{rand}
+\setinterfaceconstant{edgedistance}{randafstand}
+\setinterfaceconstant{empty}{leeg}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{evenmarge}
+\setinterfaceconstant{expansion}{expansie}
+\setinterfaceconstant{extras}{extras}
+\setinterfaceconstant{factor}{factor}
+\setinterfaceconstant{fallback}{terugval}
+\setinterfaceconstant{family}{soort}
+\setinterfaceconstant{fieldbackgroundcolor}{veldachtergrondkleur}
+\setinterfaceconstant{fieldframecolor}{veldkaderkleur}
+\setinterfaceconstant{fieldlayer}{veldlaag}
+\setinterfaceconstant{fieldoffset}{veldoffset}
+\setinterfaceconstant{file}{file}
+\setinterfaceconstant{focus}{focus}
+\setinterfaceconstant{focusin}{focusin}
+\setinterfaceconstant{focusout}{focusuit}
+\setinterfaceconstant{footer}{voet}
+\setinterfaceconstant{footerdistance}{voetafstand}
+\setinterfaceconstant{footerstate}{voetstatus}
+\setinterfaceconstant{foregroundcolor}{voorgrondkleur}
+\setinterfaceconstant{foregroundstyle}{voorgrondletter}
+\setinterfaceconstant{format}{formatteer}
+\setinterfaceconstant{frame}{kader}
+\setinterfaceconstant{framecolor}{kaderkleur}
+\setinterfaceconstant{framecorner}{kaderhoek}
+\setinterfaceconstant{framedepth}{kaderdiepte}
+\setinterfaceconstant{frameoffset}{kaderoffset}
+\setinterfaceconstant{frameradius}{kaderstraal}
+\setinterfaceconstant{frames}{hokjes}
+\setinterfaceconstant{from}{van}
+\setinterfaceconstant{get}{haal}
+\setinterfaceconstant{global}{globaal}
+\setinterfaceconstant{grid}{grid}
+\setinterfaceconstant{hang}{hang}
+\setinterfaceconstant{headcolor}{kopkleur}
+\setinterfaceconstant{headcommand}{kopcommando}
+\setinterfaceconstant{headconversion}{kopconversie}
+\setinterfaceconstant{header}{hoofd}
+\setinterfaceconstant{headerdistance}{hoofdafstand}
+\setinterfaceconstant{headerstate}{hoofdstatus}
+\setinterfaceconstant{headlabel}{koplabel}
+\setinterfaceconstant{headnumber}{kopnummer}
+\setinterfaceconstant{headstyle}{kopletter}
+\setinterfaceconstant{height}{hoogte}
+\setinterfaceconstant{hfactor}{hfactor}
+\setinterfaceconstant{hfil}{hfil}
+\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horoffset}{rugoffset}
+\setinterfaceconstant{hyphen}{hyphen}
+\setinterfaceconstant{icommand}{icommando}
+\setinterfaceconstant{in}{in}
+\setinterfaceconstant{inbetween}{tussen}
+\setinterfaceconstant{increment}{verhoog}
+\setinterfaceconstant{incrementnumber}{verhoognummer}
+\setinterfaceconstant{indenting}{inspringen}
+\setinterfaceconstant{indentnext}{springvolgendein}
+\setinterfaceconstant{indicator}{aanduiding}
+\setinterfaceconstant{inner}{binnen}
+\setinterfaceconstant{innermargin}{binnenmarge}
+\setinterfaceconstant{inputfile}{inputfile}
+\setinterfaceconstant{interaction}{interactie}
+\setinterfaceconstant{interlinespace}{interlinie}
+\setinterfaceconstant{itemalign}{itemuitlijnen}
+\setinterfaceconstant{items}{items}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{sleutelexpansie}
+\setinterfaceconstant{keyword}{trefwoord}
+\setinterfaceconstant{label}{label}
+\setinterfaceconstant{left}{links}
+\setinterfaceconstant{leftcolor}{linkerkleur}
+\setinterfaceconstant{leftcompoundhyphen}{linkerkoppelteken}
+\setinterfaceconstant{leftedge}{linkerrand}
+\setinterfaceconstant{leftedgedistance}{linkerrandafstand}
+\setinterfaceconstant{leftframe}{linkerkader}
+\setinterfaceconstant{lefthyphen}{lefthyphen}
+\setinterfaceconstant{leftmargin}{linkermarge}
+\setinterfaceconstant{leftmargindistance}{linkermargeafstand}
+\setinterfaceconstant{leftoffset}{linkeroffset}
+\setinterfaceconstant{leftquotation}{linkercitaat}
+\setinterfaceconstant{leftquote}{linkerciteer}
+\setinterfaceconstant{leftsentence}{linkerzin}
+\setinterfaceconstant{leftspeech}{linkeruitspraak}
+\setinterfaceconstant{leftstyle}{linkerletter}
+\setinterfaceconstant{leftsubsentence}{linkersubzin}
+\setinterfaceconstant{lefttext}{linkertekst}
+\setinterfaceconstant{leftwidth}{linkerbreedte}
+\setinterfaceconstant{level}{niveau}
+\setinterfaceconstant{levels}{niveaus}
+\setinterfaceconstant{limittext}{limiettekst}
+\setinterfaceconstant{line}{regel}
+\setinterfaceconstant{linecorrection}{regelcorrectie}
+\setinterfaceconstant{lines}{regels}
+\setinterfaceconstant{list}{lijst}
+\setinterfaceconstant{listtext}{lijsttekst}
+\setinterfaceconstant{local}{lokaal}
+\setinterfaceconstant{location}{plaats}
+\setinterfaceconstant{logo}{logo}
+\setinterfaceconstant{logos}{logos}
+\setinterfaceconstant{marcolor}{markleur}
+\setinterfaceconstant{margin}{marge}
+\setinterfaceconstant{margindistance}{margeafstand}
+\setinterfaceconstant{marginedge}{kantlijn}
+\setinterfaceconstant{marginedgetext}{kantlijntekst}
+\setinterfaceconstant{margintext}{margetekst}
+\setinterfaceconstant{marking}{markering}
+\setinterfaceconstant{marstyle}{marletter}
+\setinterfaceconstant{max}{max}
+\setinterfaceconstant{maxheight}{maxhoogte}
+\setinterfaceconstant{maxwidth}{maxbreedte}
+\setinterfaceconstant{menu}{menu}
+\setinterfaceconstant{method}{methode}
+\setinterfaceconstant{middle}{midden}
+\setinterfaceconstant{middlespeech}{middenuitspraak}
+\setinterfaceconstant{middletext}{middentekst}
+\setinterfaceconstant{midsentence}{middenzin}
+\setinterfaceconstant{min}{min}
+\setinterfaceconstant{mindepth}{mindiepte}
+\setinterfaceconstant{minheight}{minhoogte}
+\setinterfaceconstant{minwidth}{minbreedte}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{naam}
+\setinterfaceconstant{nbottom}{nonder}
+\setinterfaceconstant{nc}{nc}
+\setinterfaceconstant{next}{volgende}
+\setinterfaceconstant{nl}{nl}
+\setinterfaceconstant{nleft}{nlinks}
+\setinterfaceconstant{nlines}{nregels}
+\setinterfaceconstant{norm}{norm}
+\setinterfaceconstant{nr}{nr}
+\setinterfaceconstant{nright}{nrechts}
+\setinterfaceconstant{ntop}{nboven}
+\setinterfaceconstant{number}{nummer}
+\setinterfaceconstant{numbercolor}{nummerkleur}
+\setinterfaceconstant{numbercommand}{nummercommando}
+\setinterfaceconstant{numberdistance}{nummerafstand}
+\setinterfaceconstant{numbering}{nummeren}
+\setinterfaceconstant{numberseparator}{nummerscheider}
+\setinterfaceconstant{numberstyle}{nummerletter}
+\setinterfaceconstant{numberwidth}{nummerbreedte}
+\setinterfaceconstant{nx}{nx}
+\setinterfaceconstant{ny}{ny}
+\setinterfaceconstant{object}{object}
+\setinterfaceconstant{obstruction}{blokkade}
+\setinterfaceconstant{oddmargin}{onevenmarge}
+\setinterfaceconstant{offset}{offset}
+\setinterfaceconstant{openaction}{openactie}
+\setinterfaceconstant{openpageaction}{openpaginaactie}
+\setinterfaceconstant{option}{optie}
+\setinterfaceconstant{orientation}{orientatie}
+\setinterfaceconstant{outermargin}{buitenmarge}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{eigennummer}
+\setinterfaceconstant{page}{pagina}
+\setinterfaceconstant{pageboundaries}{paginaovergangen}
+\setinterfaceconstant{pagecolor}{paginakleur}
+\setinterfaceconstant{pagecommand}{paginacommando}
+\setinterfaceconstant{pagenumber}{paginanummer}
+\setinterfaceconstant{pagestate}{paginastatus}
+\setinterfaceconstant{pagestyle}{paginaletter}
+\setinterfaceconstant{palet}{palet}
+\setinterfaceconstant{paper}{papier}
+\setinterfaceconstant{paragraph}{alinea}
+\setinterfaceconstant{place}{plaatsen}
+\setinterfaceconstant{placehead}{plaatskop}
+\setinterfaceconstant{placestopper}{plaatsafsluiter}
+\setinterfaceconstant{position}{positie}
+\setinterfaceconstant{prefix}{prefix}
+\setinterfaceconstant{preset}{preset}
+\setinterfaceconstant{preview}{preview}
+\setinterfaceconstant{previous}{vorige}
+\setinterfaceconstant{previousnumber}{vorigenummer}
+\setinterfaceconstant{process}{proces}
+\setinterfaceconstant{radius}{straal}
+\setinterfaceconstant{random}{willekeur}
+\setinterfaceconstant{reduction}{reductie}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{reference}{verwijzing}
+\setinterfaceconstant{referencing}{refereren}
+\setinterfaceconstant{regionin}{gebiedin}
+\setinterfaceconstant{regionout}{gebieduit}
+\setinterfaceconstant{repeat}{herhaal}
+\setinterfaceconstant{reset}{reset}
+\setinterfaceconstant{resetnumber}{resetnummer}
+\setinterfaceconstant{resolution}{resolutie}
+\setinterfaceconstant{right}{rechts}
+\setinterfaceconstant{rightcolor}{rechterkleur}
+\setinterfaceconstant{rightcompoundhyphen}{rechterkoppelteken}
+\setinterfaceconstant{rightedge}{rechterrand}
+\setinterfaceconstant{rightedgedistance}{rechterrandafstand}
+\setinterfaceconstant{rightframe}{rechterkader}
+\setinterfaceconstant{righthyphen}{righthyphen}
+\setinterfaceconstant{rightmargin}{rechtermarge}
+\setinterfaceconstant{rightmargindistance}{rechtermargeafstand}
+\setinterfaceconstant{rightoffset}{rechteroffset}
+\setinterfaceconstant{rightquotation}{rechtercitaat}
+\setinterfaceconstant{rightquote}{rechterciteer}
+\setinterfaceconstant{rightsentence}{rechterzin}
+\setinterfaceconstant{rightspeech}{rechteruitspraak}
+\setinterfaceconstant{rightstyle}{rechterletter}
+\setinterfaceconstant{rightsubsentence}{rechtersubzin}
+\setinterfaceconstant{righttext}{rechtertekst}
+\setinterfaceconstant{rightwidth}{rechterbreedte}
+\setinterfaceconstant{rotation}{rotatie}
+\setinterfaceconstant{rule}{lijn}
+\setinterfaceconstant{rulecolor}{lijnkleur}
+\setinterfaceconstant{rulethickness}{lijndikte}
+\setinterfaceconstant{samepage}{zelfdepagina}
+\setinterfaceconstant{sample}{monster}
+\setinterfaceconstant{scale}{schaal}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{raster}
+\setinterfaceconstant{section}{sectie}
+\setinterfaceconstant{sectionnumber}{sectienummer}
+\setinterfaceconstant{separator}{scheider}
+\setinterfaceconstant{set}{set}
+\setinterfaceconstant{setups}{setups}
+\setinterfaceconstant{side}{zij}
+\setinterfaceconstant{sidealign}{zijuitlijnen}
+\setinterfaceconstant{sidemethod}{zijmethode}
+\setinterfaceconstant{sidespaceafter}{zijnawit}
+\setinterfaceconstant{sidespacebefore}{zijvoorwit}
+\setinterfaceconstant{sign}{teken}
+\setinterfaceconstant{size}{formaat}
+\setinterfaceconstant{small}{klein}
+\setinterfaceconstant{sorttype}{sortering}
+\setinterfaceconstant{source}{bron}
+\setinterfaceconstant{space}{spatie}
+\setinterfaceconstant{spaceafter}{nawit}
+\setinterfaceconstant{spacebefore}{voorwit}
+\setinterfaceconstant{spaceinbetween}{tussenwit}
+\setinterfaceconstant{spacing}{spatiering}
+\setinterfaceconstant{split}{splitsen}
+\setinterfaceconstant{splitcolor}{splitskleur}
+\setinterfaceconstant{splitmethod}{splitsmethode}
+\setinterfaceconstant{splitoffset}{splitsoffset}
+\setinterfaceconstant{spot}{spot}
+\setinterfaceconstant{stack}{stapel}
+\setinterfaceconstant{start}{start}
+\setinterfaceconstant{state}{status}
+\setinterfaceconstant{step}{stap}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{afsluiter}
+\setinterfaceconstant{stretch}{rek}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{letter}
+\setinterfaceconstant{sub}{sub}
+\setinterfaceconstant{subtitle}{subtitel}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{sx}{sx}
+\setinterfaceconstant{sy}{sy}
+\setinterfaceconstant{symalign}{symuitlijnen}
+\setinterfaceconstant{symbol}{symbool}
+\setinterfaceconstant{symbolset}{symboolset}
+\setinterfaceconstant{symcolor}{symkleur}
+\setinterfaceconstant{symstyle}{symletter}
+\setinterfaceconstant{synonym}{synoniem}
+\setinterfaceconstant{synonymcolor}{synoniemkleur}
+\setinterfaceconstant{synonymstyle}{synoniemletter}
+\setinterfaceconstant{tab}{tab}
+\setinterfaceconstant{text}{tekst}
+\setinterfaceconstant{textcolor}{tekstkleur}
+\setinterfaceconstant{textcommand}{tekstcommando}
+\setinterfaceconstant{textdistance}{tekstafstand}
+\setinterfaceconstant{textlayer}{tekstlaag}
+\setinterfaceconstant{textmargin}{tekstmarge}
+\setinterfaceconstant{textmethod}{tekstmethode}
+\setinterfaceconstant{textseparator}{tekstscheider}
+\setinterfaceconstant{textsize}{tekstformaat}
+\setinterfaceconstant{textstate}{tekststatus}
+\setinterfaceconstant{textstyle}{tekstletter}
+\setinterfaceconstant{textwidth}{tekstbreedte}
+\setinterfaceconstant{title}{titel}
+\setinterfaceconstant{titlecolor}{titelkleur}
+\setinterfaceconstant{titlecommand}{titelcommando}
+\setinterfaceconstant{titledistance}{titelafstand}
+\setinterfaceconstant{titleleft}{titellinks}
+\setinterfaceconstant{titleright}{titelrechts}
+\setinterfaceconstant{titlestyle}{titelletter}
+\setinterfaceconstant{to}{aan}
+\setinterfaceconstant{tolerance}{tolerantie}
+\setinterfaceconstant{top}{boven}
+\setinterfaceconstant{topdistance}{bovenafstand}
+\setinterfaceconstant{topframe}{bovenkader}
+\setinterfaceconstant{topoffset}{bovenoffset}
+\setinterfaceconstant{topspace}{kopwit}
+\setinterfaceconstant{topstate}{bovenstatus}
+\setinterfaceconstant{type}{type}
+\setinterfaceconstant{unit}{eenheid}
+\setinterfaceconstant{unknownreference}{onbekendeverwijzing}
+\setinterfaceconstant{urlalternative}{urlvariant}
+\setinterfaceconstant{urlspace}{urlspatie}
+\setinterfaceconstant{validate}{valideer}
+\setinterfaceconstant{vcommand}{vcommando}
+\setinterfaceconstant{veroffset}{kopoffset}
+\setinterfaceconstant{vfil}{vfil}
+\setinterfaceconstant{voffset}{voffset}
+\setinterfaceconstant{way}{wijze}
+\setinterfaceconstant{wfactor}{bfactor}
+\setinterfaceconstant{white}{wit}
+\setinterfaceconstant{width}{breedte}
+\setinterfaceconstant{xfactor}{xfactor}
+\setinterfaceconstant{xmax}{xmax}
+\setinterfaceconstant{xoffset}{xoffset}
+\setinterfaceconstant{xscale}{xschaal}
+\setinterfaceconstant{xstep}{xstap}
+\setinterfaceconstant{yfactor}{yfactor}
+\setinterfaceconstant{ymax}{ymax}
+\setinterfaceconstant{yoffset}{yoffset}
+\setinterfaceconstant{yscale}{yschaal}
+\setinterfaceconstant{ystep}{ystap}
+% definitions for interface elements for language nl
+%
+\setinterfaceelement{begin}{beginvan}
+\setinterfaceelement{complete}{volledige}
+\setinterfaceelement{coupled}{gekoppelde}
+\setinterfaceelement{currentlocal}{huidigelokale}
+\setinterfaceelement{emptyone}{leeg}
+\setinterfaceelement{emptytwo}{lege}
+\setinterfaceelement{end}{eindvan}
+\setinterfaceelement{endsetup}{in}
+\setinterfaceelement{get}{haal}
+\setinterfaceelement{increment}{verhoog}
+\setinterfaceelement{list}{lijst}
+\setinterfaceelement{listof}{lijstmet}
+\setinterfaceelement{load}{laad}
+\setinterfaceelement{local}{lokale}
+\setinterfaceelement{makeup}{opmaak}
+\setinterfaceelement{next}{volgende}
+\setinterfaceelement{place}{plaats}
+\setinterfaceelement{previous}{vorige}
+\setinterfaceelement{previouslocal}{vorigelokale}
+\setinterfaceelement{reserve}{reserveer}
+\setinterfaceelement{see}{zie}
+\setinterfaceelement{setup}{stel}
+\setinterfaceelement{start}{start}
+\setinterfaceelement{stop}{stop}
+\setinterfaceelement{text}{tekst}
+\setinterfaceelement{type}{type}
+% definitions for interface commands for language nl
+%
+\setinterfacecommand{CAPPED}{KAP}
+\setinterfacecommand{Character}{Letter}
+\setinterfacecommand{Characters}{Letters}
+\setinterfacecommand{LABELTEXT}{LABELTEKST}
+\setinterfacecommand{MONTH}{MAAND}
+\setinterfacecommand{Numbers}{Cijfers}
+\setinterfacecommand{Romannumerals}{Romeins}
+\setinterfacecommand{SmallCapped}{Kap}
+\setinterfacecommand{SmallCaps}{Kaps}
+\setinterfacecommand{WEEKDAY}{WEEKDAG}
+\setinterfacecommand{WORD}{WOORD}
+\setinterfacecommand{WORDS}{WOORDEN}
+\setinterfacecommand{Word}{Woord}
+\setinterfacecommand{Words}{Woorden}
+\setinterfacecommand{about}{about}
+\setinterfacecommand{adaptlayout}{paslayoutaan}
+\setinterfacecommand{arg}{arg}
+\setinterfacecommand{at}{op}
+\setinterfacecommand{atleftmargin}{oplinkermarge}
+\setinterfacecommand{atpage}{oppagina}
+\setinterfacecommand{atrightmargin}{oprechtermarge}
+\setinterfacecommand{background}{achtergrond}
+\setinterfacecommand{backspace}{rugwit}
+\setinterfacecommand{blackrule}{blokje}
+\setinterfacecommand{blackrules}{blokjes}
+\setinterfacecommand{blank}{blanko}
+\setinterfacecommand{bookmark}{bookmark}
+\setinterfacecommand{bottomdistance}{onderafstand}
+\setinterfacecommand{bottomheight}{onderhoogte}
+\setinterfacecommand{bottomspace}{bodemwit}
+\setinterfacecommand{but}{but}
+\setinterfacecommand{button}{button}
+\setinterfacecommand{bypassblocks}{passeerblokken}
+\setinterfacecommand{character}{letter}
+\setinterfacecommand{characters}{letters}
+\setinterfacecommand{chem}{chem}
+\setinterfacecommand{clip}{clip}
+\setinterfacecommand{clonefield}{kloonveld}
+\setinterfacecommand{color}{kleur}
+\setinterfacecommand{colorbar}{kleurenbalk}
+\setinterfacecommand{colorvalue}{kleurwaarde}
+\setinterfacecommand{column}{kolom}
+\setinterfacecommand{comment}{commentaar}
+\setinterfacecommand{comparecolorgroup}{vergelijkkleurgroep}
+\setinterfacecommand{comparepalet}{vergelijkpalet}
+\setinterfacecommand{completepagenumber}{volledigepaginanummer}
+\setinterfacecommand{completeregister}{volledigregister}
+\setinterfacecommand{component}{onderdeel}
+\setinterfacecommand{convertnumber}{converteernummer}
+\setinterfacecommand{copyfield}{copieerveld}
+\setinterfacecommand{correctwhitespace}{corrigeerwitruimte}
+\setinterfacecommand{coupledocument}{koppeldocument}
+\setinterfacecommand{couplemarking}{koppelmarkering}
+\setinterfacecommand{couplepage}{koppelpagina}
+\setinterfacecommand{couplepaper}{koppelpapier}
+\setinterfacecommand{coupleregister}{koppelregister}
+\setinterfacecommand{crlf}{crlf}
+\setinterfacecommand{currentdate}{huidigedatum}
+\setinterfacecommand{currentheadnumber}{huidigekopnummer}
+\setinterfacecommand{cutspace}{snijwit}
+\setinterfacecommand{date}{datum}
+\setinterfacecommand{decouplemarking}{ontkoppelmarkering}
+\setinterfacecommand{decrementnumber}{verlaagnummer}
+\setinterfacecommand{define}{definieer}
+\setinterfacecommand{defineaccent}{definieeraccent}
+\setinterfacecommand{defineblank}{definieerblanko}
+\setinterfacecommand{defineblock}{definieerblok}
+\setinterfacecommand{definebodyfont}{definieerkorps}
+\setinterfacecommand{definebodyfontenvironment}{definieerkorpsomgeving}
+\setinterfacecommand{definebuffer}{definieerbuffer}
+\setinterfacecommand{definecharacter}{definieerkarakter}
+\setinterfacecommand{definecolor}{definieerkleur}
+\setinterfacecommand{definecolorgroup}{definieerkleurgroep}
+\setinterfacecommand{definecolumnbreak}{definieerkolomovergang}
+\setinterfacecommand{definecolumnset}{definieerkolomgroep}
+\setinterfacecommand{definecombination}{definieercombinatie}
+\setinterfacecommand{definecombinedlist}{definieersamengesteldelijst}
+\setinterfacecommand{definecommand}{definieercommando}
+\setinterfacecommand{defineconversion}{definieerconversie}
+\setinterfacecommand{definedescription}{doordefinieren}
+\setinterfacecommand{defineenumeration}{doornummeren}
+\setinterfacecommand{definefield}{definieerveld}
+\setinterfacecommand{definefieldstack}{definieerveldstapel}
+\setinterfacecommand{definefiguresymbol}{definieerfiguursymbool}
+\setinterfacecommand{definefloat}{definieerplaatsblok}
+\setinterfacecommand{definefont}{definieerfont}
+\setinterfacecommand{definefontstyle}{definieerfontstijl}
+\setinterfacecommand{definefontsynonym}{definieerfontsynoniem}
+\setinterfacecommand{defineframed}{definieeromlijnd}
+\setinterfacecommand{defineframedtext}{definieerkadertekst}
+\setinterfacecommand{definehbox}{definieerhbox}
+\setinterfacecommand{definehead}{definieerkop}
+\setinterfacecommand{defineindenting}{doorspringen}
+\setinterfacecommand{defineinmargin}{definieerinmarge}
+\setinterfacecommand{defineinteractionmenu}{definieerinteractiemenu}
+\setinterfacecommand{defineitemgroup}{definieeritemgroep}
+\setinterfacecommand{definelabel}{doorlabelen}
+\setinterfacecommand{definelayer}{definieerlayer}
+\setinterfacecommand{definelayout}{definieerlayout}
+\setinterfacecommand{definelist}{definieerlijst}
+\setinterfacecommand{definelogo}{definieerbeeldmerk}
+\setinterfacecommand{definemainfield}{definieerhoofdveld}
+\setinterfacecommand{definemakeup}{definieeropmaak}
+\setinterfacecommand{definemarking}{definieermarkering}
+\setinterfacecommand{definemathalignment}{definieerwiskundeuitlijnen}
+\setinterfacecommand{defineoutput}{definieeruitvoer}
+\setinterfacecommand{defineoverlay}{definieeroverlay}
+\setinterfacecommand{definepagebreak}{definieerpaginaovergang}
+\setinterfacecommand{definepalet}{definieerpalet}
+\setinterfacecommand{definepapersize}{definieerpapierformaat}
+\setinterfacecommand{defineparagraphs}{definieeralineas}
+\setinterfacecommand{defineplacement}{definieerplaats}
+\setinterfacecommand{defineprofile}{definieerprofiel}
+\setinterfacecommand{defineprogram}{definieerprogramma}
+\setinterfacecommand{definerawfont}{definerawfont}
+\setinterfacecommand{definereference}{definieerreferentie}
+\setinterfacecommand{definereferenceformat}{definieerreferentieformaat}
+\setinterfacecommand{definereferencelist}{definieerreferentielijst}
+\setinterfacecommand{defineregister}{definieerregister}
+\setinterfacecommand{definerule}{definieerlijn}
+\setinterfacecommand{definesection}{definieersectie}
+\setinterfacecommand{definesectionblock}{definieersectieblok}
+\setinterfacecommand{definesorting}{definieersorteren}
+\setinterfacecommand{definestartstop}{definieerstartstop}
+\setinterfacecommand{definestyle}{definieerletter}
+\setinterfacecommand{definesubfield}{definieersubveld}
+\setinterfacecommand{definesymbol}{definieersymbool}
+\setinterfacecommand{definesynonyms}{definieersynoniemen}
+\setinterfacecommand{definetabletemplate}{definieertabelvorm}
+\setinterfacecommand{definetabulate}{definieertabulatie}
+\setinterfacecommand{definetext}{definieertekst}
+\setinterfacecommand{definetextposition}{definieertekstpositie}
+\setinterfacecommand{definetextvariable}{definieertekstvariabele}
+\setinterfacecommand{definetype}{definieertype}
+\setinterfacecommand{definetyping}{definieertypen}
+\setinterfacecommand{defineversion}{definieerversie}
+\setinterfacecommand{determineheadnumber}{bepaalkopnummer}
+\setinterfacecommand{determinelistcharacteristics}{bepaallijstkenmerken}
+\setinterfacecommand{determineregistercharacteristics}{bepaalregisterkenmerken}
+\setinterfacecommand{dimension}{dimensie}
+\setinterfacecommand{disableinteractionmenu}{blokkeerinteractiemenu}
+\setinterfacecommand{domicile}{woonplaats}
+\setinterfacecommand{donttest}{geentest}
+\setinterfacecommand{edgedistance}{randafstand}
+\setinterfacecommand{edgewidth}{randbreedte}
+\setinterfacecommand{emptylines}{legeregels}
+\setinterfacecommand{environment}{omgeving}
+\setinterfacecommand{externalfigure}{externfiguur}
+\setinterfacecommand{fact}{geg}
+\setinterfacecommand{field}{veld}
+\setinterfacecommand{fieldstack}{veldstapel}
+\setinterfacecommand{fillinfield}{invulveld}
+\setinterfacecommand{fillinline}{invulregel}
+\setinterfacecommand{fillinrules}{invullijnen}
+\setinterfacecommand{fillintext}{invultekst}
+\setinterfacecommand{fitfield}{passendveld}
+\setinterfacecommand{fixedspace}{vastespatie}
+\setinterfacecommand{fixedspaces}{vastespaties}
+\setinterfacecommand{followprofile}{volgprofiel}
+\setinterfacecommand{followprofileversion}{volgprofielversie}
+\setinterfacecommand{followversion}{volgversie}
+\setinterfacecommand{footerdistance}{voetafstand}
+\setinterfacecommand{footerheight}{voethoogte}
+\setinterfacecommand{footnote}{voetnoot}
+\setinterfacecommand{footnotetext}{voetnoottekst}
+\setinterfacecommand{forceblocks}{forceerblokken}
+\setinterfacecommand{formulanumber}{formulenummer}
+\setinterfacecommand{fraction}{breuk}
+\setinterfacecommand{framed}{omlijnd}
+\setinterfacecommand{from}{uit}
+\setinterfacecommand{getbuffer}{haalbuffer}
+\setinterfacecommand{getmarking}{haalmarkering}
+\setinterfacecommand{getnumber}{haalnummer}
+\setinterfacecommand{godown}{omlaag}
+\setinterfacecommand{goto}{naar}
+\setinterfacecommand{gotobox}{naarbox}
+\setinterfacecommand{gotopage}{naarpagina}
+\setinterfacecommand{graycolor}{grijskleur}
+\setinterfacecommand{greyvalue}{grijswaarde}
+\setinterfacecommand{grid}{rooster}
+\setinterfacecommand{hairline}{haarlijn}
+\setinterfacecommand{head}{kop}
+\setinterfacecommand{headerdistance}{hoofdafstand}
+\setinterfacecommand{headerheight}{hoofdhoogte}
+\setinterfacecommand{headlevel}{kopniveau}
+\setinterfacecommand{headnumber}{kopnummer}
+\setinterfacecommand{headsym}{kopsym}
+\setinterfacecommand{headtext}{koptekst}
+\setinterfacecommand{hideblocks}{verbergblokken}
+\setinterfacecommand{high}{hoog}
+\setinterfacecommand{hl}{hl}
+\setinterfacecommand{immediatebetweenlist}{directtussenlijst}
+\setinterfacecommand{immediatetolist}{directnaarlijst}
+\setinterfacecommand{in}{in}
+\setinterfacecommand{incrementnumber}{verhoognummer}
+\setinterfacecommand{indenting}{inspringen}
+\setinterfacecommand{inframed}{inlijnd}
+\setinterfacecommand{infull}{voluit}
+\setinterfacecommand{ininner}{inbinnen}
+\setinterfacecommand{inleft}{inlinker}
+\setinterfacecommand{inleftedge}{inlinkerrand}
+\setinterfacecommand{inleftmargin}{inlinkermarge}
+\setinterfacecommand{inline}{inregel}
+\setinterfacecommand{inmargin}{inmarge}
+\setinterfacecommand{inmframed}{inwilijnd}
+\setinterfacecommand{inneredgedistance}{binnenrandafstand}
+\setinterfacecommand{inneredgewidth}{binnenrandbreedte}
+\setinterfacecommand{innermargindistance}{binnenmargeafstand}
+\setinterfacecommand{innermarginwidth}{binnenmargebreedte}
+\setinterfacecommand{inothermargin}{inanderemarge}
+\setinterfacecommand{inouter}{inbuiten}
+\setinterfacecommand{inright}{inrechter}
+\setinterfacecommand{inrightedge}{inrechterrand}
+\setinterfacecommand{inrightmargin}{inrechtermarge}
+\setinterfacecommand{installlanguage}{installeertaal}
+\setinterfacecommand{interactionbar}{interactiebalk}
+\setinterfacecommand{interactionbuttons}{interactiebuttons}
+\setinterfacecommand{interactionmenu}{interactiemenu}
+\setinterfacecommand{item}{som}
+\setinterfacecommand{items}{items}
+\setinterfacecommand{its}{its}
+\setinterfacecommand{keepblocks}{handhaafblokken}
+\setinterfacecommand{label}{label}
+\setinterfacecommand{labels}{labels}
+\setinterfacecommand{labeltext}{labeltekst}
+\setinterfacecommand{language}{taal}
+\setinterfacecommand{leftaligned}{regellinks}
+\setinterfacecommand{leftedgedistance}{linkerrandafstand}
+\setinterfacecommand{leftedgewidth}{linkerrandbreedte}
+\setinterfacecommand{leftmargindistance}{linkermargeafstand}
+\setinterfacecommand{leftmarginwidth}{linkermargebreedte}
+\setinterfacecommand{leg}{leg}
+\setinterfacecommand{linewidth}{lijndikte}
+\setinterfacecommand{listheight}{lijsthoogte}
+\setinterfacecommand{listlength}{lijstlengte}
+\setinterfacecommand{listsymbol}{lijstsymbool}
+\setinterfacecommand{listwidth}{lijstbreedte}
+\setinterfacecommand{logfields}{registreervelden}
+\setinterfacecommand{lohi}{laho}
+\setinterfacecommand{low}{laag}
+\setinterfacecommand{macroname}{naam}
+\setinterfacecommand{mainlanguage}{hoofdtaal}
+\setinterfacecommand{makeupheight}{zethoogte}
+\setinterfacecommand{makeupwidth}{zetbreedte}
+\setinterfacecommand{mar}{mar}
+\setinterfacecommand{margindistance}{margeafstand}
+\setinterfacecommand{marginrule}{kantlijn}
+\setinterfacecommand{margintext}{margetekst}
+\setinterfacecommand{margintitle}{margetitel}
+\setinterfacecommand{marginwidth}{margebreedte}
+\setinterfacecommand{marginword}{margewoord}
+\setinterfacecommand{marking}{markeer}
+\setinterfacecommand{markversion}{markeerversie}
+\setinterfacecommand{mathematics}{wiskunde}
+\setinterfacecommand{menubutton}{menubutton}
+\setinterfacecommand{mframed}{wilijnd}
+\setinterfacecommand{midaligned}{regelmidden}
+\setinterfacecommand{mirror}{spiegel}
+\setinterfacecommand{month}{maand}
+\setinterfacecommand{moveformula}{verplaatsformule}
+\setinterfacecommand{moveongrid}{verplaatsopgrid}
+\setinterfacecommand{movesidefloat}{verplaatszijblok}
+\setinterfacecommand{navigating}{navigerend}
+\setinterfacecommand{nodimension}{geendimensie}
+\setinterfacecommand{noheaderandfooterlines}{geenhoofdenvoetregels}
+\setinterfacecommand{noindenting}{nietinspringen}
+\setinterfacecommand{nolist}{geenlijst}
+\setinterfacecommand{nomarking}{geenmarkering}
+\setinterfacecommand{nomoreblocks}{geenblokkenmeer}
+\setinterfacecommand{nomorefiles}{geenfilesmeer}
+\setinterfacecommand{nop}{nop}
+\setinterfacecommand{nospace}{geenspatie}
+\setinterfacecommand{note}{noot}
+\setinterfacecommand{notopandbottomlines}{geenbovenenonderregels}
+\setinterfacecommand{notsmallcapped}{nokap}
+\setinterfacecommand{nowhitespace}{geenwitruimte}
+\setinterfacecommand{numberofsubpages}{aantalsubpaginas}
+\setinterfacecommand{numbers}{cijfers}
+\setinterfacecommand{outeredgedistance}{buitenrandafstand}
+\setinterfacecommand{outeredgewidth}{buitenrandbreedte}
+\setinterfacecommand{outermargindistance}{buitenmargeafstand}
+\setinterfacecommand{outermarginwidth}{buitenmargebreedte}
+\setinterfacecommand{overbar}{overstreep}
+\setinterfacecommand{overbars}{overstrepen}
+\setinterfacecommand{overstrike}{doorstreep}
+\setinterfacecommand{overstrikes}{doorstrepen}
+\setinterfacecommand{packed}{opelkaar}
+\setinterfacecommand{page}{pagina}
+\setinterfacecommand{pagedepth}{paginadiepte}
+\setinterfacecommand{pagenumber}{paginanummer}
+\setinterfacecommand{pageoffset}{paginaoffset}
+\setinterfacecommand{pagereference}{paginareferentie}
+\setinterfacecommand{pagetype}{soortpagina}
+\setinterfacecommand{paperheight}{papierhoogte}
+\setinterfacecommand{paperwidth}{papierbreedte}
+\setinterfacecommand{periods}{punten}
+\setinterfacecommand{plaatsruwelijst}{plaatsruwelijst}
+\setinterfacecommand{placebookmarks}{plaatsbookmarks}
+\setinterfacecommand{placecombinedlist}{plaatssamengesteldelijst}
+\setinterfacecommand{placefloat}{plaatsplaatsblok}
+\setinterfacecommand{placefootnotes}{plaatsvoetnoten}
+\setinterfacecommand{placeformula}{plaatsformule}
+\setinterfacecommand{placeheadnumber}{plaatskopnummer}
+\setinterfacecommand{placeheadtext}{plaatskoptekst}
+\setinterfacecommand{placelegend}{plaatslegenda}
+\setinterfacecommand{placelist}{plaatslijst}
+\setinterfacecommand{placelocalfootnotes}{plaatslokalevoetnoten}
+\setinterfacecommand{placelogos}{plaatsbeeldmerken}
+\setinterfacecommand{placeongrid}{plaatsopgrid}
+\setinterfacecommand{placeontopofeachother}{plaatsonderelkaar}
+\setinterfacecommand{placepagenumber}{plaatspaginanummer}
+\setinterfacecommand{placereferencelist}{plaatsreferentielijst}
+\setinterfacecommand{placeregister}{plaatsregister}
+\setinterfacecommand{placerule}{plaatslijn}
+\setinterfacecommand{placesidebyside}{plaatsnaastelkaar}
+\setinterfacecommand{placesubformula}{plaatssubformule}
+\setinterfacecommand{placetextvariable}{plaatstekstvariabele}
+\setinterfacecommand{position}{positioneer}
+\setinterfacecommand{positiontext}{positioneertekst}
+\setinterfacecommand{printpaperheight}{printpapierhoogte}
+\setinterfacecommand{printpaperwidth}{printpapierbreedte}
+\setinterfacecommand{processblocks}{verwerkblokken}
+\setinterfacecommand{processpage}{verwerkpagina}
+\setinterfacecommand{product}{produkt}
+\setinterfacecommand{program}{programma}
+\setinterfacecommand{project}{projekt}
+\setinterfacecommand{publication}{publicatie}
+\setinterfacecommand{quotation}{citaat}
+\setinterfacecommand{quote}{citeer}
+\setinterfacecommand{ran}{ran}
+\setinterfacecommand{redo}{herhaal}
+\setinterfacecommand{ref}{ref}
+\setinterfacecommand{reference}{referentie}
+\setinterfacecommand{referral}{kenmerk}
+\setinterfacecommand{referraldate}{kenmerkdatum}
+\setinterfacecommand{referring}{refereer}
+\setinterfacecommand{remark}{toelichting}
+\setinterfacecommand{reset}{reset}
+\setinterfacecommand{resetmarking}{resetmarkering}
+\setinterfacecommand{resetnumber}{resetnummer}
+\setinterfacecommand{resettext}{resettekstinhoud}
+\setinterfacecommand{rightaligned}{regelrechts}
+\setinterfacecommand{rightedgedistance}{rechterrandafstand}
+\setinterfacecommand{rightedgewidth}{rechterrandbreedte}
+\setinterfacecommand{rightmargindistance}{rechtermargeafstand}
+\setinterfacecommand{rightmarginwidth}{rechtermargebreedte}
+\setinterfacecommand{romannumerals}{romeins}
+\setinterfacecommand{rotate}{roteer}
+\setinterfacecommand{scale}{schaal}
+\setinterfacecommand{screen}{scherm}
+\setinterfacecommand{selectblocks}{selecteerblokken}
+\setinterfacecommand{selectpaper}{selecteerpapier}
+\setinterfacecommand{selectversion}{selecteerversie}
+\setinterfacecommand{setnumber}{setnummer}
+\setinterfacecommand{settextcontent}{steltekstinhoudin}
+\setinterfacecommand{settextvariable}{kentekstvariabeletoe}
+\setinterfacecommand{setupalign}{steluitlijnenin}
+\setinterfacecommand{setuparranging}{stelarrangerenin}
+\setinterfacecommand{setupbackground}{stelachtergrondin}
+\setinterfacecommand{setupbackgrounds}{stelachtergrondenin}
+\setinterfacecommand{setupblackrules}{stelblokjesin}
+\setinterfacecommand{setupblank}{stelblankoin}
+\setinterfacecommand{setupblock}{stelblokin}
+\setinterfacecommand{setupbodyfont}{stelkorpsin}
+\setinterfacecommand{setupbodyfontenvironment}{stelkorpsomgevingin}
+\setinterfacecommand{setupbottom}{stelonderin}
+\setinterfacecommand{setupbottomtexts}{stelondertekstenin}
+\setinterfacecommand{setupbuffer}{stelbufferin}
+\setinterfacecommand{setupbuttons}{stelbuttonsin}
+\setinterfacecommand{setupcapitals}{stelkapitalenin}
+\setinterfacecommand{setupcaption}{stelblokkopjein}
+\setinterfacecommand{setupcaptions}{stelblokkopjesin}
+\setinterfacecommand{setupclipping}{stelclipin}
+\setinterfacecommand{setupcolor}{stelkleurin}
+\setinterfacecommand{setupcolors}{stelkleurenin}
+\setinterfacecommand{setupcolumns}{stelkolommenin}
+\setinterfacecommand{setupcolumnset}{stelkolomgroepin}
+\setinterfacecommand{setupcolumnsetlines}{stelkolomgroepregelsin}
+\setinterfacecommand{setupcolumnsetstart}{stelkolomgroepstartin}
+\setinterfacecommand{setupcombinations}{stelcombinatiesin}
+\setinterfacecommand{setupcombinedlist}{stelsamengesteldelijstin}
+\setinterfacecommand{setupcomment}{stelcommentaarin}
+\setinterfacecommand{setupdescriptions}{steldoordefinierenin}
+\setinterfacecommand{setupenumerations}{steldoornummerenin}
+\setinterfacecommand{setupexternalfigures}{stelexternefigurenin}
+\setinterfacecommand{setupfield}{stelveldin}
+\setinterfacecommand{setupfields}{stelveldenin}
+\setinterfacecommand{setupfillinlines}{stelinvulregelsin}
+\setinterfacecommand{setupfillinrules}{stelinvullijnenin}
+\setinterfacecommand{setupfloat}{stelplaatsblokin}
+\setinterfacecommand{setupfloats}{stelplaatsblokkenin}
+\setinterfacecommand{setupfloatsplitting}{stelplaatsbloksplitsenin}
+\setinterfacecommand{setupfooter}{stelvoetin}
+\setinterfacecommand{setupfootertexts}{stelvoettekstenin}
+\setinterfacecommand{setupfootnotedefinition}{stelvoetnootdefinitiein}
+\setinterfacecommand{setupfootnotes}{stelvoetnotenin}
+\setinterfacecommand{setupforms}{stelformulierenin}
+\setinterfacecommand{setupformulas}{stelformulesin}
+\setinterfacecommand{setupframed}{stelomlijndin}
+\setinterfacecommand{setupframedtexts}{stelkadertekstenin}
+\setinterfacecommand{setuphead}{stelkopin}
+\setinterfacecommand{setupheader}{stelhoofdin}
+\setinterfacecommand{setupheadertexts}{stelhoofdtekstenin}
+\setinterfacecommand{setupheadnumber}{stelkopnummerin}
+\setinterfacecommand{setupheads}{stelkoppenin}
+\setinterfacecommand{setupheadtext}{stelkoptekstin}
+\setinterfacecommand{setuphyphenmark}{stelkoppeltekenin}
+\setinterfacecommand{setupindentations}{steldoorspringenin}
+\setinterfacecommand{setupindenting}{stelinspringenin}
+\setinterfacecommand{setupinmargin}{stelinmargein}
+\setinterfacecommand{setupinteraction}{stelinteractiein}
+\setinterfacecommand{setupinteractionbar}{stelinteractiebalkin}
+\setinterfacecommand{setupinteractionmenu}{stelinteractiemenuin}
+\setinterfacecommand{setupinteractionscreen}{stelinteractieschermin}
+\setinterfacecommand{setupinterlinespace}{stelinterliniein}
+\setinterfacecommand{setupitemgroup}{stelitemgroepin}
+\setinterfacecommand{setupitemgroups}{stelopsommingenin}
+\setinterfacecommand{setupitems}{stelitemsin}
+\setinterfacecommand{setuplabeltext}{stellabeltekstin}
+\setinterfacecommand{setuplanguage}{steltaalin}
+\setinterfacecommand{setuplayout}{stellayoutin}
+\setinterfacecommand{setuplegend}{stellegendain}
+\setinterfacecommand{setuplinenumbering}{stelregelnummerenin}
+\setinterfacecommand{setuplines}{stelregelsin}
+\setinterfacecommand{setuplinewidth}{stellijndiktein}
+\setinterfacecommand{setuplist}{stellijstin}
+\setinterfacecommand{setupmakeup}{stelopmaakin}
+\setinterfacecommand{setupmarginblocks}{stelmargeblokkenin}
+\setinterfacecommand{setupmarginrules}{stelkantlijnin}
+\setinterfacecommand{setupmarking}{stelmarkeringin}
+\setinterfacecommand{setupmathalignment}{stelwiskundeuitlijnenin}
+\setinterfacecommand{setupnarrower}{stelsmallerin}
+\setinterfacecommand{setupnumber}{stelnummerin}
+\setinterfacecommand{setupnumbering}{stelnummerenin}
+\setinterfacecommand{setupoppositeplacing}{stelnaastplaatsenin}
+\setinterfacecommand{setupoutput}{steluitvoerin}
+\setinterfacecommand{setuppagecomment}{stelpaginacommentaarin}
+\setinterfacecommand{setuppagenumber}{stelpaginanummerin}
+\setinterfacecommand{setuppagenumbering}{stelpaginanummeringin}
+\setinterfacecommand{setuppagetransitions}{stelpaginaovergangenin}
+\setinterfacecommand{setuppalet}{stelpaletin}
+\setinterfacecommand{setuppaper}{stelpapierin}
+\setinterfacecommand{setuppapersize}{stelpapierformaatin}
+\setinterfacecommand{setupparagraphnumbering}{stelparagraafnummerenin}
+\setinterfacecommand{setupparagraphs}{stelalineasin}
+\setinterfacecommand{setupplacement}{stelplaatsin}
+\setinterfacecommand{setuppositioning}{stelpositionerenin}
+\setinterfacecommand{setupprofiles}{stelprofielenin}
+\setinterfacecommand{setupprograms}{stelprogrammasin}
+\setinterfacecommand{setuppublications}{stelpublicatiesin}
+\setinterfacecommand{setupquote}{stelciterenin}
+\setinterfacecommand{setupreferencelist}{stelreferentielijstin}
+\setinterfacecommand{setupreferencing}{stelrefererenin}
+\setinterfacecommand{setupregister}{stelregisterin}
+\setinterfacecommand{setuprotate}{stelroterenin}
+\setinterfacecommand{setuprule}{stellijnin}
+\setinterfacecommand{setups}{instellingen}
+\setinterfacecommand{setupscreens}{stelrastersin}
+\setinterfacecommand{setupsection}{stelsectiein}
+\setinterfacecommand{setupsectionblock}{stelsectieblokin}
+\setinterfacecommand{setupsorting}{stelsorterenin}
+\setinterfacecommand{setupspacing}{stelspatieringin}
+\setinterfacecommand{setupstartstop}{stelstartstopin}
+\setinterfacecommand{setupstrut}{stelstrutin}
+\setinterfacecommand{setupsubpagenumber}{stelsubpaginanummerin}
+\setinterfacecommand{setupsymbolset}{stelsymboolsetin}
+\setinterfacecommand{setupsynchronization}{stelsynchronisatiein}
+\setinterfacecommand{setupsynchronizationbar}{stelsynchronisatiebalkin}
+\setinterfacecommand{setupsynonyms}{stelsynoniemenin}
+\setinterfacecommand{setupsystem}{stelsysteemin}
+\setinterfacecommand{setuptab}{steltabin}
+\setinterfacecommand{setuptables}{steltabellenin}
+\setinterfacecommand{setuptabulate}{steltabulatiein}
+\setinterfacecommand{setuptext}{steltekstin}
+\setinterfacecommand{setuptextposition}{steltekstpositiein}
+\setinterfacecommand{setuptextrules}{steltekstlijnenin}
+\setinterfacecommand{setuptexttexts}{stelteksttekstenin}
+\setinterfacecommand{setuptextvariable}{steltekstvariabelein}
+\setinterfacecommand{setupthinrules}{steldunnelijnenin}
+\setinterfacecommand{setuptolerance}{steltolerantiein}
+\setinterfacecommand{setuptop}{stelbovenin}
+\setinterfacecommand{setuptoptexts}{stelboventekstenin}
+\setinterfacecommand{setuptype}{steltypein}
+\setinterfacecommand{setuptyping}{steltypenin}
+\setinterfacecommand{setupunderbar}{stelonderstrepenin}
+\setinterfacecommand{setupurl}{stelurlin}
+\setinterfacecommand{setupversions}{stelversiesin}
+\setinterfacecommand{setupwhitespace}{stelwitruimtein}
+\setinterfacecommand{showbodyfont}{toonkorps}
+\setinterfacecommand{showbodyfontenvironment}{toonkorpsomgeving}
+\setinterfacecommand{showcolor}{toonkleur}
+\setinterfacecommand{showcolorgroup}{toonkleurgroep}
+\setinterfacecommand{showexternalfigures}{toonexternefiguren}
+\setinterfacecommand{showfields}{toonvelden}
+\setinterfacecommand{showframe}{toonkader}
+\setinterfacecommand{showgrid}{toongrid}
+\setinterfacecommand{showlayout}{toonlayout}
+\setinterfacecommand{showmakeup}{toonopmaak}
+\setinterfacecommand{showpalet}{toonpalet}
+\setinterfacecommand{showprint}{toonprint}
+\setinterfacecommand{showsetups}{tooninstellingen}
+\setinterfacecommand{showstruts}{toonstruts}
+\setinterfacecommand{showsymbolset}{toonsymboolset}
+\setinterfacecommand{smallcapped}{kap}
+\setinterfacecommand{someline}{eenregel}
+\setinterfacecommand{somewhere}{ergens}
+\setinterfacecommand{space}{spatie}
+\setinterfacecommand{splitfloat}{splitsplaatsblok}
+\setinterfacecommand{startalignment}{startuitlijnen}
+\setinterfacecommand{startbackground}{startachtergrond}
+\setinterfacecommand{startcoding}{startcodering}
+\setinterfacecommand{startcolor}{startkleur}
+\setinterfacecommand{startcolumnmakeup}{startkolomopmaak}
+\setinterfacecommand{startcolumns}{startkolommen}
+\setinterfacecommand{startcolumnset}{startkolomgroep}
+\setinterfacecommand{startcombination}{startcombinatie}
+\setinterfacecommand{startcomponent}{startonderdeel}
+\setinterfacecommand{startdocument}{startdocument}
+\setinterfacecommand{startenvironment}{startomgeving}
+\setinterfacecommand{startfigure}{startfiguur}
+\setinterfacecommand{startglobal}{startglobaal}
+\setinterfacecommand{startline}{startregel}
+\setinterfacecommand{startlinecorrection}{startregelcorrectie}
+\setinterfacecommand{startlinenumbering}{startregelnummeren}
+\setinterfacecommand{startlines}{startregels}
+\setinterfacecommand{startlocal}{startlokaal}
+\setinterfacecommand{startlocalfootnotes}{startlokalevoetnoten}
+\setinterfacecommand{startmakeup}{startopmaak}
+\setinterfacecommand{startmarginblock}{startmargeblok}
+\setinterfacecommand{startmarginrule}{startkantlijn}
+\setinterfacecommand{startnarrower}{startsmaller}
+\setinterfacecommand{startopposite}{startnaast}
+\setinterfacecommand{startoverlay}{startoverlay}
+\setinterfacecommand{startoverzicht}{startoverzicht}
+\setinterfacecommand{startpacked}{startopelkaar}
+\setinterfacecommand{startpositioning}{startpositioneren}
+\setinterfacecommand{startproduct}{startprodukt}
+\setinterfacecommand{startprofile}{startprofiel}
+\setinterfacecommand{startproject}{startprojekt}
+\setinterfacecommand{startquotation}{startcitaat}
+\setinterfacecommand{startraster}{startraster}
+\setinterfacecommand{startsymbolset}{startsymboolset}
+\setinterfacecommand{startsynchronization}{startsynchronisatie}
+\setinterfacecommand{starttable}{starttabel}
+\setinterfacecommand{starttables}{starttabellen}
+\setinterfacecommand{starttext}{starttekst}
+\setinterfacecommand{starttextrule}{starttekstlijn}
+\setinterfacecommand{startunpacked}{startvanelkaar}
+\setinterfacecommand{startversion}{startversie}
+\setinterfacecommand{stopalignment}{stopuitlijnen}
+\setinterfacecommand{stopbackground}{stopachtergrond}
+\setinterfacecommand{stopcoding}{stopcodering}
+\setinterfacecommand{stopcolor}{stopkleur}
+\setinterfacecommand{stopcolumnmakeup}{stopkolomopmaak}
+\setinterfacecommand{stopcolumns}{stopkolommen}
+\setinterfacecommand{stopcolumnset}{stopkolomgroep}
+\setinterfacecommand{stopcombination}{stopcombinatie}
+\setinterfacecommand{stopcomponent}{stoponderdeel}
+\setinterfacecommand{stopdocument}{stopdocument}
+\setinterfacecommand{stopenvironment}{stopomgeving}
+\setinterfacecommand{stopglobal}{stopglobaal}
+\setinterfacecommand{stopline}{stopregel}
+\setinterfacecommand{stoplinecorrection}{stopregelcorrectie}
+\setinterfacecommand{stoplinenumbering}{stopregelnummeren}
+\setinterfacecommand{stoplines}{stopregels}
+\setinterfacecommand{stoplocal}{stoplokaal}
+\setinterfacecommand{stoplocalfootnotes}{stoplokalevoetnoten}
+\setinterfacecommand{stopmakeup}{stopopmaak}
+\setinterfacecommand{stopmarginblock}{stopmargeblok}
+\setinterfacecommand{stopmarginrule}{stopkantlijn}
+\setinterfacecommand{stopnarrower}{stopsmaller}
+\setinterfacecommand{stopopposite}{stopnaast}
+\setinterfacecommand{stopoverlay}{stopoverlay}
+\setinterfacecommand{stopoverzicht}{stopoverzicht}
+\setinterfacecommand{stoppacked}{stopopelkaar}
+\setinterfacecommand{stoppositioning}{stoppositioneren}
+\setinterfacecommand{stopproduct}{stopprodukt}
+\setinterfacecommand{stopprofile}{stopprofiel}
+\setinterfacecommand{stopproject}{stopprojekt}
+\setinterfacecommand{stopquotation}{stopcitaat}
+\setinterfacecommand{stopraster}{stopraster}
+\setinterfacecommand{stopsynchronization}{stopsynchronisatie}
+\setinterfacecommand{stoptable}{stoptabel}
+\setinterfacecommand{stoptables}{stoptabellen}
+\setinterfacecommand{stoptext}{stoptekst}
+\setinterfacecommand{stoptextrule}{stoptekstlijn}
+\setinterfacecommand{stopunpacked}{stopvanelkaar}
+\setinterfacecommand{stopversion}{stopversie}
+\setinterfacecommand{stretched}{uitgerekt}
+\setinterfacecommand{subformulanumber}{subformulenummer}
+\setinterfacecommand{subpagenumber}{subpaginanummer}
+\setinterfacecommand{switchtobodyfont}{switchnaarkorps}
+\setinterfacecommand{switchtorawfont}{switchtorawfont}
+\setinterfacecommand{sym}{sym}
+\setinterfacecommand{symbol}{symbool}
+\setinterfacecommand{synchronizationbar}{synchronisatiebalk}
+\setinterfacecommand{synchronize}{synchroniseer}
+\setinterfacecommand{tab}{tab}
+\setinterfacecommand{testcolumn}{testkolom}
+\setinterfacecommand{testpage}{testpagina}
+\setinterfacecommand{tex}{tex}
+\setinterfacecommand{textheight}{teksthoogte}
+\setinterfacecommand{textreference}{tekstreferentie}
+\setinterfacecommand{textrule}{tekstlijn}
+\setinterfacecommand{textvariable}{tekstvariabele}
+\setinterfacecommand{textwidth}{tekstbreedte}
+\setinterfacecommand{thinrule}{dunnelijn}
+\setinterfacecommand{thinrules}{dunnelijnen}
+\setinterfacecommand{tooltip}{suggestie}
+\setinterfacecommand{topdistance}{bovenafstand}
+\setinterfacecommand{topheight}{bovenhoogte}
+\setinterfacecommand{topspace}{kopwit}
+\setinterfacecommand{totalnumberofpages}{totaalaantalpaginas}
+\setinterfacecommand{translate}{vertaal}
+\setinterfacecommand{txt}{txt}
+\setinterfacecommand{typ}{typ}
+\setinterfacecommand{type}{type}
+\setinterfacecommand{typebuffer}{typebuffer}
+\setinterfacecommand{typefile}{typefile}
+\setinterfacecommand{underbar}{onderstreep}
+\setinterfacecommand{underbars}{onderstrepen}
+\setinterfacecommand{unitmeaning}{betekenis}
+\setinterfacecommand{unknown}{onbekend}
+\setinterfacecommand{useJSscripts}{gebruikJSscripts}
+\setinterfacecommand{useURL}{gebruikURL}
+\setinterfacecommand{useXMLfilter}{gebruikXMLfilter}
+\setinterfacecommand{useblocks}{gebruikblokken}
+\setinterfacecommand{usecommands}{gebruikcommandos}
+\setinterfacecommand{useencoding}{usecodering}
+\setinterfacecommand{useexternaldocument}{gebruikexterndocument}
+\setinterfacecommand{useexternalfigure}{gebruikexternfiguur}
+\setinterfacecommand{useexternalfile}{gebruikexternefile}
+\setinterfacecommand{useexternalfiles}{gebruikexternefiles}
+\setinterfacecommand{useexternalsoundtrack}{gebruikexterngeluidsfragment}
+\setinterfacecommand{usemodule}{gebruikmodule}
+\setinterfacecommand{usemodules}{gebruikmodules}
+\setinterfacecommand{usepath}{gebruikgebied}
+\setinterfacecommand{usereferences}{gebruikreferenties}
+\setinterfacecommand{usespecials}{gebruikspecials}
+\setinterfacecommand{usesymbols}{gebruiksymbolen}
+\setinterfacecommand{usetypescript}{gebruiktypescript}
+\setinterfacecommand{usetypescriptfile}{gebruiktypescriptfile}
+\setinterfacecommand{useurl}{gebruikurl}
+\setinterfacecommand{version}{versie}
+\setinterfacecommand{vl}{vl}
+\setinterfacecommand{weekday}{weekdag}
+\setinterfacecommand{whitespace}{witruimte}
+\setinterfacecommand{wordright}{woordrechts}
+\setinterfacecommand{writebetweenlist}{schrijftussenlijst}
+\setinterfacecommand{writetolist}{schrijfnaarlijst}
+\setinterfacecommand{writetoreferencelist}{schrijfnaarreferentielijst}
+\setinterfacecommand{writetoregister}{schrijfnaarregister}
+%
+\endinput
\ No newline at end of file
diff --git a/tex/context/base/mult-ro.tex b/tex/context/base/mult-ro.tex
new file mode 100644
index 000000000..297a57be9
--- /dev/null
+++ b/tex/context/base/mult-ro.tex
@@ -0,0 +1,1576 @@
+% this file is auto-generated, don't edit this file
+%
+% definitions for interface variables for language ro
+%
+\setinterfacevariable{Addition}{Adaugare}
+\setinterfacevariable{Balloon}{Balon}
+\setinterfacevariable{Character}{Caracter}
+\setinterfacevariable{Characters}{Caractere}
+\setinterfacevariable{CloseDocument}{InchideDocument}
+\setinterfacevariable{ExitViewer}{IesireVizualizator}
+\setinterfacevariable{FirstPage}{PrimaPagina}
+\setinterfacevariable{FitHeight}{AjustatInaltime}
+\setinterfacevariable{FitWidth}{AjustatLatime}
+\setinterfacevariable{GotoPage}{LaPagina}
+\setinterfacevariable{Greek}{Grec}
+\setinterfacevariable{Help}{Ajutor}
+\setinterfacevariable{HideField}{AscundeCamp}
+\setinterfacevariable{HideLayer}{HideLayer}
+\setinterfacevariable{Key}{Cheie}
+\setinterfacevariable{LastPage}{UltimaPagina}
+\setinterfacevariable{LoadForm}{IncarcaFormular}
+\setinterfacevariable{MONTH}{LUNA}
+\setinterfacevariable{New}{Nou}
+\setinterfacevariable{NextJump}{SaltUrmator}
+\setinterfacevariable{NextPage}{PaginaUrmatoare}
+\setinterfacevariable{Numbers}{Numere}
+\setinterfacevariable{OpenNamedDocument}{OpenNamedDocument}
+\setinterfacevariable{Paragraph}{Paragraf}
+\setinterfacevariable{PauseMovie}{PauzaFilm}
+\setinterfacevariable{PauseRendering}{PauseRendering}
+\setinterfacevariable{PauseSound}{PauzaSunet}
+\setinterfacevariable{PreviousJump}{SaltPrecedent}
+\setinterfacevariable{PreviousPage}{PaginaPrecedenta}
+\setinterfacevariable{PrintDocument}{TiparesteDocument}
+\setinterfacevariable{Query}{Query}
+\setinterfacevariable{QueryAgain}{QueryAgain}
+\setinterfacevariable{ResetForm}{ResetareFormular}
+\setinterfacevariable{ResumeMovie}{RepornesteFilm}
+\setinterfacevariable{ResumeRendering}{ResumeRendering}
+\setinterfacevariable{ResumeSound}{RepornesteSunet}
+\setinterfacevariable{Romannumerals}{Numereromane}
+\setinterfacevariable{SaveDocument}{SalvareDocument}
+\setinterfacevariable{SaveForm}{SalveazaFormular}
+\setinterfacevariable{SaveNamedDocument}{SaveNamedDocument}
+\setinterfacevariable{SearchAgain}{CautaDinNou}
+\setinterfacevariable{SearchDocument}{CautaDocument}
+\setinterfacevariable{ShowBookmarks}{ShowBookmarks}
+\setinterfacevariable{ShowField}{AfiseazaCamp}
+\setinterfacevariable{ShowThumbs}{ShowThumbs}
+\setinterfacevariable{StartMovie}{StartFilm}
+\setinterfacevariable{StartRendering}{StartRendering}
+\setinterfacevariable{StartSound}{StartSunet}
+\setinterfacevariable{StopMovie}{StopFilm}
+\setinterfacevariable{StopRendering}{StopRendering}
+\setinterfacevariable{StopSound}{StopSunet}
+\setinterfacevariable{SubmitForm}{TrimiteFormular}
+\setinterfacevariable{ToggleLayer}{ToggleLayer}
+\setinterfacevariable{ToggleViewer}{SchimbaVizualizator}
+\setinterfacevariable{URL}{URL}
+\setinterfacevariable{VideLayer}{VideLayer}
+\setinterfacevariable{ViewerHelp}{AjutorVizualizator}
+\setinterfacevariable{WEEKDAY}{ZISAPTAMANA}
+\setinterfacevariable{WORD}{CUVANT}
+\setinterfacevariable{abbreviation}{abreviere}
+\setinterfacevariable{abbreviations}{abrevieri}
+\setinterfacevariable{absolute}{absolut}
+\setinterfacevariable{action}{actiune}
+\setinterfacevariable{after}{dupa}
+\setinterfacevariable{all}{tot}
+\setinterfacevariable{always}{totdeauna}
+\setinterfacevariable{appendices}{apendixuri}
+\setinterfacevariable{appendix}{apendix}
+\setinterfacevariable{april}{aprilie}
+\setinterfacevariable{atmargin}{lamargine}
+\setinterfacevariable{atpage}{lapagina}
+\setinterfacevariable{august}{august}
+\setinterfacevariable{auto}{auto}
+\setinterfacevariable{autointro}{autointro}
+\setinterfacevariable{back}{inapot}
+\setinterfacevariable{background}{fundal}
+\setinterfacevariable{backmatter}{epilogul}
+\setinterfacevariable{backpart}{epilog}
+\setinterfacevariable{backspace}{spatiuspate}
+\setinterfacevariable{backward}{inapoi}
+\setinterfacevariable{before}{inainte}
+\setinterfacevariable{big}{mare}
+\setinterfacevariable{bigbodyfont}{bigbodyfont}
+\setinterfacevariable{bigpreference}{preferintamare}
+\setinterfacevariable{blank}{blank}
+\setinterfacevariable{blockquote}{blockquote}
+\setinterfacevariable{bodymatter}{principalul}
+\setinterfacevariable{bodypart}{principal}
+\setinterfacevariable{bold}{aldin}
+\setinterfacevariable{bolditalic}{aldinitalic}
+\setinterfacevariable{boldslanted}{aldininclinat}
+\setinterfacevariable{bookmark}{semncarte}
+\setinterfacevariable{both}{ambele}
+\setinterfacevariable{bottom}{subsol}
+\setinterfacevariable{brief}{brief}
+\setinterfacevariable{broad}{broad}
+\setinterfacevariable{buffer}{buffer}
+\setinterfacevariable{by}{de}
+\setinterfacevariable{calligraphic}{caligrafic}
+\setinterfacevariable{cap}{cap}
+\setinterfacevariable{capital}{majuscula}
+\setinterfacevariable{center}{center}
+\setinterfacevariable{chapter}{capitol}
+\setinterfacevariable{character}{caracter}
+\setinterfacevariable{characters}{caractere}
+\setinterfacevariable{color}{culoare}
+\setinterfacevariable{column}{coloana}
+\setinterfacevariable{columns}{coloane}
+\setinterfacevariable{command}{comanda}
+\setinterfacevariable{commands}{comenzi}
+\setinterfacevariable{comment}{comentariu}
+\setinterfacevariable{component}{componenta}
+\setinterfacevariable{concept}{concept}
+\setinterfacevariable{content}{cuprins}
+\setinterfacevariable{contents}{cuprinsuri}
+\setinterfacevariable{continue}{continuu}
+\setinterfacevariable{controls}{controale}
+\setinterfacevariable{conversion}{conversie}
+\setinterfacevariable{current}{curent}
+\setinterfacevariable{cutspace}{cutspace}
+\setinterfacevariable{date}{data}
+\setinterfacevariable{day}{zi}
+\setinterfacevariable{december}{decembrie}
+\setinterfacevariable{default}{implicit}
+\setinterfacevariable{depth}{adancime}
+\setinterfacevariable{description}{descriere}
+\setinterfacevariable{disable}{dezactivat}
+\setinterfacevariable{display}{display}
+\setinterfacevariable{dot}{punct}
+\setinterfacevariable{doublesided}{douafete}
+\setinterfacevariable{each}{fiecare}
+\setinterfacevariable{edge}{bordura}
+\setinterfacevariable{empty}{gol}
+\setinterfacevariable{endnote}{endnote}
+\setinterfacevariable{enumeration}{enumerare}
+\setinterfacevariable{environment}{mediu}
+\setinterfacevariable{even}{par}
+\setinterfacevariable{external}{extern}
+\setinterfacevariable{fact}{fapt}
+\setinterfacevariable{february}{februarie}
+\setinterfacevariable{figure}{figura}
+\setinterfacevariable{figures}{figure}
+\setinterfacevariable{file}{fisier}
+\setinterfacevariable{final}{final}
+\setinterfacevariable{first}{primul}
+\setinterfacevariable{firstcolumn}{firstcolumn}
+\setinterfacevariable{firstpage}{primapagina}
+\setinterfacevariable{firstsubpage}{primasubpagina}
+\setinterfacevariable{fit}{ajustat}
+\setinterfacevariable{five}{cinci}
+\setinterfacevariable{fix}{fix}
+\setinterfacevariable{fixed}{fixat}
+\setinterfacevariable{flexible}{flexibil}
+\setinterfacevariable{float}{obiectmobil}
+\setinterfacevariable{flushinner}{flushinner}
+\setinterfacevariable{flushleft}{flushleft}
+\setinterfacevariable{flushouter}{flushouter}
+\setinterfacevariable{flushright}{flushright}
+\setinterfacevariable{footer}{subsol}
+\setinterfacevariable{footnote}{notasubsol}
+\setinterfacevariable{force}{fortat}
+\setinterfacevariable{foreground}{primplan}
+\setinterfacevariable{formeel}{formeel}
+\setinterfacevariable{formula}{formula}
+\setinterfacevariable{formulae}{formule}
+\setinterfacevariable{forward}{avans}
+\setinterfacevariable{four}{patru}
+\setinterfacevariable{frame}{incadrat}
+\setinterfacevariable{framedtext}{textinconjurat}
+\setinterfacevariable{friday}{vineri}
+\setinterfacevariable{frontmatter}{prologul}
+\setinterfacevariable{frontpart}{prolog}
+\setinterfacevariable{global}{global}
+\setinterfacevariable{graphic}{graficul}
+\setinterfacevariable{graphics}{graficele}
+\setinterfacevariable{gray}{gri}
+\setinterfacevariable{greek}{grec}
+\setinterfacevariable{grid}{grila}
+\setinterfacevariable{halfline}{jumatatelinie}
+\setinterfacevariable{handwritten}{scrismanual}
+\setinterfacevariable{hang}{suspenda}
+\setinterfacevariable{hanging}{suspendat}
+\setinterfacevariable{head}{antet}
+\setinterfacevariable{header}{antet}
+\setinterfacevariable{height}{inaltime}
+\setinterfacevariable{helptext}{textajutator}
+\setinterfacevariable{hencefore}{precedent}
+\setinterfacevariable{here}{aici}
+\setinterfacevariable{hereafter}{urmator}
+\setinterfacevariable{hidden}{ascuns}
+\setinterfacevariable{hiding}{ascundere}
+\setinterfacevariable{high}{inalt}
+\setinterfacevariable{horizontal}{orizontal}
+\setinterfacevariable{hyphenated}{despsilabe}
+\setinterfacevariable{hz}{hz}
+\setinterfacevariable{inbetween}{intre}
+\setinterfacevariable{index}{index}
+\setinterfacevariable{indices}{indexuri}
+\setinterfacevariable{informeel}{informeel}
+\setinterfacevariable{inherit}{inherit}
+\setinterfacevariable{inleft}{instanga}
+\setinterfacevariable{inmargin}{inmargine}
+\setinterfacevariable{inner}{intern}
+\setinterfacevariable{inneredge}{inneredge}
+\setinterfacevariable{innermargin}{innermargin}
+\setinterfacevariable{inright}{indreapta}
+\setinterfacevariable{interaction}{interactiune}
+\setinterfacevariable{interactionmenu}{meniuinteractiune}
+\setinterfacevariable{intermezzi}{intermezzi}
+\setinterfacevariable{intermezzo}{intermezzo}
+\setinterfacevariable{intext}{intext}
+\setinterfacevariable{intro}{intro}
+\setinterfacevariable{italic}{italic}
+\setinterfacevariable{italicbold}{italicaldin}
+\setinterfacevariable{item}{element}
+\setinterfacevariable{itemize}{enumerare}
+\setinterfacevariable{its}{propriu}
+\setinterfacevariable{january}{ianuarie}
+\setinterfacevariable{joinedup}{unit}
+\setinterfacevariable{july}{iulie}
+\setinterfacevariable{june}{iunie}
+\setinterfacevariable{keep}{mentine}
+\setinterfacevariable{knockout}{knockout}
+\setinterfacevariable{label}{eticheta}
+\setinterfacevariable{landscape}{vedere}
+\setinterfacevariable{last}{ultim}
+\setinterfacevariable{lastcolumn}{lastcolumn}
+\setinterfacevariable{lastpage}{ultimapagina}
+\setinterfacevariable{lastpagenumber}{lastpagenumber}
+\setinterfacevariable{lastsubpage}{ultimasubpagina}
+\setinterfacevariable{left}{stanga}
+\setinterfacevariable{leftedge}{bordurastanga}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{marginestanga}
+\setinterfacevariable{leftpage}{paginastanga}
+\setinterfacevariable{legend}{legenda}
+\setinterfacevariable{lesshyphenation}{lesshyphenation}
+\setinterfacevariable{line}{linie}
+\setinterfacevariable{linenote}{linenote}
+\setinterfacevariable{lines}{linii}
+\setinterfacevariable{list}{lista}
+\setinterfacevariable{local}{local}
+\setinterfacevariable{localenvironment}{mediulocal}
+\setinterfacevariable{logo}{logo}
+\setinterfacevariable{logos}{logos}
+\setinterfacevariable{lohi}{lohi}
+\setinterfacevariable{loose}{larg}
+\setinterfacevariable{low}{jos}
+\setinterfacevariable{ls}{ls}
+\setinterfacevariable{makeup}{marcaj}
+\setinterfacevariable{mar}{mar}
+\setinterfacevariable{march}{martie}
+\setinterfacevariable{margin}{margine}
+\setinterfacevariable{marginedge}{marginebordura}
+\setinterfacevariable{margintitle}{titlumarginal}
+\setinterfacevariable{marking}{marcaje}
+\setinterfacevariable{mathalignment}{mathalignment}
+\setinterfacevariable{mathcases}{mathcases}
+\setinterfacevariable{mathmatrix}{mathmatrix}
+\setinterfacevariable{max}{max}
+\setinterfacevariable{may}{mai}
+\setinterfacevariable{mediaeval}{medieval}
+\setinterfacevariable{medium}{mediu}
+\setinterfacevariable{middle}{centru}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{minheight}{inaltimeminima}
+\setinterfacevariable{minwidth}{latimeminima}
+\setinterfacevariable{mirrored}{oglindit}
+\setinterfacevariable{monday}{luni}
+\setinterfacevariable{mono}{mono}
+\setinterfacevariable{month}{luna}
+\setinterfacevariable{morehyphenation}{morehyphenation}
+\setinterfacevariable{name}{nume}
+\setinterfacevariable{narrow}{ingust}
+\setinterfacevariable{negative}{negativ}
+\setinterfacevariable{never}{niciodata}
+\setinterfacevariable{new}{nou}
+\setinterfacevariable{next}{urmatorul}
+\setinterfacevariable{nextevenpage}{paginaparaurmatoarea}
+\setinterfacevariable{nextoddpage}{paginaimparaurmatoarea}
+\setinterfacevariable{nextpage}{paginaurmatoare}
+\setinterfacevariable{nextsubpage}{urmatoareasubpagina}
+\setinterfacevariable{no}{nu}
+\setinterfacevariable{nocheck}{nocheck}
+\setinterfacevariable{nofit}{nofit}
+\setinterfacevariable{nogrid}{nogrid}
+\setinterfacevariable{nohz}{nohz}
+\setinterfacevariable{nomarking}{faramarcare}
+\setinterfacevariable{none}{niciunul}
+\setinterfacevariable{nonumber}{nonumber}
+\setinterfacevariable{normal}{normal}
+\setinterfacevariable{nospacing}{nospacing}
+\setinterfacevariable{not}{nu}
+\setinterfacevariable{nothanging}{nothanging}
+\setinterfacevariable{nothyphenated}{nedespsilabe}
+\setinterfacevariable{november}{noiembrie}
+\setinterfacevariable{nowhere}{niciunde}
+\setinterfacevariable{nowhite}{faraalb}
+\setinterfacevariable{number}{numar}
+\setinterfacevariable{numbers}{numere}
+\setinterfacevariable{october}{octombrie}
+\setinterfacevariable{odd}{impar}
+\setinterfacevariable{off}{dezactivat}
+\setinterfacevariable{offset}{offset}
+\setinterfacevariable{old}{old}
+\setinterfacevariable{on}{on}
+\setinterfacevariable{one}{unu}
+\setinterfacevariable{opposite}{opus}
+\setinterfacevariable{outer}{extern}
+\setinterfacevariable{outeredge}{outeredge}
+\setinterfacevariable{outermargin}{outermargin}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{packed}{impachetat}
+\setinterfacevariable{page}{pagina}
+\setinterfacevariable{pagecomment}{comentariupagina}
+\setinterfacevariable{pagenumber}{numarpagina}
+\setinterfacevariable{paper}{foaie}
+\setinterfacevariable{paragraph}{paragraf}
+\setinterfacevariable{part}{parte}
+\setinterfacevariable{positive}{positiv}
+\setinterfacevariable{postponing}{postponing}
+\setinterfacevariable{postscript}{postscript}
+\setinterfacevariable{preference}{preferinta}
+\setinterfacevariable{preview}{previzualizare}
+\setinterfacevariable{previous}{precedent}
+\setinterfacevariable{previousevenpage}{paginaparaprecedenta}
+\setinterfacevariable{previousoddpage}{paginaimparaprecedenta}
+\setinterfacevariable{previouspage}{paginaanterioara}
+\setinterfacevariable{previoussubpage}{subpaginaanterioara}
+\setinterfacevariable{printable}{tiparibil}
+\setinterfacevariable{process}{process}
+\setinterfacevariable{product}{produs}
+\setinterfacevariable{program}{program}
+\setinterfacevariable{project}{proiect}
+\setinterfacevariable{protected}{protejat}
+\setinterfacevariable{quadruple}{cvadrupul}
+\setinterfacevariable{quotation}{citat}
+\setinterfacevariable{quote}{minicitat}
+\setinterfacevariable{ran}{rulat}
+\setinterfacevariable{random}{aleator}
+\setinterfacevariable{readonly}{readonly}
+\setinterfacevariable{rectangular}{rectangular}
+\setinterfacevariable{referral}{referinta}
+\setinterfacevariable{register}{registru}
+\setinterfacevariable{regular}{regular}
+\setinterfacevariable{rekening}{rekening}
+\setinterfacevariable{relative}{relativ}
+\setinterfacevariable{repeat}{repetat}
+\setinterfacevariable{required}{obligatoriu}
+\setinterfacevariable{reset}{reset}
+\setinterfacevariable{reverse}{reverse}
+\setinterfacevariable{right}{dreapta}
+\setinterfacevariable{rightedge}{borduradreapta}
+\setinterfacevariable{righthanging}{righthanging}
+\setinterfacevariable{rightmargin}{marginedreapta}
+\setinterfacevariable{rightpage}{paginadreapta}
+\setinterfacevariable{roman}{roman}
+\setinterfacevariable{romannumerals}{numereromane}
+\setinterfacevariable{rotate}{rotit}
+\setinterfacevariable{rotated}{rotat}
+\setinterfacevariable{round}{rotund}
+\setinterfacevariable{row}{rand}
+\setinterfacevariable{rule}{rigla}
+\setinterfacevariable{samepage}{aceeasipagina}
+\setinterfacevariable{sans}{sans}
+\setinterfacevariable{sansbold}{sansaldin}
+\setinterfacevariable{sansserif}{sansserif}
+\setinterfacevariable{saturday}{sambata}
+\setinterfacevariable{screen}{ecran}
+\setinterfacevariable{section}{sectiune}
+\setinterfacevariable{sectionblockenvironment}{blocsectiuneambient}
+\setinterfacevariable{sectionnumber}{numarsetiune}
+\setinterfacevariable{see}{vezi}
+\setinterfacevariable{september}{septembrie}
+\setinterfacevariable{serif}{serif}
+\setinterfacevariable{serried}{serried}
+\setinterfacevariable{setups}{setari}
+\setinterfacevariable{sheet}{sheet}
+\setinterfacevariable{singlesided}{ofata}
+\setinterfacevariable{slanted}{inclinat}
+\setinterfacevariable{slantedbold}{inclinataldin}
+\setinterfacevariable{small}{mic}
+\setinterfacevariable{smallbodyfont}{smallbodyfont}
+\setinterfacevariable{smallbold}{micaldin}
+\setinterfacevariable{smallbolditalic}{micaldininclinat}
+\setinterfacevariable{smallboldslanted}{micaldininclinat}
+\setinterfacevariable{smallcaps}{majusculemici}
+\setinterfacevariable{smallitalic}{micitalic}
+\setinterfacevariable{smallitalicbold}{micitalicaldin}
+\setinterfacevariable{smallnormal}{micnormal}
+\setinterfacevariable{smallslanted}{micinclinat}
+\setinterfacevariable{smallslantedbold}{micinclinataldin}
+\setinterfacevariable{smalltype}{mictype}
+\setinterfacevariable{somewhere}{undeva}
+\setinterfacevariable{sorted}{sortat}
+\setinterfacevariable{space}{spatiu}
+\setinterfacevariable{spacing}{spatiere}
+\setinterfacevariable{speech}{speech}
+\setinterfacevariable{split}{split}
+\setinterfacevariable{spot}{spot}
+\setinterfacevariable{standard}{standard}
+\setinterfacevariable{start}{start}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{stop}
+\setinterfacevariable{stopper}{stopper}
+\setinterfacevariable{stretch}{dilatat}
+\setinterfacevariable{strict}{strict}
+\setinterfacevariable{strong}{strong}
+\setinterfacevariable{strut}{strut}
+\setinterfacevariable{sub}{sub}
+\setinterfacevariable{subbackward}{subinapoi}
+\setinterfacevariable{subformula}{subformula}
+\setinterfacevariable{subforward}{subavans}
+\setinterfacevariable{subject}{subiect}
+\setinterfacevariable{subpage}{subpagina}
+\setinterfacevariable{subsection}{subsectiune}
+\setinterfacevariable{subsubject}{subsubiect}
+\setinterfacevariable{subsubsection}{subsubsectiune}
+\setinterfacevariable{subsubsubject}{subsubsubiect}
+\setinterfacevariable{subsubsubsection}{subsubsubsectiune}
+\setinterfacevariable{subsubsubsubject}{subsubsubsubiect}
+\setinterfacevariable{subsubsubsubsection}{subsubsubsubsectiune}
+\setinterfacevariable{subsubsubsubsubject}{subsubsubsubsubiect}
+\setinterfacevariable{subsubsubsubsubsection}{subsubsubsubsubsectiune}
+\setinterfacevariable{subsubsubsubsubsubject}{subsubsubsubsubsubiect}
+\setinterfacevariable{sunday}{duminica}
+\setinterfacevariable{support}{suport}
+\setinterfacevariable{sym}{sym}
+\setinterfacevariable{symbol}{simbol}
+\setinterfacevariable{synchronize}{synchronize}
+\setinterfacevariable{system}{sistem}
+\setinterfacevariable{table}{tabelul}
+\setinterfacevariable{tablehead}{antettabel}
+\setinterfacevariable{tables}{tabelele}
+\setinterfacevariable{tabletail}{subsoltabel}
+\setinterfacevariable{tabulate}{tabulate}
+\setinterfacevariable{tabulatehead}{tabulatehead}
+\setinterfacevariable{tabulatetail}{tabulatetail}
+\setinterfacevariable{tall}{inalt}
+\setinterfacevariable{teletype}{teletype}
+\setinterfacevariable{temporary}{temporar}
+\setinterfacevariable{test}{test}
+\setinterfacevariable{text}{text}
+\setinterfacevariable{three}{trei}
+\setinterfacevariable{thursday}{joi}
+\setinterfacevariable{title}{titlu}
+\setinterfacevariable{toggle}{toggle}
+\setinterfacevariable{tolerant}{tolerant}
+\setinterfacevariable{top}{sus}
+\setinterfacevariable{tuesday}{marti}
+\setinterfacevariable{two}{doi}
+\setinterfacevariable{txt}{txt}
+\setinterfacevariable{type}{type}
+\setinterfacevariable{typing}{typing}
+\setinterfacevariable{unavailable}{nedisponibil}
+\setinterfacevariable{unit}{unitate}
+\setinterfacevariable{units}{unitati}
+\setinterfacevariable{unknown}{necunoscut}
+\setinterfacevariable{unpacked}{despachetat}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{folosit}
+\setinterfacevariable{value}{valoare}
+\setinterfacevariable{vertical}{vertical}
+\setinterfacevariable{very}{foarte}
+\setinterfacevariable{verystrict}{foartestrict}
+\setinterfacevariable{verytolerant}{foartetolerant}
+\setinterfacevariable{weak}{weak}
+\setinterfacevariable{wednesday}{miercuri}
+\setinterfacevariable{week}{saptamana}
+\setinterfacevariable{weekday}{zisaptamana}
+\setinterfacevariable{white}{alb}
+\setinterfacevariable{wide}{larg}
+\setinterfacevariable{width}{latime}
+\setinterfacevariable{xml}{xml}
+\setinterfacevariable{year}{an}
+\setinterfacevariable{yes}{da}
+% definitions for interface constants for language ro
+%
+\setinterfaceconstant{action}{actiune}
+\setinterfaceconstant{address}{adresa}
+\setinterfaceconstant{after}{dupa}
+\setinterfaceconstant{afterhead}{dupatitlu}
+\setinterfaceconstant{afterkey}{dupatasta}
+\setinterfaceconstant{align}{aliniere}
+\setinterfaceconstant{aligncharacter}{aliniazacaracter}
+\setinterfaceconstant{alignmentcharacter}{alierecaracter}
+\setinterfaceconstant{aligntitle}{alinieretitlu}
+\setinterfaceconstant{alternative}{alternativ}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{sageata}
+\setinterfaceconstant{at}{la}
+\setinterfaceconstant{author}{autor}
+\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autofile}{autofile}
+\setinterfaceconstant{autofocus}{autofocus}
+\setinterfaceconstant{autohang}{autohang}
+\setinterfaceconstant{autostrut}{autostrut}
+\setinterfaceconstant{autowidth}{autolatime}
+\setinterfaceconstant{axis}{axa}
+\setinterfaceconstant{background}{fundal}
+\setinterfaceconstant{backgroundcolor}{culoarefundal}
+\setinterfaceconstant{backgroundcorner}{coltfundal}
+\setinterfaceconstant{backgrounddepth}{adancimefundal}
+\setinterfaceconstant{backgroundoffset}{offsetfundal}
+\setinterfaceconstant{backgroundradius}{razafundal}
+\setinterfaceconstant{backgroundscreen}{ecranfundal}
+\setinterfaceconstant{backspace}{spatiuspate}
+\setinterfaceconstant{balance}{balanta}
+\setinterfaceconstant{before}{inainte}
+\setinterfaceconstant{beforehead}{inaintetitlu}
+\setinterfaceconstant{bet}{bet}
+\setinterfaceconstant{big}{mare}
+\setinterfaceconstant{blank}{blanc}
+\setinterfaceconstant{blockway}{blockway}
+\setinterfaceconstant{bodyfont}{fonttext}
+\setinterfaceconstant{bookmark}{semncarte}
+\setinterfaceconstant{bottom}{jos}
+\setinterfaceconstant{bottomdistance}{distantajos}
+\setinterfaceconstant{bottomframe}{framejos}
+\setinterfaceconstant{bottomoffset}{offsetjos}
+\setinterfaceconstant{bottomspace}{spatiujos}
+\setinterfaceconstant{bottomstate}{starejos}
+\setinterfaceconstant{cache}{cache}
+\setinterfaceconstant{calculate}{calculeaza}
+\setinterfaceconstant{ccommand}{comandac}
+\setinterfaceconstant{click}{click}
+\setinterfaceconstant{clickin}{clickintru}
+\setinterfaceconstant{clickout}{clickies}
+\setinterfaceconstant{clipoffset}{clipoffset}
+\setinterfaceconstant{closeaction}{actiuneinchidere}
+\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepageaction}{actiuneinchiderepagina}
+\setinterfaceconstant{closesymbol}{closesymbol}
+\setinterfaceconstant{color}{culoare}
+\setinterfaceconstant{column}{coloana}
+\setinterfaceconstant{columndistance}{distantacoloane}
+\setinterfaceconstant{columns}{coloane}
+\setinterfaceconstant{command}{comanda}
+\setinterfaceconstant{commandafter}{comandadupa}
+\setinterfaceconstant{commandbefore}{comandainainte}
+\setinterfaceconstant{commands}{comenzi}
+\setinterfaceconstant{component}{component}
+\setinterfaceconstant{compoundhyphen}{compoundhyphen}
+\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{continue}{continua}
+\setinterfaceconstant{contrastcolor}{culoarecontrast}
+\setinterfaceconstant{controls}{controale}
+\setinterfaceconstant{conversion}{conversie}
+\setinterfaceconstant{convertfile}{convertestefisier}
+\setinterfaceconstant{corner}{colt}
+\setinterfaceconstant{coupling}{cuplare}
+\setinterfaceconstant{couplingway}{modcuplare}
+\setinterfaceconstant{criterium}{criteriu}
+\setinterfaceconstant{current}{curent}
+\setinterfaceconstant{cutspace}{cutspace}
+\setinterfaceconstant{dash}{dash}
+\setinterfaceconstant{dat}{dat}
+\setinterfaceconstant{date}{data}
+\setinterfaceconstant{deepnumbercommand}{deepnumbercommand}
+\setinterfaceconstant{deeptextcommand}{deeptextcommand}
+\setinterfaceconstant{default}{implicit}
+\setinterfaceconstant{delay}{intarziere}
+\setinterfaceconstant{depth}{inaltime}
+\setinterfaceconstant{depthcorrection}{corectieadancime}
+\setinterfaceconstant{direction}{directie}
+\setinterfaceconstant{directory}{director}
+\setinterfaceconstant{display}{display}
+\setinterfaceconstant{distance}{distanta}
+\setinterfaceconstant{dot}{punct}
+\setinterfaceconstant{doublesided}{douafete}
+\setinterfaceconstant{dummy}{dummy}
+\setinterfaceconstant{dx}{dx}
+\setinterfaceconstant{dy}{dy}
+\setinterfaceconstant{edge}{bordura}
+\setinterfaceconstant{edgedistance}{distantabordura}
+\setinterfaceconstant{empty}{gol}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{marginepara}
+\setinterfaceconstant{expansion}{expansiune}
+\setinterfaceconstant{extras}{extras}
+\setinterfaceconstant{factor}{factor}
+\setinterfaceconstant{fallback}{fallback}
+\setinterfaceconstant{family}{familie}
+\setinterfaceconstant{fieldbackgroundcolor}{culoarefundalcamp}
+\setinterfaceconstant{fieldframecolor}{culoareframecamp}
+\setinterfaceconstant{fieldlayer}{fieldlayer}
+\setinterfaceconstant{fieldoffset}{offsetcamp}
+\setinterfaceconstant{file}{fisier}
+\setinterfaceconstant{focus}{focus}
+\setinterfaceconstant{focusin}{focusin}
+\setinterfaceconstant{focusout}{focusout}
+\setinterfaceconstant{footer}{subsol}
+\setinterfaceconstant{footerdistance}{distantasubsol}
+\setinterfaceconstant{footerstate}{staresubsol}
+\setinterfaceconstant{foregroundcolor}{foregroundcolor}
+\setinterfaceconstant{foregroundstyle}{foregroundstyle}
+\setinterfaceconstant{format}{format}
+\setinterfaceconstant{frame}{frame}
+\setinterfaceconstant{framecolor}{culoareframe}
+\setinterfaceconstant{framecorner}{coltframe}
+\setinterfaceconstant{framedepth}{adancimeframe}
+\setinterfaceconstant{frameoffset}{offsetframe}
+\setinterfaceconstant{frameradius}{razaframe}
+\setinterfaceconstant{frames}{frames}
+\setinterfaceconstant{from}{dela}
+\setinterfaceconstant{get}{adu}
+\setinterfaceconstant{global}{global}
+\setinterfaceconstant{grid}{grid}
+\setinterfaceconstant{hang}{suspenda}
+\setinterfaceconstant{headcolor}{culoaretitlu}
+\setinterfaceconstant{headcommand}{headcommand}
+\setinterfaceconstant{headconversion}{conversietitlu}
+\setinterfaceconstant{header}{antet}
+\setinterfaceconstant{headerdistance}{distantaantet}
+\setinterfaceconstant{headerstate}{stareantet}
+\setinterfaceconstant{headlabel}{etichetatitlu}
+\setinterfaceconstant{headnumber}{numartitlu}
+\setinterfaceconstant{headstyle}{stiltitlu}
+\setinterfaceconstant{height}{inaltime}
+\setinterfaceconstant{hfactor}{hfactor}
+\setinterfaceconstant{hfil}{hfil}
+\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horoffset}{offsetoriz}
+\setinterfaceconstant{hyphen}{hyphen}
+\setinterfaceconstant{icommand}{comandai}
+\setinterfaceconstant{in}{in}
+\setinterfaceconstant{inbetween}{intre}
+\setinterfaceconstant{increment}{increment}
+\setinterfaceconstant{incrementnumber}{numarincrement}
+\setinterfaceconstant{indenting}{aliniat}
+\setinterfaceconstant{indentnext}{aliniaturmator}
+\setinterfaceconstant{indicator}{indicator}
+\setinterfaceconstant{inner}{intern}
+\setinterfaceconstant{innermargin}{innermargin}
+\setinterfaceconstant{inputfile}{inputfile}
+\setinterfaceconstant{interaction}{interactiune}
+\setinterfaceconstant{interlinespace}{spatiereinterliniara}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{elemente}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{keyword}
+\setinterfaceconstant{label}{eticheta}
+\setinterfaceconstant{left}{stanga}
+\setinterfaceconstant{leftcolor}{culoarestanga}
+\setinterfaceconstant{leftcompoundhyphen}{leftcompoundhyphen}
+\setinterfaceconstant{leftedge}{bordurastanga}
+\setinterfaceconstant{leftedgedistance}{distantabordurastanga}
+\setinterfaceconstant{leftframe}{framestanga}
+\setinterfaceconstant{lefthyphen}{lefthyphen}
+\setinterfaceconstant{leftmargin}{marginestanga}
+\setinterfaceconstant{leftmargindistance}{distantamarginestanga}
+\setinterfaceconstant{leftoffset}{offsetstanga}
+\setinterfaceconstant{leftquotation}{citatstanga}
+\setinterfaceconstant{leftquote}{minicitatstanga}
+\setinterfaceconstant{leftsentence}{propozitiestanga}
+\setinterfaceconstant{leftspeech}{leftspeech}
+\setinterfaceconstant{leftstyle}{stilstanga}
+\setinterfaceconstant{leftsubsentence}{subpropozitiestanga}
+\setinterfaceconstant{lefttext}{textstanga}
+\setinterfaceconstant{leftwidth}{latimestanga}
+\setinterfaceconstant{level}{nivel}
+\setinterfaceconstant{levels}{nivele}
+\setinterfaceconstant{limittext}{limittext}
+\setinterfaceconstant{line}{linie}
+\setinterfaceconstant{linecorrection}{corectielinie}
+\setinterfaceconstant{lines}{linii}
+\setinterfaceconstant{list}{lista}
+\setinterfaceconstant{listtext}{listtext}
+\setinterfaceconstant{local}{local}
+\setinterfaceconstant{location}{locatie}
+\setinterfaceconstant{logo}{logo}
+\setinterfaceconstant{logos}{logos}
+\setinterfaceconstant{marcolor}{culoaremarcaj}
+\setinterfaceconstant{margin}{margine}
+\setinterfaceconstant{margindistance}{distantamargine}
+\setinterfaceconstant{marginedge}{coltbordura}
+\setinterfaceconstant{marginedgetext}{textcoltbordura}
+\setinterfaceconstant{margintext}{textmargine}
+\setinterfaceconstant{marking}{marcaje}
+\setinterfaceconstant{marstyle}{stilmarcaj}
+\setinterfaceconstant{max}{max}
+\setinterfaceconstant{maxheight}{inaltimemaxima}
+\setinterfaceconstant{maxwidth}{latimemaxima}
+\setinterfaceconstant{menu}{meniu}
+\setinterfaceconstant{method}{metoda}
+\setinterfaceconstant{middle}{mijloc}
+\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middletext}{textmijloc}
+\setinterfaceconstant{midsentence}{midsentence}
+\setinterfaceconstant{min}{min}
+\setinterfaceconstant{mindepth}{mindepth}
+\setinterfaceconstant{minheight}{inaltimeminima}
+\setinterfaceconstant{minwidth}{latimeminima}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{nume}
+\setinterfaceconstant{nbottom}{njos}
+\setinterfaceconstant{nc}{nc}
+\setinterfaceconstant{next}{urmatorul}
+\setinterfaceconstant{nl}{nl}
+\setinterfaceconstant{nleft}{nstanga}
+\setinterfaceconstant{nlines}{nlinii}
+\setinterfaceconstant{norm}{norm}
+\setinterfaceconstant{nr}{nr}
+\setinterfaceconstant{nright}{ndreapta}
+\setinterfaceconstant{ntop}{nsus}
+\setinterfaceconstant{number}{numar}
+\setinterfaceconstant{numbercolor}{culoarenumar}
+\setinterfaceconstant{numbercommand}{comandanumar}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numerotare}
+\setinterfaceconstant{numberseparator}{separatornumar}
+\setinterfaceconstant{numberstyle}{stilnumar}
+\setinterfaceconstant{numberwidth}{numberwidth}
+\setinterfaceconstant{nx}{nx}
+\setinterfaceconstant{ny}{ny}
+\setinterfaceconstant{object}{obiect}
+\setinterfaceconstant{obstruction}{obstructie}
+\setinterfaceconstant{oddmargin}{margineimpara}
+\setinterfaceconstant{offset}{offset}
+\setinterfaceconstant{openaction}{actiunedeschidere}
+\setinterfaceconstant{openpageaction}{actiunedeschiderepagina}
+\setinterfaceconstant{option}{optiune}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{outermargin}{outermargin}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{numarpropriu}
+\setinterfaceconstant{page}{pagina}
+\setinterfaceconstant{pageboundaries}{marginipagina}
+\setinterfaceconstant{pagecolor}{culoarepagina}
+\setinterfaceconstant{pagecommand}{comandapagina}
+\setinterfaceconstant{pagenumber}{numarpagina}
+\setinterfaceconstant{pagestate}{pagestate}
+\setinterfaceconstant{pagestyle}{stilpagina}
+\setinterfaceconstant{palet}{paleta}
+\setinterfaceconstant{paper}{hartie}
+\setinterfaceconstant{paragraph}{paragraf}
+\setinterfaceconstant{place}{pune}
+\setinterfaceconstant{placehead}{punetitlu}
+\setinterfaceconstant{placestopper}{punestopper}
+\setinterfaceconstant{position}{pozitie}
+\setinterfaceconstant{prefix}{prefix}
+\setinterfaceconstant{preset}{preset}
+\setinterfaceconstant{preview}{previzualizare}
+\setinterfaceconstant{previous}{precendent}
+\setinterfaceconstant{previousnumber}{numarprecedent}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{radius}{raza}
+\setinterfaceconstant{random}{aleator}
+\setinterfaceconstant{reduction}{reducere}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{reference}{referinta}
+\setinterfaceconstant{referencing}{referinta}
+\setinterfaceconstant{regionin}{regiuneintrare}
+\setinterfaceconstant{regionout}{regiuneiesire}
+\setinterfaceconstant{repeat}{repeta}
+\setinterfaceconstant{reset}{reset}
+\setinterfaceconstant{resetnumber}{resetnumber}
+\setinterfaceconstant{resolution}{rezolutie}
+\setinterfaceconstant{right}{dreapta}
+\setinterfaceconstant{rightcolor}{culoaredreapta}
+\setinterfaceconstant{rightcompoundhyphen}{rightcompoundhyphen}
+\setinterfaceconstant{rightedge}{borduradreapta}
+\setinterfaceconstant{rightedgedistance}{distantacoltdreapta}
+\setinterfaceconstant{rightframe}{framedreapta}
+\setinterfaceconstant{righthyphen}{righthyphen}
+\setinterfaceconstant{rightmargin}{marginedreapta}
+\setinterfaceconstant{rightmargindistance}{distantamarginedreapta}
+\setinterfaceconstant{rightoffset}{offsetdreapta}
+\setinterfaceconstant{rightquotation}{citatdreapta}
+\setinterfaceconstant{rightquote}{minicitatdreapta}
+\setinterfaceconstant{rightsentence}{propozitiedreapta}
+\setinterfaceconstant{rightspeech}{rightspeech}
+\setinterfaceconstant{rightstyle}{stildreapta}
+\setinterfaceconstant{rightsubsentence}{subpropozitiedreapta}
+\setinterfaceconstant{righttext}{textdreapta}
+\setinterfaceconstant{rightwidth}{marginedreapta}
+\setinterfaceconstant{rotation}{rotatie}
+\setinterfaceconstant{rule}{rigla}
+\setinterfaceconstant{rulecolor}{culoarerigla}
+\setinterfaceconstant{rulethickness}{grosimerigla}
+\setinterfaceconstant{samepage}{aceeasipagina}
+\setinterfaceconstant{sample}{exemplu}
+\setinterfaceconstant{scale}{scala}
+\setinterfaceconstant{scope}{scop}
+\setinterfaceconstant{screen}{ecran}
+\setinterfaceconstant{section}{sectiune}
+\setinterfaceconstant{sectionnumber}{numarsectiune}
+\setinterfaceconstant{separator}{separator}
+\setinterfaceconstant{set}{set}
+\setinterfaceconstant{setups}{setups}
+\setinterfaceconstant{side}{parte}
+\setinterfaceconstant{sidealign}{sidealign}
+\setinterfaceconstant{sidemethod}{sidemethod}
+\setinterfaceconstant{sidespaceafter}{spatiulateraldupa}
+\setinterfaceconstant{sidespacebefore}{spatiulateralinainte}
+\setinterfaceconstant{sign}{semn}
+\setinterfaceconstant{size}{dimensiune}
+\setinterfaceconstant{small}{mic}
+\setinterfaceconstant{sorttype}{sorttype}
+\setinterfaceconstant{source}{sursa}
+\setinterfaceconstant{space}{spatiu}
+\setinterfaceconstant{spaceafter}{spatiudupa}
+\setinterfaceconstant{spacebefore}{spatiuinainte}
+\setinterfaceconstant{spaceinbetween}{spaceinbetween}
+\setinterfaceconstant{spacing}{spatiere}
+\setinterfaceconstant{split}{split}
+\setinterfaceconstant{splitcolor}{splitcolor}
+\setinterfaceconstant{splitmethod}{splitmethod}
+\setinterfaceconstant{splitoffset}{splitoffset}
+\setinterfaceconstant{spot}{spot}
+\setinterfaceconstant{stack}{stack}
+\setinterfaceconstant{start}{start}
+\setinterfaceconstant{state}{stare}
+\setinterfaceconstant{step}{pas}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{stopper}
+\setinterfaceconstant{stretch}{dilatat}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{stil}
+\setinterfaceconstant{sub}{sub}
+\setinterfaceconstant{subtitle}{subtitlu}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{sx}{sx}
+\setinterfaceconstant{sy}{sy}
+\setinterfaceconstant{symalign}{symaliniere}
+\setinterfaceconstant{symbol}{simbol}
+\setinterfaceconstant{symbolset}{setsimbol}
+\setinterfaceconstant{symcolor}{culoaresimbol}
+\setinterfaceconstant{symstyle}{stilsimbol}
+\setinterfaceconstant{synonym}{sinonim}
+\setinterfaceconstant{synonymcolor}{culoaresinonim}
+\setinterfaceconstant{synonymstyle}{stilsinonim}
+\setinterfaceconstant{tab}{tab}
+\setinterfaceconstant{text}{text}
+\setinterfaceconstant{textcolor}{culoaretext}
+\setinterfaceconstant{textcommand}{comandatext}
+\setinterfaceconstant{textdistance}{textdistance}
+\setinterfaceconstant{textlayer}{textlayer}
+\setinterfaceconstant{textmargin}{textmargin}
+\setinterfaceconstant{textmethod}{textmethod}
+\setinterfaceconstant{textseparator}{separatortext}
+\setinterfaceconstant{textsize}{dimensiunetext}
+\setinterfaceconstant{textstate}{staretext}
+\setinterfaceconstant{textstyle}{stiltext}
+\setinterfaceconstant{textwidth}{latimetext}
+\setinterfaceconstant{title}{titlu}
+\setinterfaceconstant{titlecolor}{culoaretitlu}
+\setinterfaceconstant{titlecommand}{titlecommand}
+\setinterfaceconstant{titledistance}{distantatitlu}
+\setinterfaceconstant{titleleft}{titleleft}
+\setinterfaceconstant{titleright}{titleright}
+\setinterfaceconstant{titlestyle}{stiltitlu}
+\setinterfaceconstant{to}{catre}
+\setinterfaceconstant{tolerance}{toleranta}
+\setinterfaceconstant{top}{sus}
+\setinterfaceconstant{topdistance}{distantasus}
+\setinterfaceconstant{topframe}{framesus}
+\setinterfaceconstant{topoffset}{offsetsus}
+\setinterfaceconstant{topspace}{spatiusus}
+\setinterfaceconstant{topstate}{staresus}
+\setinterfaceconstant{type}{type}
+\setinterfaceconstant{unit}{unitate}
+\setinterfaceconstant{unknownreference}{referintanecunoscuta}
+\setinterfaceconstant{urlalternative}{urlalternativ}
+\setinterfaceconstant{urlspace}{spatiuurl}
+\setinterfaceconstant{validate}{verifica}
+\setinterfaceconstant{vcommand}{comandav}
+\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vfil}{vfil}
+\setinterfaceconstant{voffset}{voffset}
+\setinterfaceconstant{way}{mod}
+\setinterfaceconstant{wfactor}{factorw}
+\setinterfaceconstant{white}{alb}
+\setinterfaceconstant{width}{latime}
+\setinterfaceconstant{xfactor}{xfactor}
+\setinterfaceconstant{xmax}{xmax}
+\setinterfaceconstant{xoffset}{xoffset}
+\setinterfaceconstant{xscale}{xscala}
+\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yfactor}{yfactor}
+\setinterfaceconstant{ymax}{ymax}
+\setinterfaceconstant{yoffset}{yoffset}
+\setinterfaceconstant{yscale}{yscala}
+\setinterfaceconstant{ystep}{ystep}
+% definitions for interface elements for language ro
+%
+\setinterfaceelement{begin}{inceput}
+\setinterfaceelement{complete}{complet}
+\setinterfaceelement{coupled}{cuplat}
+\setinterfaceelement{currentlocal}{localcurent}
+\setinterfaceelement{emptyone}{gol}
+\setinterfaceelement{emptytwo}{gol}
+\setinterfaceelement{end}{sfarsit}
+\setinterfaceelement{endsetup}{}
+\setinterfaceelement{get}{get}
+\setinterfaceelement{increment}{increment}
+\setinterfaceelement{list}{lista}
+\setinterfaceelement{listof}{listade}
+\setinterfaceelement{load}{incarca}
+\setinterfaceelement{local}{local}
+\setinterfaceelement{makeup}{makeup}
+\setinterfaceelement{next}{urmatorul}
+\setinterfaceelement{place}{pune}
+\setinterfaceelement{previous}{precedent}
+\setinterfaceelement{previouslocal}{precedentlocal}
+\setinterfaceelement{reserve}{rezervat}
+\setinterfaceelement{see}{vezi}
+\setinterfaceelement{setup}{setare}
+\setinterfaceelement{start}{start}
+\setinterfaceelement{stop}{stop}
+\setinterfaceelement{text}{text}
+\setinterfaceelement{type}{type}
+% definitions for interface commands for language ro
+%
+\setinterfacecommand{CAPPED}{KAP}
+\setinterfacecommand{Character}{Litera}
+\setinterfacecommand{Characters}{Litere}
+\setinterfacecommand{LABELTEXT}{TEXTETICHETA}
+\setinterfacecommand{MONTH}{LUNA}
+\setinterfacecommand{Numbers}{Numere}
+\setinterfacecommand{Romannumerals}{Numereromane}
+\setinterfacecommand{SmallCapped}{Kap}
+\setinterfacecommand{SmallCaps}{Kaps}
+\setinterfacecommand{WEEKDAY}{ZIDINSAPTAMANA}
+\setinterfacecommand{WORD}{CUVANT}
+\setinterfacecommand{WORDS}{CUVINTE}
+\setinterfacecommand{Word}{Cuvant}
+\setinterfacecommand{Words}{Cuvinte}
+\setinterfacecommand{about}{despre}
+\setinterfacecommand{adaptlayout}{adapteazaaspect}
+\setinterfacecommand{arg}{arg}
+\setinterfacecommand{at}{la}
+\setinterfacecommand{atleftmargin}{atleftmargin}
+\setinterfacecommand{atpage}{lapagina}
+\setinterfacecommand{atrightmargin}{atrightmargin}
+\setinterfacecommand{background}{fundal}
+\setinterfacecommand{backspace}{spatiuspate}
+\setinterfacecommand{blackrule}{linieneagra}
+\setinterfacecommand{blackrules}{liniinegre}
+\setinterfacecommand{blank}{blanc}
+\setinterfacecommand{bookmark}{semncarte}
+\setinterfacecommand{bottomdistance}{distantajos}
+\setinterfacecommand{bottomheight}{inaltimejos}
+\setinterfacecommand{bottomspace}{spatiujos}
+\setinterfacecommand{but}{but}
+\setinterfacecommand{button}{buton}
+\setinterfacecommand{bypassblocks}{saripesteblocuri}
+\setinterfacecommand{character}{litera}
+\setinterfacecommand{characters}{litere}
+\setinterfacecommand{chem}{chem}
+\setinterfacecommand{clip}{clip}
+\setinterfacecommand{clonefield}{cloneazacamp}
+\setinterfacecommand{color}{culoare}
+\setinterfacecommand{colorbar}{baraculoare}
+\setinterfacecommand{colorvalue}{valoareculoare}
+\setinterfacecommand{column}{coloana}
+\setinterfacecommand{comment}{comentariu}
+\setinterfacecommand{comparecolorgroup}{comparagrupculoare}
+\setinterfacecommand{comparepalet}{comparapaleta}
+\setinterfacecommand{completepagenumber}{completeazanumarpagina}
+\setinterfacecommand{completeregister}{completeregister}
+\setinterfacecommand{component}{componenta}
+\setinterfacecommand{convertnumber}{convertestenumar}
+\setinterfacecommand{copyfield}{copiazacamp}
+\setinterfacecommand{correctwhitespace}{corecteazaspatiualb}
+\setinterfacecommand{coupledocument}{cupleazadocument}
+\setinterfacecommand{couplemarking}{cupleazamarcaje}
+\setinterfacecommand{couplepage}{paginadubla}
+\setinterfacecommand{couplepaper}{hartiedubla}
+\setinterfacecommand{coupleregister}{cupleazaregistru}
+\setinterfacecommand{crlf}{crlf}
+\setinterfacecommand{currentdate}{datacurenta}
+\setinterfacecommand{currentheadnumber}{numartitlucurent}
+\setinterfacecommand{cutspace}{cutspace}
+\setinterfacecommand{date}{data}
+\setinterfacecommand{decouplemarking}{decupleazamarcaje}
+\setinterfacecommand{decrementnumber}{decrementnumber}
+\setinterfacecommand{define}{defineste}
+\setinterfacecommand{defineaccent}{definesteaccent}
+\setinterfacecommand{defineblank}{definesteblanc}
+\setinterfacecommand{defineblock}{definestebloc}
+\setinterfacecommand{definebodyfont}{definestefonttext}
+\setinterfacecommand{definebodyfontenvironment}{definestemediulfonttext}
+\setinterfacecommand{definebuffer}{definestebuffer}
+\setinterfacecommand{definecharacter}{definestecaracter}
+\setinterfacecommand{definecolor}{definesteculoare}
+\setinterfacecommand{definecolorgroup}{definestegrupculori}
+\setinterfacecommand{definecolumnbreak}{definecolumnbreak}
+\setinterfacecommand{definecolumnset}{definecolumnset}
+\setinterfacecommand{definecombination}{definecombination}
+\setinterfacecommand{definecombinedlist}{definestelistacombinata}
+\setinterfacecommand{definecommand}{definestecomanda}
+\setinterfacecommand{defineconversion}{definesteconversie}
+\setinterfacecommand{definedescription}{definestedescriere}
+\setinterfacecommand{defineenumeration}{definesteenumerare}
+\setinterfacecommand{definefield}{definestecamp}
+\setinterfacecommand{definefieldstack}{definestestivacampuri}
+\setinterfacecommand{definefiguresymbol}{definestesimbolfigura}
+\setinterfacecommand{definefloat}{definestefloat}
+\setinterfacecommand{definefont}{definestefont}
+\setinterfacecommand{definefontstyle}{definestestilfont}
+\setinterfacecommand{definefontsynonym}{definestesinonimfont}
+\setinterfacecommand{defineframed}{definesteinconjurare}
+\setinterfacecommand{defineframedtext}{definestetextinconjurat}
+\setinterfacecommand{definehbox}{definestehbox}
+\setinterfacecommand{definehead}{definesteantet}
+\setinterfacecommand{defineindenting}{definestealiat}
+\setinterfacecommand{defineinmargin}{defineinmargin}
+\setinterfacecommand{defineinteractionmenu}{definestemeniuinteractiune}
+\setinterfacecommand{defineitemgroup}{defineitemgroup}
+\setinterfacecommand{definelabel}{definesteeticheta}
+\setinterfacecommand{definelayer}{definelayer}
+\setinterfacecommand{definelayout}{definelayout}
+\setinterfacecommand{definelist}{definestelista}
+\setinterfacecommand{definelogo}{definestelogo}
+\setinterfacecommand{definemainfield}{definestecampprincipal}
+\setinterfacecommand{definemakeup}{definestemakeup}
+\setinterfacecommand{definemarking}{definestemarcaje}
+\setinterfacecommand{definemathalignment}{definemathalignment}
+\setinterfacecommand{defineoutput}{definesteoutput}
+\setinterfacecommand{defineoverlay}{definesteoverlay}
+\setinterfacecommand{definepagebreak}{definepagebreak}
+\setinterfacecommand{definepalet}{definestepaleta}
+\setinterfacecommand{definepapersize}{definestedimensiunehartie}
+\setinterfacecommand{defineparagraphs}{definesteparagraf}
+\setinterfacecommand{defineplacement}{defineplacement}
+\setinterfacecommand{defineprofile}{definesteprofil}
+\setinterfacecommand{defineprogram}{definesteprogram}
+\setinterfacecommand{definerawfont}{definestefontraw}
+\setinterfacecommand{definereference}{definestereferinte}
+\setinterfacecommand{definereferenceformat}{definesteformatreferinte}
+\setinterfacecommand{definereferencelist}{definestelistareferinte}
+\setinterfacecommand{defineregister}{definesteregistru}
+\setinterfacecommand{definerule}{definesterigla}
+\setinterfacecommand{definesection}{definestesectiune}
+\setinterfacecommand{definesectionblock}{definesteblocsectiune}
+\setinterfacecommand{definesorting}{definestesortare}
+\setinterfacecommand{definestartstop}{definestestartstop}
+\setinterfacecommand{definestyle}{definestestil}
+\setinterfacecommand{definesubfield}{definestesubcamp}
+\setinterfacecommand{definesymbol}{definestesimbol}
+\setinterfacecommand{definesynonyms}{definestesinonim}
+\setinterfacecommand{definetabletemplate}{definestesablontabel}
+\setinterfacecommand{definetabulate}{definestetabulatori}
+\setinterfacecommand{definetext}{definestetext}
+\setinterfacecommand{definetextposition}{definestepozitietext}
+\setinterfacecommand{definetextvariable}{definestevariabilatext}
+\setinterfacecommand{definetype}{definetype}
+\setinterfacecommand{definetyping}{definestetyping}
+\setinterfacecommand{defineversion}{definesteversiune}
+\setinterfacecommand{determineheadnumber}{determinanumartitlu}
+\setinterfacecommand{determinelistcharacteristics}{determinacaracteristicilelistei}
+\setinterfacecommand{determineregistercharacteristics}{determinacaracteristiciregistru}
+\setinterfacecommand{dimension}{dimensiune}
+\setinterfacecommand{disableinteractionmenu}{dezactiveazameniuinteractiune}
+\setinterfacecommand{domicile}{domiciliu}
+\setinterfacecommand{donttest}{nutesta}
+\setinterfacecommand{edgedistance}{distantacolt}
+\setinterfacecommand{edgewidth}{latimecolturi}
+\setinterfacecommand{emptylines}{emptylines}
+\setinterfacecommand{environment}{mediu}
+\setinterfacecommand{externalfigure}{figuraexterna}
+\setinterfacecommand{fact}{fact}
+\setinterfacecommand{field}{camp}
+\setinterfacecommand{fieldstack}{stivacampuri}
+\setinterfacecommand{fillinfield}{campumplere}
+\setinterfacecommand{fillinline}{linieumplere}
+\setinterfacecommand{fillinrules}{rigleumplere}
+\setinterfacecommand{fillintext}{textumplere}
+\setinterfacecommand{fitfield}{potrivestecamp}
+\setinterfacecommand{fixedspace}{spatiufixat}
+\setinterfacecommand{fixedspaces}{spatiifixate}
+\setinterfacecommand{followprofile}{urmeazaprofil}
+\setinterfacecommand{followprofileversion}{urmeazaversiuneprofil}
+\setinterfacecommand{followversion}{urmeazaversiune}
+\setinterfacecommand{footerdistance}{distantasubsol}
+\setinterfacecommand{footerheight}{inaltimesubsol}
+\setinterfacecommand{footnote}{notasubsol}
+\setinterfacecommand{footnotetext}{footnotetext}
+\setinterfacecommand{forceblocks}{forteazablocuri}
+\setinterfacecommand{formulanumber}{numarformula}
+\setinterfacecommand{fraction}{fractie}
+\setinterfacecommand{framed}{framed}
+\setinterfacecommand{from}{din}
+\setinterfacecommand{getbuffer}{adubuffer}
+\setinterfacecommand{getmarking}{adumarcaje}
+\setinterfacecommand{getnumber}{getnumber}
+\setinterfacecommand{godown}{injos}
+\setinterfacecommand{goto}{dute}
+\setinterfacecommand{gotobox}{dutebox}
+\setinterfacecommand{gotopage}{dutepagina}
+\setinterfacecommand{graycolor}{culoaregri}
+\setinterfacecommand{greyvalue}{valoaregri}
+\setinterfacecommand{grid}{grid}
+\setinterfacecommand{hairline}{firdepar}
+\setinterfacecommand{head}{titlu}
+\setinterfacecommand{headerdistance}{distantaantet}
+\setinterfacecommand{headerheight}{inaltimeantet}
+\setinterfacecommand{headlevel}{niveltitlu}
+\setinterfacecommand{headnumber}{numartitlu}
+\setinterfacecommand{headsym}{headsym}
+\setinterfacecommand{headtext}{texttitlu}
+\setinterfacecommand{hideblocks}{ascundeblocuri}
+\setinterfacecommand{high}{inalt}
+\setinterfacecommand{hl}{hl}
+\setinterfacecommand{immediatebetweenlist}{immediatebetweenlist}
+\setinterfacecommand{immediatetolist}{immediatetolist}
+\setinterfacecommand{in}{in}
+\setinterfacecommand{incrementnumber}{numarincrement}
+\setinterfacecommand{indenting}{aliniat}
+\setinterfacecommand{inframed}{inframed}
+\setinterfacecommand{infull}{pelung}
+\setinterfacecommand{ininner}{ininner}
+\setinterfacecommand{inleft}{instanga}
+\setinterfacecommand{inleftedge}{inparteastanga}
+\setinterfacecommand{inleftmargin}{inmargineastanga}
+\setinterfacecommand{inline}{inlinie}
+\setinterfacecommand{inmargin}{marginal}
+\setinterfacecommand{inmframed}{inmaframed}
+\setinterfacecommand{inneredgedistance}{inneredgedistance}
+\setinterfacecommand{inneredgewidth}{inneredgewidth}
+\setinterfacecommand{innermargindistance}{innermargindistance}
+\setinterfacecommand{innermarginwidth}{innermarginwidth}
+\setinterfacecommand{inothermargin}{inaltamargine}
+\setinterfacecommand{inouter}{inouter}
+\setinterfacecommand{inright}{indreapta}
+\setinterfacecommand{inrightedge}{inparteadreapta}
+\setinterfacecommand{inrightmargin}{inmargineadreapta}
+\setinterfacecommand{installlanguage}{instalarelimba}
+\setinterfacecommand{interactionbar}{barainteractiune}
+\setinterfacecommand{interactionbuttons}{butoaneinteractiune}
+\setinterfacecommand{interactionmenu}{meniuinteractiune}
+\setinterfacecommand{item}{element}
+\setinterfacecommand{items}{element}
+\setinterfacecommand{its}{el}
+\setinterfacecommand{keepblocks}{pastreazablocuri}
+\setinterfacecommand{label}{eticheta}
+\setinterfacecommand{labels}{etichete}
+\setinterfacecommand{labeltext}{texteticheta}
+\setinterfacecommand{language}{limba}
+\setinterfacecommand{leftaligned}{aliniatstanga}
+\setinterfacecommand{leftedgedistance}{distantacoltstanga}
+\setinterfacecommand{leftedgewidth}{latimecoltstanga}
+\setinterfacecommand{leftmargindistance}{distantamarginestanga}
+\setinterfacecommand{leftmarginwidth}{latimemarginestanga}
+\setinterfacecommand{leg}{leg}
+\setinterfacecommand{linewidth}{grosimelinie}
+\setinterfacecommand{listheight}{inaltimelista}
+\setinterfacecommand{listlength}{lungimelista}
+\setinterfacecommand{listsymbol}{listsymbol}
+\setinterfacecommand{listwidth}{latimelista}
+\setinterfacecommand{logfields}{logcampuri}
+\setinterfacecommand{lohi}{jossus}
+\setinterfacecommand{low}{jos}
+\setinterfacecommand{macroname}{nume}
+\setinterfacecommand{mainlanguage}{limbaprincipala}
+\setinterfacecommand{makeupheight}{inaltimemakeup}
+\setinterfacecommand{makeupwidth}{latimemakeup}
+\setinterfacecommand{mar}{mar}
+\setinterfacecommand{margindistance}{distantamargine}
+\setinterfacecommand{marginrule}{liniemargine}
+\setinterfacecommand{margintext}{textmarginal}
+\setinterfacecommand{margintitle}{titlumarginal}
+\setinterfacecommand{marginwidth}{latimemargine}
+\setinterfacecommand{marginword}{cuvantmarginal}
+\setinterfacecommand{marking}{marcaje}
+\setinterfacecommand{markversion}{marcheazaversiune}
+\setinterfacecommand{mathematics}{matematica}
+\setinterfacecommand{menubutton}{butonmeniu}
+\setinterfacecommand{mframed}{maframed}
+\setinterfacecommand{midaligned}{aliniatcentru}
+\setinterfacecommand{mirror}{reflexie}
+\setinterfacecommand{month}{luna}
+\setinterfacecommand{moveformula}{moveformula}
+\setinterfacecommand{moveongrid}{mutapegrid}
+\setinterfacecommand{movesidefloat}{movesidefloat}
+\setinterfacecommand{navigating}{navigating}
+\setinterfacecommand{nodimension}{faradimensiune}
+\setinterfacecommand{noheaderandfooterlines}{faraliniiantetsisubsol}
+\setinterfacecommand{noindenting}{faraaliniat}
+\setinterfacecommand{nolist}{faralista}
+\setinterfacecommand{nomarking}{faramarcaje}
+\setinterfacecommand{nomoreblocks}{gatablocuri}
+\setinterfacecommand{nomorefiles}{farafisiere}
+\setinterfacecommand{nop}{nop}
+\setinterfacecommand{nospace}{faraspatiu}
+\setinterfacecommand{note}{nota}
+\setinterfacecommand{notopandbottomlines}{faraliniisussijos}
+\setinterfacecommand{notsmallcapped}{nokap}
+\setinterfacecommand{nowhitespace}{faraspatiualb}
+\setinterfacecommand{numberofsubpages}{numberofsubpages}
+\setinterfacecommand{numbers}{numere}
+\setinterfacecommand{outeredgedistance}{outeredgedistance}
+\setinterfacecommand{outeredgewidth}{outeredgewidth}
+\setinterfacecommand{outermargindistance}{outermargindistance}
+\setinterfacecommand{outermarginwidth}{outermarginwidth}
+\setinterfacecommand{overbar}{barasus}
+\setinterfacecommand{overbars}{supralinie}
+\setinterfacecommand{overstrike}{liniepeste}
+\setinterfacecommand{overstrikes}{liniipeste}
+\setinterfacecommand{packed}{impachetat}
+\setinterfacecommand{page}{pagina}
+\setinterfacecommand{pagedepth}{pagedepth}
+\setinterfacecommand{pagenumber}{numarpagina}
+\setinterfacecommand{pageoffset}{pageoffset}
+\setinterfacecommand{pagereference}{referintapagina}
+\setinterfacecommand{pagetype}{tippagina}
+\setinterfacecommand{paperheight}{inaltimehartie}
+\setinterfacecommand{paperwidth}{latimehartie}
+\setinterfacecommand{periods}{puncte}
+\setinterfacecommand{plaatsruwelijst}{placerawlist}
+\setinterfacecommand{placebookmarks}{plaseazasemnecarte}
+\setinterfacecommand{placecombinedlist}{punelistacombinata}
+\setinterfacecommand{placefloat}{placefloat}
+\setinterfacecommand{placefootnotes}{punenotesubsol}
+\setinterfacecommand{placeformula}{puneformula}
+\setinterfacecommand{placeheadnumber}{placeheadnumber}
+\setinterfacecommand{placeheadtext}{placeheadtext}
+\setinterfacecommand{placelegend}{punelegenda}
+\setinterfacecommand{placelist}{punelista}
+\setinterfacecommand{placelocalfootnotes}{punenotesubsollocale}
+\setinterfacecommand{placelogos}{punelogouri}
+\setinterfacecommand{placeongrid}{plaseazapegrid}
+\setinterfacecommand{placeontopofeachother}{punedeasuprafiecareia}
+\setinterfacecommand{placepagenumber}{punenumarpagina}
+\setinterfacecommand{placereferencelist}{placereferencelist}
+\setinterfacecommand{placeregister}{puneregistru}
+\setinterfacecommand{placerule}{punerigla}
+\setinterfacecommand{placesidebyside}{punefatainfata}
+\setinterfacecommand{placesubformula}{punesubformula}
+\setinterfacecommand{placetextvariable}{punevariabilatext}
+\setinterfacecommand{position}{pozitie}
+\setinterfacecommand{positiontext}{pozitietext}
+\setinterfacecommand{printpaperheight}{inaltimehartieimprimanta}
+\setinterfacecommand{printpaperwidth}{latimehartieimprimanta}
+\setinterfacecommand{processblocks}{proceseazabloc}
+\setinterfacecommand{processpage}{proceseazapagina}
+\setinterfacecommand{product}{produs}
+\setinterfacecommand{program}{program}
+\setinterfacecommand{project}{proiect}
+\setinterfacecommand{publication}{publicatie}
+\setinterfacecommand{quotation}{citat}
+\setinterfacecommand{quote}{minicitat}
+\setinterfacecommand{ran}{ran}
+\setinterfacecommand{redo}{refa}
+\setinterfacecommand{ref}{ref}
+\setinterfacecommand{reference}{referinta}
+\setinterfacecommand{referral}{referit}
+\setinterfacecommand{referraldate}{datareferit}
+\setinterfacecommand{referring}{referring}
+\setinterfacecommand{remark}{remarca}
+\setinterfacecommand{reset}{reset}
+\setinterfacecommand{resetmarking}{reseteazamarcaje}
+\setinterfacecommand{resetnumber}{resetnumber}
+\setinterfacecommand{resettext}{resettextcontent}
+\setinterfacecommand{rightaligned}{aliniatdreapta}
+\setinterfacecommand{rightedgedistance}{distantacoltdreapta}
+\setinterfacecommand{rightedgewidth}{latimecoltdreapta}
+\setinterfacecommand{rightmargindistance}{distantamarginedreapta}
+\setinterfacecommand{rightmarginwidth}{latimemarginedreapta}
+\setinterfacecommand{romannumerals}{numereromane}
+\setinterfacecommand{rotate}{roteste}
+\setinterfacecommand{scale}{scala}
+\setinterfacecommand{screen}{ecran}
+\setinterfacecommand{selectblocks}{selecteazablocuri}
+\setinterfacecommand{selectpaper}{selecteazahartie}
+\setinterfacecommand{selectversion}{selecteazaversiune}
+\setinterfacecommand{setnumber}{setnumber}
+\setinterfacecommand{settextcontent}{settextcontent}
+\setinterfacecommand{settextvariable}{setvariabilatext}
+\setinterfacecommand{setupalign}{seteazaalinierea}
+\setinterfacecommand{setuparranging}{seteazaaranjareapag}
+\setinterfacecommand{setupbackground}{seteazafundal}
+\setinterfacecommand{setupbackgrounds}{seteazafundaluri}
+\setinterfacecommand{setupblackrules}{seteazaliniinegre}
+\setinterfacecommand{setupblank}{seteazablanc}
+\setinterfacecommand{setupblock}{seteazabloc}
+\setinterfacecommand{setupbodyfont}{seteazafonttext}
+\setinterfacecommand{setupbodyfontenvironment}{seteazamediulfonttext}
+\setinterfacecommand{setupbottom}{seteazajos}
+\setinterfacecommand{setupbottomtexts}{seteazatextejos}
+\setinterfacecommand{setupbuffer}{seteazabuffer}
+\setinterfacecommand{setupbuttons}{seteazabutoane}
+\setinterfacecommand{setupcapitals}{seteazamajuscule}
+\setinterfacecommand{setupcaption}{seteazalegenda}
+\setinterfacecommand{setupcaptions}{seteazalegendele}
+\setinterfacecommand{setupclipping}{seteazaclipping}
+\setinterfacecommand{setupcolor}{seteazaculoare}
+\setinterfacecommand{setupcolors}{seteazaculori}
+\setinterfacecommand{setupcolumns}{seteazacoloane}
+\setinterfacecommand{setupcolumnset}{setupcolumnset}
+\setinterfacecommand{setupcolumnsetlines}{setupcolumnsetlines}
+\setinterfacecommand{setupcolumnsetstart}{setupcolumnsetstart}
+\setinterfacecommand{setupcombinations}{seteazacombinari}
+\setinterfacecommand{setupcombinedlist}{seteazalistacombinata}
+\setinterfacecommand{setupcomment}{seteazacomentariu}
+\setinterfacecommand{setupdescriptions}{seteazadescriere}
+\setinterfacecommand{setupenumerations}{seteazaenumerare}
+\setinterfacecommand{setupexternalfigures}{seteazafiguriexterne}
+\setinterfacecommand{setupfield}{seteazacamp}
+\setinterfacecommand{setupfields}{seteazacampuri}
+\setinterfacecommand{setupfillinlines}{seteazaliniiumplere}
+\setinterfacecommand{setupfillinrules}{seteazarigleumplere}
+\setinterfacecommand{setupfloat}{seteazafloat}
+\setinterfacecommand{setupfloats}{seteazafloats}
+\setinterfacecommand{setupfloatsplitting}{seteazaimpartireafloat}
+\setinterfacecommand{setupfooter}{seteazasubsol}
+\setinterfacecommand{setupfootertexts}{seteazatextesubsol}
+\setinterfacecommand{setupfootnotedefinition}{seteazadefinireanotasubsol}
+\setinterfacecommand{setupfootnotes}{seteazanotasubsol}
+\setinterfacecommand{setupforms}{seteazaformulare}
+\setinterfacecommand{setupformulas}{seteazaformule}
+\setinterfacecommand{setupframed}{seteazainconjurat}
+\setinterfacecommand{setupframedtexts}{definestetexteinconjurate}
+\setinterfacecommand{setuphead}{seteazatitlu}
+\setinterfacecommand{setupheader}{seteazaantet}
+\setinterfacecommand{setupheadertexts}{seteazatexteantet}
+\setinterfacecommand{setupheadnumber}{seteazanumartitlu}
+\setinterfacecommand{setupheads}{seteazatitluri}
+\setinterfacecommand{setupheadtext}{seteazatexttitlu}
+\setinterfacecommand{setuphyphenmark}{seteazaliniesilabe}
+\setinterfacecommand{setupindentations}{seteazaaliniate}
+\setinterfacecommand{setupindenting}{seteazaaliniat}
+\setinterfacecommand{setupinmargin}{seteazamarginal}
+\setinterfacecommand{setupinteraction}{seteazainteractiunea}
+\setinterfacecommand{setupinteractionbar}{seteazabarainteractiune}
+\setinterfacecommand{setupinteractionmenu}{seteazameniuinteractiune}
+\setinterfacecommand{setupinteractionscreen}{seteazaecraninteractiune}
+\setinterfacecommand{setupinterlinespace}{seteazaspatiuinterliniar}
+\setinterfacecommand{setupitemgroup}{setupitemgroup}
+\setinterfacecommand{setupitemgroups}{setareitemization}
+\setinterfacecommand{setupitems}{seteazaelemente}
+\setinterfacecommand{setuplabeltext}{seteazatexteticheta}
+\setinterfacecommand{setuplanguage}{setarelimba}
+\setinterfacecommand{setuplayout}{seteazaaspect}
+\setinterfacecommand{setuplegend}{seteazalegenda}
+\setinterfacecommand{setuplinenumbering}{seteazanumerotarelinii}
+\setinterfacecommand{setuplines}{seteazalinii}
+\setinterfacecommand{setuplinewidth}{seteazagrosimelinie}
+\setinterfacecommand{setuplist}{seteazalista}
+\setinterfacecommand{setupmakeup}{seteazamakeup}
+\setinterfacecommand{setupmarginblocks}{seteazablocurimarginale}
+\setinterfacecommand{setupmarginrules}{seteazaliniimargine}
+\setinterfacecommand{setupmarking}{seteazamarcaje}
+\setinterfacecommand{setupmathalignment}{setupmathalignment}
+\setinterfacecommand{setupnarrower}{seteazaingust}
+\setinterfacecommand{setupnumber}{setupnumber}
+\setinterfacecommand{setupnumbering}{seteazanumerotare}
+\setinterfacecommand{setupoppositeplacing}{seteazaplasareaopozita}
+\setinterfacecommand{setupoutput}{setareoutput}
+\setinterfacecommand{setuppagecomment}{seteazacomentariupagina}
+\setinterfacecommand{setuppagenumber}{seteazanumarpagina}
+\setinterfacecommand{setuppagenumbering}{seteazanumerotarepagina}
+\setinterfacecommand{setuppagetransitions}{seteazatranzitiepagina}
+\setinterfacecommand{setuppalet}{seteazapaleta}
+\setinterfacecommand{setuppaper}{setuppaper}
+\setinterfacecommand{setuppapersize}{seteazadimensiunihartie}
+\setinterfacecommand{setupparagraphnumbering}{seteazanumerotareparagrafe}
+\setinterfacecommand{setupparagraphs}{seteazaparagrafe}
+\setinterfacecommand{setupplacement}{setupplacement}
+\setinterfacecommand{setuppositioning}{setarepozitie}
+\setinterfacecommand{setupprofiles}{seteazaprofile}
+\setinterfacecommand{setupprograms}{seteazaprograme}
+\setinterfacecommand{setuppublications}{seteazapublicatii}
+\setinterfacecommand{setupquote}{seteazaminicitat}
+\setinterfacecommand{setupreferencelist}{seteazalistareferinte}
+\setinterfacecommand{setupreferencing}{seteazareferinte}
+\setinterfacecommand{setupregister}{seteazaregistru}
+\setinterfacecommand{setuprotate}{seteazarotare}
+\setinterfacecommand{setuprule}{seteazarigla}
+\setinterfacecommand{setups}{setari}
+\setinterfacecommand{setupscreens}{seteazaecrane}
+\setinterfacecommand{setupsection}{seteazasectiune}
+\setinterfacecommand{setupsectionblock}{seteazablocsectiune}
+\setinterfacecommand{setupsorting}{seteazasortare}
+\setinterfacecommand{setupspacing}{seteazaspatiu}
+\setinterfacecommand{setupstartstop}{setupstartstop}
+\setinterfacecommand{setupstrut}{seteazastrut}
+\setinterfacecommand{setupsubpagenumber}{seteazanumarsubpagina}
+\setinterfacecommand{setupsymbolset}{seteazasimbol}
+\setinterfacecommand{setupsynchronization}{setaresincronizare}
+\setinterfacecommand{setupsynchronizationbar}{setarebarasincronizare}
+\setinterfacecommand{setupsynonyms}{seteazasinonime}
+\setinterfacecommand{setupsystem}{seteazasistem}
+\setinterfacecommand{setuptab}{seteazatab}
+\setinterfacecommand{setuptables}{seteazatabele}
+\setinterfacecommand{setuptabulate}{seteazatabulatori}
+\setinterfacecommand{setuptext}{seteazatext}
+\setinterfacecommand{setuptextposition}{seteazapozitietext}
+\setinterfacecommand{setuptextrules}{seteazarigletext}
+\setinterfacecommand{setuptexttexts}{seteazatextetext}
+\setinterfacecommand{setuptextvariable}{seteazavariabilatext}
+\setinterfacecommand{setupthinrules}{seteazaliniesubtire}
+\setinterfacecommand{setuptolerance}{seteazatoleranta}
+\setinterfacecommand{setuptop}{seteazasus}
+\setinterfacecommand{setuptoptexts}{seteazatextesus}
+\setinterfacecommand{setuptype}{seteazatype}
+\setinterfacecommand{setuptyping}{seteazatyping}
+\setinterfacecommand{setupunderbar}{seteazasublinie}
+\setinterfacecommand{setupurl}{seteazaurl}
+\setinterfacecommand{setupversions}{seteazaversiuni}
+\setinterfacecommand{setupwhitespace}{seteazaspatiualb}
+\setinterfacecommand{showbodyfont}{afiseazafonttext}
+\setinterfacecommand{showbodyfontenvironment}{afiseazamediufonttext}
+\setinterfacecommand{showcolor}{afiseazaculoare}
+\setinterfacecommand{showcolorgroup}{afiseazagrupculoare}
+\setinterfacecommand{showexternalfigures}{afiseazafiguriexterne}
+\setinterfacecommand{showfields}{afiseazacampuri}
+\setinterfacecommand{showframe}{afiseazarama}
+\setinterfacecommand{showgrid}{afiseazagrid}
+\setinterfacecommand{showlayout}{afiseazaaspect}
+\setinterfacecommand{showmakeup}{afiseazamakeup}
+\setinterfacecommand{showpalet}{afiseazapaleta}
+\setinterfacecommand{showprint}{afiseazatiparire}
+\setinterfacecommand{showsetups}{afiseazasetari}
+\setinterfacecommand{showstruts}{afiseazastruts}
+\setinterfacecommand{showsymbolset}{afiseazasetsimboluri}
+\setinterfacecommand{smallcapped}{kap}
+\setinterfacecommand{someline}{olinie}
+\setinterfacecommand{somewhere}{undeva}
+\setinterfacecommand{space}{spatiu}
+\setinterfacecommand{splitfloat}{impartefloat}
+\setinterfacecommand{startalignment}{startaliniere}
+\setinterfacecommand{startbackground}{startfundal}
+\setinterfacecommand{startcoding}{startcodificare}
+\setinterfacecommand{startcolor}{startculoare}
+\setinterfacecommand{startcolumnmakeup}{startcolumnmakeup}
+\setinterfacecommand{startcolumns}{startcoloane}
+\setinterfacecommand{startcolumnset}{startcolumnset}
+\setinterfacecommand{startcombination}{startcombinare}
+\setinterfacecommand{startcomponent}{startcomponenta}
+\setinterfacecommand{startdocument}{startdocument}
+\setinterfacecommand{startenvironment}{startmediu}
+\setinterfacecommand{startfigure}{startfigura}
+\setinterfacecommand{startglobal}{startglobal}
+\setinterfacecommand{startline}{startlinie}
+\setinterfacecommand{startlinecorrection}{startcorectielinie}
+\setinterfacecommand{startlinenumbering}{startnumerotarelinii}
+\setinterfacecommand{startlines}{startlinii}
+\setinterfacecommand{startlocal}{startlocal}
+\setinterfacecommand{startlocalfootnotes}{startnotesubsollocale}
+\setinterfacecommand{startmakeup}{startmakeup}
+\setinterfacecommand{startmarginblock}{startblocmarginal}
+\setinterfacecommand{startmarginrule}{startliniemargine}
+\setinterfacecommand{startnarrower}{startingust}
+\setinterfacecommand{startopposite}{startopozit}
+\setinterfacecommand{startoverlay}{startoverlay}
+\setinterfacecommand{startoverzicht}{startoverview}
+\setinterfacecommand{startpacked}{startimpachetat}
+\setinterfacecommand{startpositioning}{startpozitionare}
+\setinterfacecommand{startproduct}{startprodus}
+\setinterfacecommand{startprofile}{startprofil}
+\setinterfacecommand{startproject}{startproiect}
+\setinterfacecommand{startquotation}{startcitat}
+\setinterfacecommand{startraster}{startraster}
+\setinterfacecommand{startsymbolset}{startsetsimboluri}
+\setinterfacecommand{startsynchronization}{startsincronizare}
+\setinterfacecommand{starttable}{starttabel}
+\setinterfacecommand{starttables}{starttabele}
+\setinterfacecommand{starttext}{starttext}
+\setinterfacecommand{starttextrule}{startriglatext}
+\setinterfacecommand{startunpacked}{startneimpachetat}
+\setinterfacecommand{startversion}{startversiune}
+\setinterfacecommand{stopalignment}{stopaliniere}
+\setinterfacecommand{stopbackground}{stopfundal}
+\setinterfacecommand{stopcoding}{stopcodificare}
+\setinterfacecommand{stopcolor}{stopculoare}
+\setinterfacecommand{stopcolumnmakeup}{stopcolumnmakeup}
+\setinterfacecommand{stopcolumns}{stopcoloane}
+\setinterfacecommand{stopcolumnset}{stopcolumnset}
+\setinterfacecommand{stopcombination}{stopcombinare}
+\setinterfacecommand{stopcomponent}{stopcomponenta}
+\setinterfacecommand{stopdocument}{stopdocument}
+\setinterfacecommand{stopenvironment}{stopmediu}
+\setinterfacecommand{stopglobal}{stopblobal}
+\setinterfacecommand{stopline}{stoplinie}
+\setinterfacecommand{stoplinecorrection}{stopcorectielinie}
+\setinterfacecommand{stoplinenumbering}{stopnumerotarelinii}
+\setinterfacecommand{stoplines}{stoplinii}
+\setinterfacecommand{stoplocal}{stoplocal}
+\setinterfacecommand{stoplocalfootnotes}{stopnotesubsollocale}
+\setinterfacecommand{stopmakeup}{stopmakeup}
+\setinterfacecommand{stopmarginblock}{stopblocmarginal}
+\setinterfacecommand{stopmarginrule}{stopliniemargine}
+\setinterfacecommand{stopnarrower}{stopingust}
+\setinterfacecommand{stopopposite}{stopopozit}
+\setinterfacecommand{stopoverlay}{stopoverlay}
+\setinterfacecommand{stopoverzicht}{stopoverview}
+\setinterfacecommand{stoppacked}{stopimpachetat}
+\setinterfacecommand{stoppositioning}{stoppozitionare}
+\setinterfacecommand{stopproduct}{stopprodus}
+\setinterfacecommand{stopprofile}{stopprofil}
+\setinterfacecommand{stopproject}{stopproiect}
+\setinterfacecommand{stopquotation}{stopcitat}
+\setinterfacecommand{stopraster}{stopraster}
+\setinterfacecommand{stopsynchronization}{stopsincronizare}
+\setinterfacecommand{stoptable}{stoptabel}
+\setinterfacecommand{stoptables}{stoptabele}
+\setinterfacecommand{stoptext}{stoptext}
+\setinterfacecommand{stoptextrule}{stopriglatext}
+\setinterfacecommand{stopunpacked}{stopneimpachetat}
+\setinterfacecommand{stopversion}{stopversiune}
+\setinterfacecommand{stretched}{intins}
+\setinterfacecommand{subformulanumber}{numarsubformula}
+\setinterfacecommand{subpagenumber}{subpagenumber}
+\setinterfacecommand{switchtobodyfont}{trecilafonttext}
+\setinterfacecommand{switchtorawfont}{trecilafontraw}
+\setinterfacecommand{sym}{sim}
+\setinterfacecommand{symbol}{simbol}
+\setinterfacecommand{synchronizationbar}{barasincronizare}
+\setinterfacecommand{synchronize}{sincronizeaza}
+\setinterfacecommand{tab}{tab}
+\setinterfacecommand{testcolumn}{testcolumn}
+\setinterfacecommand{testpage}{testpage}
+\setinterfacecommand{tex}{tex}
+\setinterfacecommand{textheight}{inaltimetext}
+\setinterfacecommand{textreference}{referintatext}
+\setinterfacecommand{textrule}{riglatext}
+\setinterfacecommand{textvariable}{variabilatext}
+\setinterfacecommand{textwidth}{latimetext}
+\setinterfacecommand{thinrule}{liniesubtire}
+\setinterfacecommand{thinrules}{liniisubtiri}
+\setinterfacecommand{tooltip}{tooltip}
+\setinterfacecommand{topdistance}{distantasus}
+\setinterfacecommand{topheight}{inaltimesus}
+\setinterfacecommand{topspace}{spatiusus}
+\setinterfacecommand{totalnumberofpages}{numartotalpagini}
+\setinterfacecommand{translate}{traduce}
+\setinterfacecommand{txt}{txt}
+\setinterfacecommand{typ}{typ}
+\setinterfacecommand{type}{type}
+\setinterfacecommand{typebuffer}{scriebuffer}
+\setinterfacecommand{typefile}{typefile}
+\setinterfacecommand{underbar}{sublinie}
+\setinterfacecommand{underbars}{sublinii}
+\setinterfacecommand{unitmeaning}{numeunitate}
+\setinterfacecommand{unknown}{necunoscut}
+\setinterfacecommand{useJSscripts}{folosestescriptJS}
+\setinterfacecommand{useURL}{folosesteURL}
+\setinterfacecommand{useXMLfilter}{useXMLfilter}
+\setinterfacecommand{useblocks}{folosestebloc}
+\setinterfacecommand{usecommands}{folosestecomenzi}
+\setinterfacecommand{useencoding}{folosestecodificarea}
+\setinterfacecommand{useexternaldocument}{folosestedocumentextern}
+\setinterfacecommand{useexternalfigure}{folosestefiguraexterna}
+\setinterfacecommand{useexternalfile}{folosestefisierextern}
+\setinterfacecommand{useexternalfiles}{folosestefisiereexterne}
+\setinterfacecommand{useexternalsoundtrack}{folosestemuzicaexterna}
+\setinterfacecommand{usemodule}{folosestemodul}
+\setinterfacecommand{usemodules}{folosestemodule}
+\setinterfacecommand{usepath}{folosestedirector}
+\setinterfacecommand{usereferences}{folosestereferinte}
+\setinterfacecommand{usespecials}{folosestespeciale}
+\setinterfacecommand{usesymbols}{folosestesimboluri}
+\setinterfacecommand{usetypescript}{usetypescript}
+\setinterfacecommand{usetypescriptfile}{usetypescriptfile}
+\setinterfacecommand{useurl}{folosesteurl}
+\setinterfacecommand{version}{versiune}
+\setinterfacecommand{vl}{vl}
+\setinterfacecommand{weekday}{zidinsaptamana}
+\setinterfacecommand{whitespace}{spatiualb}
+\setinterfacecommand{wordright}{cuvantdreapta}
+\setinterfacecommand{writebetweenlist}{scrieintreliste}
+\setinterfacecommand{writetolist}{scrieinlista}
+\setinterfacecommand{writetoreferencelist}{scrieinlistareferinte}
+\setinterfacecommand{writetoregister}{scrieinregistru}
+%
+\endinput
\ No newline at end of file
diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex
index 903ce76d1..407146901 100644
--- a/tex/context/base/mult-sys.tex
+++ b/tex/context/base/mult-sys.tex
@@ -53,6 +53,7 @@
\definesystemconstant {bokmal} \definesystemconstant {nb} \definesystemconstant {norwegian} \definesystemconstant {no}
\definesystemconstant {nynorsk} \definesystemconstant {nn}
\definesystemconstant {polish} \definesystemconstant {pl}
+\definesystemconstant {persian} \definesystemconstant {pe}
\definesystemconstant {portuguese} \definesystemconstant {pt}
\definesystemconstant {romanian} \definesystemconstant {ro}
\definesystemconstant {russian} \definesystemconstant {ru}
@@ -138,7 +139,11 @@
\definesystemconstant {done}
\definesystemconstant {font}
\definesystemconstant {link}
+\definesystemconstant {parent}
+\definesystemconstant {clone}
\definesystemconstant {section} \let\v!sectionlevel\s!section % for old times sake
+\definesystemconstant {handler}
+\definesystemconstant {counter}
%D A more experienced \TEX\ user will recognize the next four
%D constants. We need these because font-definitions are
@@ -164,6 +169,8 @@
\definesystemconstant {rscale}
\definesystemconstant {handling}
\definesystemconstant {features}
+\definesystemconstant {fallbacks}
+\definesystemconstant {background}
\definesystemconstant {ucmap}
\definesystemconstant {property}
@@ -402,6 +409,7 @@
\definesystemvariable {cv} % ConVersie
\definesystemvariable {cy} % CrYteria
\definesystemvariable {da} % DAte
+\definesystemvariable {db} % Labels
\definesystemvariable {dc} % DroppedCaps
\definesystemvariable {dd} % DoorDefinieren
\definesystemvariable {de} % DEel
@@ -486,6 +494,7 @@
\definesystemvariable {mo} % Math Options
\definesystemvariable {nm} % Nummering
\definesystemvariable {mx} % MatriX
+\definesystemvariable {ng} % parbuilders
\definesystemvariable {np} % NaastPlaatsen
\definesystemvariable {nr} % Nummeren
\definesystemvariable {of} % OFfset
@@ -508,6 +517,7 @@
\definesystemvariable {ph} % ParagrapH
\definesystemvariable {pl} % PLaats
\definesystemvariable {pn} % PaginaNummer
+\definesystemvariable {po} % PrOcessor
\definesystemvariable {pp} % PaPier
\definesystemvariable {pr} % PRogrammas
\definesystemvariable {ps} % PoSitioneren
diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua
index c9ff07d7f..8b451124e 100644
--- a/tex/context/base/node-ini.lua
+++ b/tex/context/base/node-ini.lua
@@ -17,6 +17,14 @@ nodes = nodes or { }
nodes.trace = false
nodes.ignore = nodes.ignore or false
+local hlist = node.id('vlist')
+local vlist = node.id('hlist')
+local glyph = node.id('glyph')
+local disc = node.id('disc')
+local mark = node.id('mark')
+local glue = node.id('glue')
+local whatsit = node.id('whatsit')
+
-- handy helpers
if node.protect_glyphs then
@@ -38,7 +46,6 @@ else do
-- X001 0100 = 20 = 0x14 = rightghost
- local glyph = node.id('glyph')
local traverse_id = node.traverse_id
function nodes.protect_glyphs(head)
@@ -197,8 +204,6 @@ end
do
- local hlist, vlist = node.id('hlist'), node.id('vlist')
-
local function count(stack,flat)
local n = 0
while stack do
@@ -317,7 +322,6 @@ local tfmid = fonts.tfm.id
do
- local glyph = node.id('glyph')
local has_attribute = node.has_attribute
local traverse_id = node.traverse_id
@@ -457,37 +461,9 @@ function nodes.length(head)
end
end
---~ nodes.processors.actions = nodes.processors.actions or { }
-
---~ function nodes.processors.action(head)
---~ if head then
---~ node.slide(head)
---~ local done = false
---~ local actions = nodes.processors.actions
---~ for i=1,#actions do
---~ local h, ok = actions[i](head)
---~ if ok then
---~ head, done = h, true
---~ end
---~ end
---~ if done then
---~ return head
---~ else
---~ return true
---~ end
---~ else
---~ return head
---~ end
---~ end
-
-lists = lists or { }
-lists.plugins = lists.plugins or { }
-
-chars = chars or { }
-chars.plugins = chars.plugins or { }
-
---~ words = words or { }
---~ words.plugins = words.plugins or { }
+lists = lists or { }
+chars = chars or { }
+words = words or { } -- not used yet
callbacks.trace = false
@@ -499,22 +475,34 @@ do
local hyphenate, ligaturing, kerning = lang.hyphenate, node.ligaturing, node.kerning
function kernel.hyphenation(head,tail) -- lang.hyphenate returns done
- starttiming(kernel)
- local done = hyphenate(head,tail)
- stoptiming(kernel)
- return head, tail, done
+ if head == tail then
+ return head, tail, false
+ else
+ starttiming(kernel)
+ local done = head ~= tail and hyphenate(head,tail)
+ stoptiming(kernel)
+ return head, tail, done
+ end
end
function kernel.ligaturing(head,tail) -- node.ligaturing returns head,tail,done
- starttiming(kernel)
- local head, tail, done = ligaturing(head,tail)
- stoptiming(kernel)
- return head, tail, done
+ if head == tail then
+ return head, tail, false
+ else
+ starttiming(kernel)
+ local head, tail, done = ligaturing(head,tail)
+ stoptiming(kernel)
+ return head, tail, done
+ end
end
function kernel.kerning(head,tail) -- node.kerning returns head,tail,done
- starttiming(kernel)
- local head, tail, done = kerning(head,tail)
- stoptiming(kernel)
- return head, tail, done
+ if head == tail then
+ return head, tail, false
+ else
+ starttiming(kernel)
+ local head, tail, done = kerning(head,tail)
+ stoptiming(kernel)
+ return head, tail, done
+ end
end
end
@@ -523,48 +511,155 @@ callback.register('hyphenate' , function(head,tail) return tail end)
callback.register('ligaturing', function(head,tail) return tail end)
callback.register('kerning' , function(head,tail) return tail end)
--- used to be loop, this is faster, called often; todo: shift up tail or even better,
--- handle tail everywhere; for the moment we're safe
+nodes.tasks = nodes.tasks or { }
+nodes.tasks.data = nodes.tasks.data or { }
-do
+function nodes.tasks.new(name,list)
+ local tasklist = sequencer.reset()
+ nodes.tasks.data[name] = { list = tasklist, runner = false }
+ for _, task in ipairs(list) do
+ sequencer.appendgroup(tasklist,task)
+ end
+end
- local charplugins, listplugins = chars.plugins, lists.plugins
+function nodes.tasks.appendaction(name,group,action,where,kind)
+ local data = nodes.tasks.data[name]
+ sequencer.appendaction(data.list,group,action,where,kind)
+ data.runner = false
+end
+
+function nodes.tasks.prependaction(name,group,action,where,kind)
+ local data = nodes.tasks.data[name]
+ sequencer.prependaction(data.list,group,action,where,kind)
+ data.runner = false
+end
- -- todo: move, so that we can use locals (also: n.p_c = function(...) ... end so that we can redefine
- -- todo: normalize calls so that we can use a for loop and extent this list
+function nodes.tasks.removeaction(name,group,action)
+ local data = nodes.tasks.data[name]
+ sequencer.removeaction(data.list,group,action)
+ data.runner = false
+end
- if not nodes.normalize_fonts then
- function nodes.normalize_fonts(head)
- return head, false
+function nodes.tasks.showactions(name,group,action,where,kind)
+ local data = nodes.tasks.data[name]
+ logs.report("nodes","task %s, list:\n%s",name,sequencer.nodeprocessor(data.list))
+end
+
+function nodes.tasks.actions(name)
+ local data = nodes.tasks.data[name]
+ return function(head,tail)
+ local runner = data.runner
+ if not runner then
+ if nodes.trace_tasks then
+ logs.report("nodes","creating task runner '%s'",name)
+ end
+ runner = sequencer.compile(data.list,sequencer.nodeprocessor)
+ data.runner = runner
end
+ return runner(head,tail)
end
+end
- nodes.processors.actions = function(head,tail) -- removed: if head ... end
- local ok, done = false, false
- head, ok = nodes.normalize_fonts(head) ; done = done or ok
- head, ok = nodes.process_attributes(head,charplugins) ; done = done or ok -- attribute driven
- head, tail, ok = kernel.hyphenation (head,tail) ; done = done or ok -- language driven
- head, ok = languages.words.check (head,tail) ; done = done or ok -- language driven
- head, ok = nodes.process_characters(head) ; done = done or ok -- font driven
- ok = nodes.protect_glyphs (head) ; done = done or ok -- turn chars into glyphs
- head, tail, ok = kernel.ligaturing (head,tail) ; done = done or ok -- normal ligaturing routine / needed for base mode
- head, tail, ok = kernel.kerning (head,tail) ; done = done or ok -- normal kerning routine / needed for base mode
- head, ok = nodes.process_attributes(head,listplugins) ; done = done or ok -- attribute driven
- return head, done
+nodes.tasks.new (
+ "processors",
+ {
+ "before", -- for users
+ "normalizers",
+ "characters",
+ "words",
+ "fonts",
+ "lists",
+ "after", -- for users
+ }
+)
+
+-- these definitions will move
+
+nodes.tasks.appendaction("processors", "normalizers", "nodes.normalize_fonts", nil)
+nodes.tasks.appendaction("processors", "characters", "chars.handle_mirroring", nil, "notail")
+nodes.tasks.appendaction("processors", "characters", "chars.handle_casing", nil, "notail")
+nodes.tasks.appendaction("processors", "characters", "chars.handle_breakpoints", nil, "notail")
+nodes.tasks.appendaction("processors", "words", "kernel.hyphenation", nil)
+nodes.tasks.appendaction("processors", "words", "languages.words.check", nil, "notail")
+nodes.tasks.appendaction("processors", "fonts", "nodes.process_characters", nil, "notail")
+nodes.tasks.appendaction("processors", "fonts", "nodes.protect_glyphs", nil, "nohead")
+nodes.tasks.appendaction("processors", "fonts", "kernel.ligaturing", nil)
+nodes.tasks.appendaction("processors", "fonts", "kernel.kerning", nil)
+nodes.tasks.appendaction("processors", "lists", "lists.handle_spacing", nil, "notail")
+nodes.tasks.appendaction("processors", "lists", "lists.handle_kerning", nil, "notail")
+
+
+local free = node.free
+
+local function cleanup_page(head) -- rough
+ local prev, start = nil, head
+ while start do
+ local id, nx = start.id, start.next
+ if id == disc or id == mark then
+ if prev then
+ prev.next = nx
+ end
+ if start == head then
+ head = nx
+ end
+ local tmp = start
+ start = nx
+ free(tmp)
+ elseif id == hlist or id == vlist then
+ local sl = start.list
+ if sl then
+ start.list = cleanup_page(sl)
+ end
+ prev, start = start, nx
+ else
+ prev, start = start, nx
+ end
end
+ return head
+end
+nodes.cleanup_page_first = false
+
+function nodes.cleanup_page(head)
+ if nodes.cleanup_page_first then
+ head = cleanup_page(head)
+ end
+ return head, false
end
+nodes.tasks.new (
+ "shipouts",
+ {
+ "before", -- for users
+ "normalizers",
+ "finishers",
+ "after", -- for users
+ }
+)
+
+nodes.tasks.appendaction("shipouts", "normalizers", "nodes.cleanup_page", nil, "notail")
+nodes.tasks.appendaction("shipouts", "finishers", "shipouts.handle_color", nil, "notail")
+nodes.tasks.appendaction("shipouts", "finishers", "shipouts.handle_transparency", nil, "notail")
+nodes.tasks.appendaction("shipouts", "finishers", "shipouts.handle_overprint", nil, "notail")
+nodes.tasks.appendaction("shipouts", "finishers", "shipouts.handle_negative", nil, "notail")
+nodes.tasks.appendaction("shipouts", "finishers", "shipouts.handle_effect", nil, "notail")
+nodes.tasks.appendaction("shipouts", "finishers", "shipouts.handle_viewerlayer", nil, "notail")
+
+local actions = nodes.tasks.actions("shipouts")
+
+function nodes.process_page(head) -- problem, attr loaded before node, todo ...
+ return actions(head) -- no tail
+end
+
+-- or just: nodes.process_page = nodes.tasks.actions("shipouts")
+
+
do -- remove these
- local actions = nodes.processors.actions
+ local actions = nodes.tasks.actions("processors")
local first_character = node.first_character
local slide = node.slide
- local hlist = node.id('vlist')
- local vlist = node.id('hlist')
- local glyph = node.id('glyph')
-
local n = 0
local function reconstruct(head)
@@ -601,7 +696,7 @@ do -- remove these
if found then
if callbacks.trace then
local before = nodes.count(head,true)
- local head, done = actions(head,slide(head))
+ local head, tail, done = actions(head,slide(head))
local after = nodes.count(head,true)
if done then
tracer("pre_linebreak","changed",head,groupcode,before,after,true)
@@ -610,7 +705,7 @@ do -- remove these
end
return (done and head) or true
else
- local head, done = actions(head,slide(head))
+ local head, tail, done = actions(head,slide(head))
return (done and head) or true
end
else
@@ -627,7 +722,7 @@ do -- remove these
if found then
if callbacks.trace then
local before = nodes.count(head,true)
- local head, done = actions(head,slide(head))
+ local head, tail, done = actions(head,slide(head))
local after = nodes.count(head,true)
if done then
tracer("hpack","changed",head,groupcode,before,after,true)
@@ -636,7 +731,7 @@ do -- remove these
end
return (done and head) or true
else
- local head, done = actions(head,slide(head))
+ local head, tail, done = actions(head,slide(head))
return (done and head) or true
end
end
@@ -783,7 +878,7 @@ do
return ((type(k) == "number") and "["..k.."]") or k
end
- -- not ok yet:
+ -- not ok yet; this will become a module
local function serialize(root,name,handle,depth,m)
handle = handle or print
@@ -870,6 +965,34 @@ do
tex.print("\\stoptyping")
end
+ function nodes.list(head,n) -- name might change to nodes.type
+ if not n then
+ tex.print(tex.ctxcatcodes,"\\starttyping")
+ end
+ while head do
+ local id = head.id
+ tex.print(string.rep(" ",n or 0) .. tostring(head) .. "\n")
+ if id == hlist or id == vlist then
+ nodes.list(head.list,(n or 0)+1)
+ end
+ head = head.next
+ end
+ if not n then
+ tex.print("\\stoptyping")
+ end
+ end
+
+ function nodes.print(head,n)
+ while head do
+ local id = head.id
+ texio.write_nl(string.rep(" ",n or 0) .. tostring(head))
+ if id == hlist or id == vlist then
+ nodes.print(head.list,(n or 0)+1)
+ end
+ head = head.next
+ end
+ end
+
function nodes.check_for_leaks(sparse)
local l = { }
local q = node.usedlist()
@@ -909,8 +1032,6 @@ end
do
- local glue, whatsit, hlist = node.id("glue"), node.id("whatsit"), node.id("hlist")
-
function nodes.leftskip(n)
while n do
local id = n.id
@@ -975,8 +1096,6 @@ do
nodes.tracers = { }
nodes.tracers.characters = { }
- local glyph, disc = node.id('glyph'), node.id('disc')
-
local function collect(head,list,tag,n)
n = n or 0
local ok, fn = false, nil
@@ -988,8 +1107,8 @@ do
ok, fn = false, f
end
local c = head.char
- local d = tfmid[f].characters[c]
- local i = (d and d.description.index) or -1
+ local d = tfmid[f].descriptions[c]
+ local i = (d and d.index) or -1
if not ok then
ok = true
n = n + 1
diff --git a/tex/context/base/node-ini.tex b/tex/context/base/node-ini.tex
index 845a62b31..c033a1f7b 100644
--- a/tex/context/base/node-ini.tex
+++ b/tex/context/base/node-ini.tex
@@ -13,6 +13,7 @@
\writestatus{loading}{Node Support (initialization)}
+\registerctxluafile{node-seq}{1.001}
\registerctxluafile{node-ini}{1.001}
% \appendtoks
diff --git a/tex/context/base/node-par.lua b/tex/context/base/node-par.lua
new file mode 100644
index 000000000..7dd95ea5d
--- /dev/null
+++ b/tex/context/base/node-par.lua
@@ -0,0 +1,43 @@
+if not modules then modules = { } end modules ['node-par'] = {
+ version = 1.001,
+ comment = "companion to node-par.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+parbuilders = parbuilders or { }
+parbuilders.constructors = parbuilders.constructors or { }
+parbuilders.names = parbuilders.names or { }
+parbuilders.attribute = attributes.numbers['parbuilder'] or 999
+
+input.storage.register(false, "parbuilders.names", parbuilders.names, "parbuilders.names")
+
+-- store parbuilders.names
+
+function parbuilders.register(name,attribute)
+ parbuilders.names[attribute] = name
+end
+
+function parbuilders.main(head,interupted_by_display)
+ local attribute = node.has_attribute(head,parbuilders.attribute)
+ if attribute then
+ local constructor = parbuilders.names[attribute]
+ if constructor then
+ return parbuilders.constructors[constructor](head,interupted_by_display)
+ end
+ end
+ return false
+end
+
+-- just for testing
+
+function parbuilders.constructors.default(head,ibd)
+ return false
+end
+
+-- also for testing (no surrounding spacing done)
+
+function parbuilders.constructors.oneline(head,ibd)
+ return node.hpack(head)
+end
diff --git a/tex/context/base/node-par.tex b/tex/context/base/node-par.tex
new file mode 100644
index 000000000..2e628c066
--- /dev/null
+++ b/tex/context/base/node-par.tex
@@ -0,0 +1,60 @@
+%D \module
+%D [ file=core-spa,
+%D version=2008.09.30,
+%D title=\CONTEXT\ Node Macros,
+%D subtitle=Paragraph 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 Core Macros / Paragraph Building}
+
+%D This is very experimental, undocumented, subjected to changes, etc. just as
+%D the underlying interfaces.
+
+% \enableparbuilders
+%
+% \startparbuilder[default]
+% \input tufte \par
+% \startparbuilder[oneline]
+% \input tufte \par
+% \stopparbuilder
+% \input tufte \par
+% \stopparbuilder
+
+\unprotect
+
+\registerctxluafile{node-par}{1.001}
+
+\defineattribute[parbuilder]
+
+\newcount\nofparbuilders
+
+\def\defineparbuilder[#1]%
+ {\global\advance\nofparbuilders\plusone
+ \ctxlua{parbuilders.register("#1",\number\nofparbuilders)}%
+ \setxvalue{\??ng:#1}{\dosetattribute{parbuilder}{\number\nofparbuilders}}}
+
+\def\startparbuilder[#1]%
+ {\edef\@@currentparbuilder{\number\dogetattribute{parbuilder}}%
+ \globalpushmacro\@@currentparbuilder
+ \getvalue{\??ng:#1}}
+
+\def\stopparbuilder
+ {\globalpopmacro\@@currentparbuilder
+ \dosetattribute{parbuilder}{\@@currentparbuilder}}
+
+% no high level interface, after all implementing a linebreaker is not something that
+% the average user will do
+
+\defineparbuilder[default] % just for testing
+\defineparbuilder[oneline] % just for testing
+
+\def\enableparbuilders {\ctxlua{callback.register('linebreak_filter', parbuilders.main)}}
+\def\disableparbuilders{\ctxlua{callback.register('linebreak_filter', nil)}}
+
+\protect \endinput
diff --git a/tex/context/base/node-seq.lua b/tex/context/base/node-seq.lua
new file mode 100644
index 000000000..2fd4f81aa
--- /dev/null
+++ b/tex/context/base/node-seq.lua
@@ -0,0 +1,161 @@
+if not modules then modules = { } end modules ['node-seq'] = {
+ version = 1.001,
+ comment = "companion to node-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- we assume namespace usage, i.e. unique names for functions
+
+local format, concat = string.format, table.concat
+
+sequencer = sequencer or { }
+
+function sequencer.reset()
+ return {
+ list = { },
+ order = { },
+ kind = { },
+ }
+end
+
+function sequencer.prependgroup(t,group,where)
+ local list, order = t.list, t.order
+ table.remove_value(order,group)
+ table.insert_before_value(order,where,group)
+ list[group] = { }
+end
+
+function sequencer.appendgroup(t,group,where)
+ local list, order = t.list, t.order
+ table.remove_value(order,group)
+ table.insert_after_value(order,where,group)
+ list[group] = { }
+end
+
+function sequencer.prependaction(t,group,action,where,kind)
+ local g = t.list[group]
+ if g then
+ table.remove_value(g,action)
+ table.insert_before_value(g,where,action)
+ t.kind[action] = kind
+ end
+end
+
+function sequencer.appendaction(t,group,action,where,kind)
+ local g = t.list[group]
+ if g then
+ table.remove_value(g,action)
+ table.insert_after_value(g,where,action)
+ t.kind[action] = kind
+ end
+end
+
+function sequencer.setkind(t,action,kind)
+ t.kind[action] = kind
+end
+
+function sequencer.removeaction(t,group,action)
+ local g = t.list[group]
+ if g then
+ table.remove_value(g,action)
+ end
+end
+
+function sequencer.compile(t,compiler)
+ if type(t) == "string" then
+ -- already compiled
+ elseif compiler then
+ t = compiler(t)
+ else
+ t = sequencer.tostring(t)
+ end
+ return loadstring(t)()
+end
+
+local function localize(str)
+ return str:gsub("%.","_")
+end
+
+local template = [[
+%s
+return function(...)
+%s
+end]]
+
+function sequencer.tostring(t)
+ local list, order, kind, vars, calls = t.list, t.order, t.kind, { }, { }
+ for i=1,#order do
+ local group = order[i]
+ local actions = list[group]
+ for i=1,#actions do
+ local action = actions[i]
+ local localized = localize(action)
+ vars [#vars +1] = format("local %s = %s", localized, action)
+ calls[#calls+1] = format(" %s(...) -- %s %i", localized, group, i)
+ end
+ end
+ return template:format(concat(vars,"\n"),concat(calls,"\n"))
+end
+
+local template = [[
+%s
+return function(head,tail)
+ local ok, done = false, false
+%s
+ return head, tail, done
+end]]
+
+function sequencer.nodeprocessor(t)
+ local list, order, kind, vars, calls = t.list, t.order, t.kind, { }, { }
+ for i=1,#order do
+ local group = order[i]
+ local actions = list[group]
+ for i=1,#actions do
+ local action = actions[i]
+ 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) done = done or ok -- %s %i",localized,group,i)
+ elseif kind[action] == "notail" then
+ calls[#calls+1] = format(" head, ok = %s(head,tail) done = done or ok -- %s %i",localized,group,i)
+ else
+ calls[#calls+1] = format(" head, tail, ok = %s(head,tail) done = done or ok -- %s %i",localized,group,i)
+ end
+ end
+ end
+ return template:format(concat(vars,"\n"),concat(calls,"\n"))
+end
+
+--~ hans = {}
+--~ taco = {}
+
+--~ function hans.a(head,tail) print("a",head,tail) return head,tail,true end
+--~ function hans.b(head,tail) print("b",head,tail) return head,tail,true end
+--~ function hans.c(head,tail) print("c",head,tail) return head,tail,true end
+--~ function hans.x(head,tail) print("x",head,tail) return head,tail,true end
+--~ function taco.i(head,tail) print("i",head,tail) return head,tail,true end
+--~ function taco.j(head,tail) print("j",head,tail) return head,tail,true end
+
+--~ t = sequencer.reset()
+
+--~ sequencer.appendgroup(t,"hans")
+--~ sequencer.appendgroup(t,"taco")
+--~ sequencer.prependaction(t,"hans","hans.a")
+--~ sequencer.appendaction (t,"hans","hans.b")
+--~ sequencer.appendaction (t,"hans","hans.x")
+--~ sequencer.prependaction(t,"hans","hans.c","hans.b")
+--~ sequencer.prependaction(t,"taco","taco.i")
+--~ sequencer.prependaction(t,"taco","taco.j")
+--~ sequencer.removeaction(t,"hans","hans.x")
+
+--~ sequencer.setkind(t,"hans.b","notail")
+--~ sequencer.setkind(t,"taco.j","nohead")
+
+--~ print(sequencer.tostring(t))
+
+--~ s = sequencer.compile(t,sequencer.nodeprocessor)
+
+--~ print(sequencer.nodeprocessor(t))
+--~ print(s("head","tail"))
diff --git a/tex/context/base/page-bck.tex b/tex/context/base/page-bck.tex
index c2430967c..10123fec6 100644
--- a/tex/context/base/page-bck.tex
+++ b/tex/context/base/page-bck.tex
@@ -302,8 +302,7 @@
\calculatereducedvsizes
\offinterlineskip
#2\relax
- \vskip-\topheight
- \vskip-\topdistance
+ \vskip\dimexpr-\topheight-\topdistance\relax
\dodopagebodybackground\v!top\topheight
\vskip\topdistance
\dodopagebodybackground\v!header\headerheight
@@ -380,8 +379,7 @@
\def\docommand##1%
{\doifinsetelse{##1}{\v!paper,\v!page,\v!leftpage,\v!rightpage}
{\getparameters[\??ma##1][#3]\checkbackground{##1}}
- {\def\dodocommand####1%
- {\getparameters[\??ma##1####1][#3]\checkbackground{##1####1}}%
+ {\def\dodocommand####1{\getparameters[\??ma##1####1][#3]\checkbackground{##1####1}}%
\processcommalist[#2]\dodocommand}}%
\processcommalist[#1]\docommand
\else\ifsecondargument
diff --git a/tex/context/base/page-imp.tex b/tex/context/base/page-imp.tex
index 4c8a334bf..a16f0031f 100644
--- a/tex/context/base/page-imp.tex
+++ b/tex/context/base/page-imp.tex
@@ -1002,7 +1002,7 @@
%D \starttext
%D \combinepages[slides][nx=2,ny=3,frame=on]
%D \stoptext
-%D \starttyping
+%D \stoptyping
%D
%D One can influence the way the pages are combined. (This
%D will be explained some time.)
@@ -1156,12 +1156,12 @@
\doifelse\@@pcstate\v!start
{\doifinsetelse\@@pclocation{\v!bottom,\v!top}
{\setuppapersize[\c!left=\hskip\@@pcoffset]%
- \adddimenmacro\paperheight\@@pcoffset\@@pcoffset\@@pcdistance\@@pcheight\to\@@pcpaperheight
- \adddimenmacro\paperwidth\@@pcoffset\@@pcoffset\to\@@pcpaperwidth
+ \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]%
- \adddimenmacro\paperheight\@@pcoffset\@@pcoffset\to\@@pcpaperheight
- \adddimenmacro\paperwidth\@@pcoffset\@@pcoffset\@@pcdistance\@@pcwidth\to\@@pcpaperwidth
+ \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}%
+ \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}%
\defineoverlay[\v!pagecomment][\placepagecommentLR]}%
\processaction
[\@@pclocation]
@@ -1188,7 +1188,7 @@
{\forgetall
\hsize\printpaperwidth
\vskip\@@pcoffset
- \doifelse\@@pclocation\v!bottom{\vskip\paperheight\vskip\@@pcdistance}\vss
+ \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
\hskip\@@pcoffset
\vbox to \@@pcheight
{\forgetall
@@ -1198,7 +1198,7 @@
\global\pagecommentfalse
\fi}%
\hfill
- \doifelse\@@pclocation\v!bottom\vss{\vskip\paperheight\vskip\@@pcdistance}
+ \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
\vskip\@@pcoffset}}
\def\placepagecommentLR
diff --git a/tex/context/base/page-ini.tex b/tex/context/base/page-ini.tex
index b3cab9bdc..61cd91b2b 100644
--- a/tex/context/base/page-ini.tex
+++ b/tex/context/base/page-ini.tex
@@ -642,14 +642,6 @@
%D In case we're not running \ETEX, we need to bypass a
%D couple of primitives.
-\beginTEX \...discards
-
- \chardef \savingvdiscards \zerocount
- \let \splitdiscards \relax
- \let \pagediscards \relax
-
-\endTEX
-
% ONE = single column
% MUL = multi column
% SET = columns sets
@@ -658,8 +650,6 @@
\let\OTRdefault\empty
-\beginETEX \ifcsname
-
\def\OTRcommand#1%
{\csname\@@OTR
\ifcsname\@@OTR\OTRidentifier\strippedcsname#1\endcsname
@@ -669,24 +659,6 @@
\fi\fi
\strippedcsname#1\endcsname}
-\endETEX
-
-\beginTEX
-
-\def\OTRcommand#1%
- {\csname\@@OTR
- \@EA\ifx\csname\@@OTR\OTRidentifier\strippedcsname#1\endcsname\relax
- \@EA\ifx\csname\@@OTR\OTRdefault\strippedcsname#1\endcsname\relax % fallback
- \else
- \OTRdefault
- \fi
- \else
- \OTRidentifier
- \fi
- \strippedcsname#1\endcsname}
-
-\endTEX
-
% obsolete
\def\installotr#1% andere naam, beter \connectotr of zo
diff --git a/tex/context/base/page-lay.tex b/tex/context/base/page-lay.tex
index 70414c500..9e86bcae2 100644
--- a/tex/context/base/page-lay.tex
+++ b/tex/context/base/page-lay.tex
@@ -760,7 +760,7 @@
\def\reportpagedimensions
{\ifx\poppagedimensions\relax \else
- \space\@@zaheight\space-\space
+ \space\the\dimexpr\@@zaheight\relax\space-\space
\fi
\realfolio}
@@ -1364,6 +1364,11 @@
\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]
diff --git a/tex/context/base/page-log.tex b/tex/context/base/page-log.tex
index 5140486af..ad8a37a9b 100644
--- a/tex/context/base/page-log.tex
+++ b/tex/context/base/page-log.tex
@@ -149,12 +149,9 @@
\dodosetlogobox\v!top\blap
\vskip\topspace
\dodosetlogobox\v!header\blap
- \vskip\headerheight
- \vskip\headerdistance
+ \vskip\dimexpr\headerheight+\headerdistance\relax
\dodosetlogobox\v!text\blap
- \vskip\textheight
- \vskip\footerdistance
- \vskip\footerheight
+ \vskip\dimexpr\textheight+\footerdistance+\footerheight\relax
\dodosetlogobox\v!footer \tlap
\vfilll
\dodosetlogobox\v!bottom\tlap
diff --git a/tex/context/base/page-lyr.tex b/tex/context/base/page-lyr.tex
index a1af3adc9..af84900b2 100644
--- a/tex/context/base/page-lyr.tex
+++ b/tex/context/base/page-lyr.tex
@@ -17,6 +17,7 @@
% todo : first / last / next / +... => page key
% test on left/right box when no doublesided option given
+% use \ifcsname instead of doifvalue
\unprotect
@@ -162,24 +163,27 @@
\doifvalue{\??ll#1\c!option}\v!test\tracelayerstrue
\iftracelayers\traceboxplacementtrue\fi
\dowithnextbox % sneller als aparte macro
- {\ifundefined{\@@layerbox#1}%
- \writestatus{layer}{unknown layer #1}%
- \else
- \doifelse{#2}\v!even
- {\ifodd\realpageno
+ {\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}%
- {\doifelse{#2}\v!odd
- {\ifodd\realpageno
- \dododosetlayer[#1][\v!right][#3]%
- %\else
- % discard nextbox
- \fi}%
- {\dododosetlayer[#1][#2][#3]}}%
+ \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}
+ \egroup}%
\hbox}
\newbox\layerbox
@@ -249,7 +253,7 @@
% etc
\executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}%
% that was real slow
- \doif{\layerparameter\c!position}\v!overlay % slow
+ \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
@@ -379,17 +383,14 @@
\hsize\layerparameter\c!width % new, keep box small
\vbox to \layerparameter\c!height \bgroup
\smashbox\nextbox
- \vskip\@@layerypos
- \vskip\@@layeryoff
- \hskip\@@layerxpos
- \hskip\@@layerxoff
+ \vskip\dimexpr\@@layerypos+\@@layeryoff\relax
+ \hskip\dimexpr\@@layerxpos+\@@layerxoff\relax
\flushnextbox
\ifvoid\layerpagebox
% already flushed
\else
% the reverse case % check !
- \vskip-\@@layerypos
- \vskip-\@@layeryoff
+ \vskip-\dimexpr\@@layerypos+\@@layeryoff\relax
\box\layerpagebox
\fi
\egroup}%
diff --git a/tex/context/base/page-mar.tex b/tex/context/base/page-mar.tex
index c6804704b..2ca82a79e 100644
--- a/tex/context/base/page-mar.tex
+++ b/tex/context/base/page-mar.tex
@@ -542,7 +542,7 @@
%D \stopbuffer
%D
%D \dorecurse{80}\getbuffer \page
-%D stoptypen
+%D \stoptyping
%D
%D and
%D
diff --git a/tex/context/base/page-mul.tex b/tex/context/base/page-mul.tex
index e8375d2e0..5c98d7226 100644
--- a/tex/context/base/page-mul.tex
+++ b/tex/context/base/page-mul.tex
@@ -495,7 +495,9 @@
\ifnum\multicolumnendsyncmethod=\plustwo
\synchronizeoutput
\else
- \vskip\lineheight\vskip-\lineheight % take footnotes into account
+ % don't combine these
+ \vskip\lineheight
+ \vskip-\lineheight % take footnotes into account
\fi
\dontshowcomposition
\doflushcolumnfloat % added recently
diff --git a/tex/context/base/page-num.tex b/tex/context/base/page-num.tex
index 404974f82..cad7d6790 100644
--- a/tex/context/base/page-num.tex
+++ b/tex/context/base/page-num.tex
@@ -307,15 +307,14 @@
\def\decrementpagenumber{\getvalue{\??pn-\@@pnstate}}
\def\incrementpagenumber{\getvalue{\??pn+\@@pnstate}}
-\letvalue{\??pn-\v!start }\dodecrementpagenumber
-\letvalue{\??pn-\v!none }\dodecrementpagenumber
-\letvalue{\??pn-\v!empty }\dodecrementpagenumber
+\letvalue{\??pn-\v!start}\dodecrementpagenumber
+\letvalue{\??pn-\v!none }\dodecrementpagenumber
+\letvalue{\??pn-\v!empty}\dodecrementpagenumber
-\letvalue{\??pn+\v!start }\doincrementpagenumber
-\letvalue{\??pn+\v!none }\doincrementpagenumber
-\setvalue{\??pn+\v!empty }{\doincrementpagenumber
- \dosynchronizepagenumber}
-\letvalue{\??pn+\v!keep}\dosynchronizepagenumber
+\letvalue{\??pn+\v!start}\doincrementpagenumber
+\letvalue{\??pn+\v!none }\doincrementpagenumber
+\setvalue{\??pn+\v!empty}{\doincrementpagenumber\dosynchronizepagenumber}
+\letvalue{\??pn+\v!keep }\dosynchronizepagenumber
% so far
@@ -412,23 +411,21 @@
\let\stelnummeringin\setuppagenumbering
-% listig: hangt af van \@@kolijst
-
-% erg fout
+% wrong
%
% \def\preparepageprefix#1%
% {\def\dopreparepageprefix##1%
-% {\doifvalue{#1##1\c!nummer}{\v!ja}
-% {\setvalue{#1\getvalue{\??by##1}\c!nummer}{\v!ja}}}%
+% {\doifvalue{#1##1\c!number}{\v!yes}
+% {\setvalue{#1\getvalue{\??by##1}\c!nummer}{\v!yes}}}%
% \processcommacommand[\@@kolijst]\dopreparepageprefix}
%
-% nog fouter
+% more wrong
%
% \def\preparepageprefix#1%
% {\def\dopreparepageprefix##1%
-% {\doifelsevalue{#1##1\v!nummer}{\v!ja} % v
-% {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!ja}} % v
-% {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!nee}}}% % v
+% {\doifelsevalue{#1##1\v!number}{\v!yes} % v
+% {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!yes}} % v
+% {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!no}}}% % v
% \processcommacommand[\@@kolijst]\dopreparepageprefix}
%
% best, beware, chapter (yes) can be followed by title (no)
@@ -484,9 +481,6 @@
{{\doif\@@nmstrut\v!yes\strut
\@@nmcommand{\doattributes\??nm\c!style\c!color{\completepagenumber}}}}}
-\def\@@plaatspaginascheider% still used ?
- {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}\@@nmtextseparator}
-
\def\userfolio {\convertednumber[\s!page]} % naast realfolio
\def\pagenumber{\userfolio}
diff --git a/tex/context/base/page-plg.tex b/tex/context/base/page-plg.tex
index b8da7f88a..486d4e183 100644
--- a/tex/context/base/page-plg.tex
+++ b/tex/context/base/page-plg.tex
@@ -115,8 +115,7 @@
{\vbox to \textheight
{\offinterlineskip
% optie
- \vskip-1\topskip
- \vskip\strutheight
+ \vskip\dimexpr-1\topskip+\strutheight\relax
%
\textwidth\makeupwidth
\hsize\textwidth
diff --git a/tex/context/base/page-set.tex b/tex/context/base/page-set.tex
index 6dc5598e0..16a9dcc99 100644
--- a/tex/context/base/page-set.tex
+++ b/tex/context/base/page-set.tex
@@ -203,8 +203,6 @@
\relax % needed ! ! ! ! else lookahead over \fi and \@EA
\@EA\egroup\@EA\scratchdimen\the\!!dimena\relax}
-\beginETEX \ifcsname
-
\def\columnerasegridboxes % maybe dedicated loops
{\bgroup
\increment\columnmaxcells\relax
@@ -253,59 +251,6 @@
\global\columnfreecells\columnfirstcell
\egroup}
-\endETEX
-
-\beginTEX
-
-\def\columnerasegridboxes
- {\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
- {\expandafter\ifx\csname\@otr@:\!!stringa:\recurselevel\endcsname\relax
- \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
- \expandafter\ifx\csname\@otr@:\!!stringb:\recurselevel\endcsname\relax
- \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
- \else
- \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
- \fi
- \else
- \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box
- \expandafter\ifx\csname\@otr@:\!!stringb:\recurselevel\endcsname\relax
- \voidb@x
- %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\voidb@x
- \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
- \else
- \csname\@otr@:\!!stringb:\recurselevel\endcsname
- %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
- \fi
- \fi}}%
- \else
- \dorecurse\tofcolumns
- {\let\!!stringa\recurselevel
- \dostepwiserecurse \zerocount \columnmaxcells \plusone
- {\expandafter\ifx\csname\@otr@:\!!stringa:\recurselevel\endcsname\relax
- \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
- \else
- \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\voidb@x
- \fi}}%
- \fi
- \dorecurse\tofcolumns
- {\global\setbox\csname\@otr@:\recurselevel:\columnmaxcells\endcsname\copy\placeholderboxa}%
- \global\columnfirstcell\zerocount
- \global\columnlastcell\columnfirstcell
- \global\columnfreecells\columnfirstcell
- \egroup}
-
-\endTEX
-
\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
@@ -340,63 +285,32 @@
\def\currentcolumnmaxcellstag #1{\??mc:l:\OTRSETidentifier:\columnsetpage:\number#1}
\def\currentcolumnstartcelltag#1{\??mc:s:\OTRSETidentifier:\columnsetpage:\number#1}
-\beginTEX
+\def\doresetcolumnsetlines#1%
+ {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+ \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+ \fi
+ \ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+ \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+ \fi}
- \def\doresetcolumnsetlines#1%
- {\ifundefined{\currentcolumnmaxcellstag{#1}}\else
- \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
- \fi
- \ifundefined{\currentcolumnmaxcellstag{#1}}\else
- \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
- \fi}
-
- \def\currentcolumnsomecells#1#2%
- {\expandafter\ifx\csname#1\mofcolumns\endcsname\relax
- \expandafter\ifx\csname#10\endcsname\relax
- #2%
- \else
- \ifnum\csname#10\endcsname=\zerocount
- #2\else\csname#10\endcsname
- \fi
- \fi
+\def\currentcolumnsomecells#1#2%
+ {\ifcsname#1\mofcolumns\endcsname
+ \ifnum\csname#1\mofcolumns\endcsname=\zerocount
+ #2%
\else
- \ifnum\csname#1\mofcolumns\endcsname=\zerocount
- #2\else\csname#1\mofcolumns\endcsname
- \fi
- \fi}
-
-\endTEX
-
-\beginETEX \numexpr
-
- \def\doresetcolumnsetlines#1%
- {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname
- \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+ \number\numexpr(\ifnum\csname#1\mofcolumns\endcsname<\zerocount
+ \columnmaxcells+\fi\csname#1\mofcolumns\endcsname)%
\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)%
- \fi
- \else\ifcsname#10\endcsname
- \ifnum\csname#10\endcsname=\zerocount
- #2%
- \else
- \number\numexpr(\ifnum\csname#10\endcsname<\zerocount
- \columnmaxcells+\fi\csname#10\endcsname)%
- \fi
- \else
+ \else\ifcsname#10\endcsname
+ \ifnum\csname#10\endcsname=\zerocount
#2%
- \fi\fi}
-
-\endETEX
+ \else
+ \number\numexpr(\ifnum\csname#10\endcsname<\zerocount
+ \columnmaxcells+\fi\csname#10\endcsname)%
+ \fi
+ \else
+ #2%
+ \fi\fi}
\def\currentcolumnmaxcells {\currentcolumnsomecells\currentcolumnmaxcellstag \columnmaxcells}
\def\currentcolumnstartcell{\currentcolumnsomecells\currentcolumnstartcelltag\plusone}
diff --git a/tex/context/base/page-txt.tex b/tex/context/base/page-txt.tex
index c39d592ab..b40ecb16e 100644
--- a/tex/context/base/page-txt.tex
+++ b/tex/context/base/page-txt.tex
@@ -381,14 +381,11 @@
\calculatereducedvsizes
\swapmargins
\offinterlineskip
- \vskip-\topheight
- \vskip-\topdistance
+ \vskip\dimexpr-\topheight-\topdistance\relax
\the\toptextcontent
- \vskip\topheight
- \vskip\topdistance
+ \vskip\dimexpr\topheight+\topdistance\relax
\the\headertextcontent
- \vskip\headerheight
- \vskip\headerdistance
+ \vskip\dimexpr\headerheight+\headerdistance\relax
\placepositionanchors
\vskip-\textheight
\the\texttextcontent
@@ -396,8 +393,7 @@
\the\everyendoftextbody
\vskip\footerdistance
\the\footertextcontent
- \vskip\footerheight
- \vskip\bottomdistance
+ \vskip\dimexpr\footerheight+\bottomdistance\relax
\the\bottomtextcontent
\vskip\bottomheight
\vfilll}%
@@ -410,9 +406,7 @@
\calculatereducedvsizes
\calculatehsizes
\swapmargins
- \vskip\headerheight
- \vskip\headerdistance
- \vskip\layoutparameter\c!textdistance
+ \vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax
\hbox to \makeupwidth
{\bgroup
\swapmargins
@@ -430,10 +424,10 @@
\egroup
\mkprocesspagecontents{#2}%
\settextpagecontent\scratchpagebox{#1}{#2}%
-\setbox\scratchpagebox\vbox
- {\startlayoutcomponent{textbody}{text body}%
- \box\scratchpagebox
- \stoplayoutcomponent}%
+ \setbox\scratchpagebox\vbox % can we avoid this extra box
+ {\startlayoutcomponent{textbody}{text body}%
+ \box\scratchpagebox
+ \stoplayoutcomponent}%
\addtextbackground\scratchpagebox
\addtextgridlayer\scratchpagebox
\localstarttextcolor
diff --git a/tex/context/base/ppchtex.tex b/tex/context/base/ppchtex.tex
index 13c457800..a7800acd4 100644
--- a/tex/context/base/ppchtex.tex
+++ b/tex/context/base/ppchtex.tex
@@ -556,6 +556,10 @@
\stopMPdrawing
\fi}
+\ifx\MPdivten\undefined % hack to prevent overflows in mp
+ \def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}
+\fi
+
\def\@@setchemicalaxis#1#2#3#4%
{\ifcase\chemicaldrawingmode
\axis
@@ -568,6 +572,7 @@
\psaxes[labels=none,Dx=500,Dy=500](0,0)(#1,#3)(#2,#4)%
\or
\global\MPdrawingdonetrue
+ % we need to div beforehand because of mp limitations
\startMPdrawing
x1 := \MPdivten[#1]u ; x2 := \MPdivten[#2]u;
y1 := \MPdivten[#3]u ; y2 := \MPdivten[#4]u;
diff --git a/tex/context/base/prop-lay.mkii b/tex/context/base/prop-lay.mkii
new file mode 100644
index 000000000..5dce6c33b
--- /dev/null
+++ b/tex/context/base/prop-lay.mkii
@@ -0,0 +1,44 @@
+%D \module
+%D [ file=prop-lay,
+%D version=2003.04.20,
+%D title=\CONTEXT\ Property Macros,
+%D subtitle=Layers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\let\currentlayerproperty\empty
+
+\def\checklayerproperty
+ {\doifelse{\checkedpropertyparameter\v!printable\currentproperty}\v!no
+ {\def\printviewerlayer{0}}
+ {\def\printviewerlayer{1}}%
+ \dodefineviewerlayer
+ \currentproperty % tag
+ {\checkedpropertyparameter\c!title\currentproperty}%
+ {\checkedpropertyparameter\c!state\v!start}% visible or hidden
+ {0}% type (1=frozen)
+ {\printviewerlayer}}% 1=printable
+
+\def\startlayerproperty
+ {\let\currentlayerproperty\currentproperty
+ \dostartviewerlayer\currentproperty}
+
+\def\stoplayerproperty
+ {\dostopviewerlayer
+ \let\currentlayerproperty\previousproperty}
+
+\def\domakelayerpropertylist
+ {\iflocation
+ \expandafter\domakeviewerlayerlist
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/prop-lay.mkiv b/tex/context/base/prop-lay.mkiv
new file mode 100644
index 000000000..051e2e5be
--- /dev/null
+++ b/tex/context/base/prop-lay.mkiv
@@ -0,0 +1,52 @@
+%D \module
+%D [ file=prop-lay,
+%D version=2008.09.16,
+%D title=\CONTEXT\ Property Macros,
+%D subtitle=Layers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% test, nesting is somewhat special with layers
+%
+% \defineproperty[hans][layer]
+% \defineproperty[ton] [layer]
+% \setupheadertexts[no layer]
+% 1\startproperty[hans]2\startproperty[ton]3\stopproperty4\stopproperty5
+
+\unprotect
+
+\let\currentlayerproperty\empty
+
+\def\startlayerproperty
+ {\let\currentlayerproperty\currentproperty
+ \dotriggerviewerlayer\currentlayerproperty}
+
+\def\stoplayerproperty
+ {\let\currentlayerproperty\previousproperty
+ \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}
+
+\protect \endinput
diff --git a/tex/context/base/prop-lay.tex b/tex/context/base/prop-lay.tex
index f29298976..2f6b2ef02 100644
--- a/tex/context/base/prop-lay.tex
+++ b/tex/context/base/prop-lay.tex
@@ -13,30 +13,22 @@
\writestatus{loading}{Context Property Macros / layers}
-%D Highly experimental, will probably change/evolve.
+%D Highly experimental, will probably change/evolve. Also, quite certainly
+%D we will no longer share code between mkii and mkiv.
\unprotect
-\def\checklayerproperty
- {\doifelse{\checkedpropertyparameter\v!printable\currentproperty}\v!no
- {\def\printviewerlayer{0}}
- {\def\printviewerlayer{1}}%
- \dodefineviewerlayer
- \currentproperty % tag
- {\checkedpropertyparameter\c!title\currentproperty}%
- {\checkedpropertyparameter\c!state\v!start}% visible or hidden
- {0}% type (1=frozen)
- {\printviewerlayer}}% 1=printable
+%D Plugin:
-\let\currentlayerproperty\empty
+\loadmarkfile{prop-lay}
-\def\startlayerproperty
- {\let\currentlayerproperty\currentproperty
- \dostartviewerlayer\currentproperty}
+% \currentlayerproperty
+% \checklayerproperty
+% \startlayerproperty
+% \stoplayerproperty
+% \domakelayerpropertylist
-\def\stoplayerproperty
- {\dostopviewerlayer
- \let\currentlayerproperty\previousproperty}
+%D shared interface, rest in mk files
\setglobalsystemreference \rt!exec \v!HideLayer {hidelayer}
\setglobalsystemreference \rt!exec \v!VideLayer {videlayer}
@@ -46,13 +38,6 @@
\setexecutecommandcheck {videlayer} \domakelayerpropertylist
\setexecutecommandcheck {togglelayer} \domakelayerpropertylist
-\def\domakelayerpropertylist
- {\iflocation
- \expandafter\domakeviewerlayerlist
- \else
- \expandafter\gobbleoneargument
- \fi}
-
% \defineproperty [debugging] [\s!layer] [title=debugging]
% \defineproperty [navigation] [\s!layer] [title=navigation]
diff --git a/tex/context/base/regi-ini.lua b/tex/context/base/regi-ini.lua
index 71aad21a3..72e93e67d 100644
--- a/tex/context/base/regi-ini.lua
+++ b/tex/context/base/regi-ini.lua
@@ -17,6 +17,8 @@ regimes.data = regimes.data or { }
regimes.utf = regimes.utf or { }
regimes.context = regimes.context or { }
+local char, utfchar = string.char, unicode.utf8.char
+
-- setmetatable(regimes.data,_empty_table_)
regimes.currentregime = ""
@@ -51,7 +53,7 @@ function regimes.load(regime)
if regimes.data[regime] then
regimes.utf[regime] = { }
for k,v in pairs(regimes.data[regime]) do
- regimes.utf[regime][string.char(k)] = unicode.utf8.char(v)
+ regimes.utf[regime][char(k)] = utfchar(v)
end
end
end
@@ -79,7 +81,7 @@ function regimes.enable(regime)
end
function regimes.disable()
- regimes.currentregime = ""
+ regimes.currentregime = ""
input.filters.dynamic_translator = nil
end
diff --git a/tex/context/base/regi-ini.mkiv b/tex/context/base/regi-ini.mkiv
index ef269985c..763903fa1 100644
--- a/tex/context/base/regi-ini.mkiv
+++ b/tex/context/base/regi-ini.mkiv
@@ -22,15 +22,17 @@
\def\mkdisableregime {\ctxlua{regimes.disable()}}
\def\mkshowregime #1{\ctxlua{regimes.context.show("#1")}}
-\appendtoks
- \pushmacro\currentregime
- \disableregime
-\to \everystartreadingfile
-
-\appendtoks
- \popmacro\currentregime
- \enableregime[\currentregime]%
-\to \everystopreadingfile
+% hm, this kind of disables regimes .. too tricky
+%
+% \appendtoks
+% \pushmacro\currentregime
+% \disableregime
+% \to \everystartreadingfile
+
+% \appendtoks
+% \popmacro\currentregime
+% \enableregime[\currentregime]%
+% \to \everystopreadingfile
\protect \endinput
diff --git a/tex/context/base/regi-utf.tex b/tex/context/base/regi-utf.tex
index 297ad9649..2662c0017 100644
--- a/tex/context/base/regi-utf.tex
+++ b/tex/context/base/regi-utf.tex
@@ -29,10 +29,6 @@
% Ãýÿ
% ß
-\beginTEX
- \expandafter \endinput
-\endTEX
-
\beginXETEX
\expandafter \endinput
\endXETEX
diff --git a/tex/context/base/s-mag-01.tex b/tex/context/base/s-mag-01.tex
index 54d997fc1..da4e027f4 100644
--- a/tex/context/base/s-mag-01.tex
+++ b/tex/context/base/s-mag-01.tex
@@ -200,7 +200,7 @@
\startsetups [leftbanner]
- \definedfont[Regular at \bottomheight]
+ \definedfont[Regular at \the\bottomheight]
\setbox\scratchbox\hbox{\TitleColor\getvariable{magazine}{main}}
\ht\scratchbox1ex
\dp\scratchbox\zeropoint
@@ -222,7 +222,7 @@
\startsetups [rightbanner]
- \definedfont[Regular at \bottomheight]
+ \definedfont[Regular at \the\bottomheight]
\setbox\scratchbox\hbox{\TitleColor\getvariable{magazine}{main}}
\ht\scratchbox1ex
\dp\scratchbox\zeropoint
diff --git a/tex/context/base/s-map-10.tex b/tex/context/base/s-map-10.tex
index 362aa2700..807ae42ef 100644
--- a/tex/context/base/s-map-10.tex
+++ b/tex/context/base/s-map-10.tex
@@ -478,5 +478,10 @@
%\let\abovedisplayskip\iabovedisplayskip
%\let\abovedisplayshortskip\iabovedisplayshortskip
+\setuplanguage
+ [nl]
+ [\c!leftquote=\upperleftsinglesixquote,
+ \c!leftquotation=\upperleftdoublesixquote]
+
%\protect
\endinput
diff --git a/tex/context/base/s-pre-70.tex b/tex/context/base/s-pre-70.tex
new file mode 100644
index 000000000..1a842388b
--- /dev/null
+++ b/tex/context/base/s-pre-70.tex
@@ -0,0 +1,170 @@
+% engine=luatex
+
+%D \module
+%D [ file=s-pre-70,
+%D version=2008.04.15,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 70,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA / Hans Hagen]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[punk] \usetypescript[punk] \setupbodyfont[punk,20pt]
+
+%D At the cost of more runtime and a larger output file, we
+%D turn on randomization. The instances are cached in the
+%D MkIV cache, so successive runs use the same shapes.
+
+\EnableRandomPunk
+
+%D We use the regular screen size paper and layout setup.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=30pt,
+ backspace=30pt,
+ width=middle,
+ height=fit,
+ header=0pt,
+ footer=0pt,
+ bottomdistance=24pt,
+ bottom=30pt,
+ bottom=18pt,
+ top=0pt]
+
+\setupinterlinespace
+ [top=height,
+ line=1.25\bodyfontsize]
+
+\setupcolors
+ [state=start,
+ textcolor=white]
+
+\setupinteraction
+ [state=start,
+ %click=off,
+ menu=on]
+
+%D We predefine a few palets. Of course you can define more.
+
+\definecolor[punkblue] [r=.4,b=.8,g=.4]
+\definecolor[punkgreen] [r=.4,b=.4,g=.8]
+\definecolor[punkred] [r=.8,b=.4,g=.4]
+\definecolor[punkyellow][r=.6,g=.6,b=.2]
+
+\definepalet [punk-one] [textcolor=punkblue,pagecolor=punkgreen]
+\definepalet [punk-two] [textcolor=punkred,pagecolor=punkyellow]
+\definepalet [punk-three] [textcolor=punkblue,pagecolor=punkyellow]
+\definepalet [punk-one-reverse] [textcolor=punkgreen,pagecolor=punkblue]
+\definepalet [punk-two-reverse] [textcolor=punkyellow,pagecolor=punkred]
+\definepalet [punk-three-reverse] [textcolor=punkyellow,pagecolor=punkblue]
+
+\setuppalet[punk-one]
+
+%D We use a few backgrounds. The hyperlink that invokes the
+%D stepper is hooked into the text background.
+
+\definelayer
+ [page]
+ [width=\paperwidth,
+ height=\paperheight]
+
+\setupbackgrounds
+ [page]
+ [background={color,page},
+ backgroundcolor=pagecolor,
+ setups=pagestuff]
+
+\setupbackgrounds
+ [text]
+ [background={color,invoke},
+ backgroundoffset=12pt,
+ backgroundcolor=textcolor]
+
+%D We need different symbols for itemized lists.
+
+\definesymbol[1][\hbox{\lower1ex\hbox{*}}]
+\definesymbol[2][\endash]
+\definesymbol[3][\letterhash]
+\definesymbol[3][>]
+
+%D We don't want these reversed clicked areas in Acrobat.
+
+\setupinteraction
+ [click=no]
+
+%D We define a rather simple navigational panel at the
+%D bottom
+
+\setupinteractionmenu
+ [bottom]
+ [color=white, % pagecolor,
+ contrastcolor=white, % pagecolor,
+ background=color,
+ backgroundcolor=textcolor,
+ frame=off,
+ height=24pt,
+ left=\hfill,
+ middle=\hskip12pt]
+
+\setupsubpagenumber
+ [state=start]
+
+\startinteractionmenu[bottom]
+ \txt
+ \interactionbar
+ [alternative=d,
+ symbol=yes,
+ color=white,
+ contrastcolor=textcolor]
+ \\
+ \hfilll
+ \but [previouspage] < < < \\
+ \but [nextpage] > > > \\
+\stopinteractionmenu
+
+%D Instead of the normal symbols we use more punky ones.
+
+\startsymbolset [punk]
+ \definesymbol[previous] [\string<\string<]
+ \definesymbol[somewhere] [\string^\string^]
+ \definesymbol[next] [\string>\string>]
+\stopsymbolset
+
+\setupinteraction[symbolset=punk]
+
+%D Because the font is rather large, we use less whitespace.
+
+\setuphead
+ [chapter]
+ [after={\blank[big]}]
+
+%D Run this file with the command: \type {context --mode=demo s-pre-70}
+%D in order to get an example.
+
+\doifnotmode{demo} {\endinput}
+
+\usemodule[pre-60] % use the stepper
+
+\starttext
+
+\title {Punk for dummies}
+
+\dorecurse{10} {
+ \title{Just a few dummy pages}
+ \StartSteps \startitemize[packed]
+ \startitemize
+ \startitem bla \FlushStep \stopitem
+ \startitem bla bla \FlushStep \stopitem
+ \startitem bla bla bla \FlushStep \stopitem
+ \startitem bla bla bla bla \FlushStep \stopitem
+ \stopitemize \StopSteps
+}
+
+\stoptext
diff --git a/tex/context/base/s-pre-71.tex b/tex/context/base/s-pre-71.tex
new file mode 100644
index 000000000..3d92830b9
--- /dev/null
+++ b/tex/context/base/s-pre-71.tex
@@ -0,0 +1,208 @@
+% engine=luatex
+
+%D \module
+%D [ file=s-pre-71,
+%D version=2008.08.05,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 71,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D I might improve this module so consider it experimental.
+
+% \enablemode[numbers]
+% \enablemode[paper]
+
+\usemodule[pre-60,abr-02]
+
+\setupinteraction[state=start,click=off]
+
+\definepapersize[wide][width=900pt,height=600pt]
+
+\setuppapersize[wide][wide]
+
+\setuplayout[page]
+
+\setupbodyfont[15pt]
+
+\usetypescriptfile[type-hgz]
+\usetypescript[palatino-informal]
+\setupbodyfont[palatino-informal]
+
+\setupsorting[logo][style=]
+
+\startnotmode[paper]
+ \setupbackgrounds[page][background=color,backgroundcolor=black]
+\stopnotmode
+
+\TransparencyHack
+
+\definelayer[page][width=\paperwidth,height=\paperheight]
+
+\definecolor[TopicColor-1][r=.3,g=.4,b=.5]
+\definecolor[TopicColor-2][r=.3,g=.5,b=.4]
+\definecolor[TopicColor-3][r=.4,g=.3,b=.5]
+\definecolor[TopicColor-4][r=.4,g=.5,b=.3]
+\definecolor[TopicColor-5][r=.5,g=.3,b=.4]
+\definecolor[TopicColor-6][r=.5,g=.4,b=.3]
+\definecolor[TopicColor-7][r=.35,g=.35,b=.6]
+\definecolor[TopicColor-8][r=.6,g=.35,b=.35]
+\definecolor[TopicColor-9][r=.35,g=.6,b=.35]
+
+\definecolor[TopicColor-0][t=.5,a=1,s=.5]
+\definecolor[TopicColor] [s=1]
+
+\setupcolors[state=start,textcolor=TopicColor]
+
+\startluacode
+ local locations = {
+ 'lefttop',
+ 'middletop',
+ 'righttop',
+ 'middleleft',
+ 'middle',
+ 'middleright',
+ 'leftbottom',
+ 'middlebottom',
+ 'rightbottom',
+ }
+ local done, current, previous, n = table.tohash(locations,false), 0, 0, 0
+ function document.reset_locations()
+ done, current, previous, n = table.tohash(locations,false), 0, 0, 0
+ end
+ function document.next_location(loc)
+ previous = current
+ n = n + 1
+ loc = loc and loc ~= "" and tonumber(loc)
+ while true do
+ current = loc or math.random(1,#locations)
+ if not done[current] then
+ done[current] = true
+ break
+ end
+ end
+ end
+ function document.current_location()
+ tex.print(locations[current] or "")
+ end
+ function document.previous_location()
+ tex.print(locations[previous] or "")
+ end
+ function document.current_n()
+ tex.print(tostring(current))
+ end
+ function document.previous_n()
+ tex.print(tostring(previous))
+ end
+ function document.step()
+ tex.print(tostring(n))
+ end
+\stopluacode
+
+\def\StartTopics
+ {\startstandardmakeup
+ \ctxlua{document.reset_locations()}
+ \doifnotmode{paper}{\StartLocalSteps}}
+
+\def\StopTopics
+ {\doifnotmode{paper}{\StopLocalSteps}
+ \flushlayer[page]
+ \stopstandardmakeup}
+
+\def\StartTopic
+ {\dosingleempty\doStartTopic}
+
+\def\doStartTopic[#1]%
+ {\doifnotmode{paper}{\NextStep}
+ \ctxlua{document.next_location("#1")}
+ \startnotmode[paper]
+ \doifnothing{#1}
+ {\ifcase\ctxlua{document.previous_n()}\else
+ \setlayer
+ [page]
+ [preset=\ctxlua{document.previous_location()}]
+ \bgroup
+ \doifnotmode{paper}{\startproperty[\StepLayer]}%
+ \framed
+ [offset=20pt,
+ strut=no,
+ align=normal,
+ frame=off,
+ height=\dimexpr\paperheight/3\relax,
+ width=\dimexpr\paperwidth/3\relax,
+ background=color,
+ backgroundcolor=TopicColor-0]
+ {}%
+ \doifnotmode{paper}{\stopproperty}%
+ \egroup
+ \fi}
+ \stopnotmode
+ \setlayer
+ [page]
+ [preset=\ctxlua{document.current_location()}]
+ \bgroup
+ \doifnotmode{paper}{\startproperty[\StepLayer]}%
+ \framed
+ [offset=20pt,
+ strut=no,
+ align=\expdoifelse{#1}{}{normal}{middle,lohi},
+ align=\expdoifelse{#1}{}{flushleft,verytolerant}{middle,lohi},
+ frame=off,
+ height=\dimexpr\paperheight/3\relax,
+ width=\dimexpr\paperwidth/3\relax,
+ background=color,
+ backgroundcolor=TopicColor-\ctxlua{document.current_n()}]
+ \bgroup
+ \ignorespaces}
+
+\def\StopTopic
+ {\removeunwantedspaces
+ \egroup
+ \doifnotmode{paper}{\stopproperty}%
+ \egroup
+ \startmode[numbers]
+ \setlayerframed
+ [page]
+ [preset=\ctxlua{document.current_location()}]
+ [height=\dimexpr\paperheight/3\relax,
+ width=\dimexpr\paperwidth/3\relax,
+ frame=off,
+ foregroundstyle=\bfa,
+ align={flushright,low}]
+ {\doifnotmode{paper}{\startproperty[\StepLayer]}%
+ \ctxlua{document.step()}\kern\strutdepth
+ \doifnotmode{paper}{\stopproperty}}
+ \stopmode}
+
+\logo [METAPOST] {MetaPost}
+
+\definefont[TitleFont][SansBold at 60pt]
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\StartTopics
+ \StartTopic[1] A \StopTopic
+ \StartTopic[5] B \StopTopic
+ \StartTopic[9] C \StopTopic
+\StopTopics
+
+\StartTopics
+ \StartTopic A \StopTopic
+ \StartTopic B \StopTopic
+ \StartTopic C \StopTopic
+ \StartTopic D \StopTopic
+ \StartTopic E \StopTopic
+ \StartTopic F \StopTopic
+ \StartTopic G \StopTopic
+ \StartTopic H \StopTopic
+ \StartTopic I \StopTopic
+\StopTopics
+
+\stoptext
diff --git a/tex/context/base/spec-def.mkii b/tex/context/base/spec-def.mkii
index 6a66c68cb..a151461c4 100644
--- a/tex/context/base/spec-def.mkii
+++ b/tex/context/base/spec-def.mkii
@@ -13,4 +13,8 @@
%D This file is empty.
+\appendtoks
+ \setupoutput[dvips]%
+\to \everydump
+
\endinput
diff --git a/tex/context/base/spec-def.mkiv b/tex/context/base/spec-def.mkiv
index 82e121864..eaf20753c 100644
--- a/tex/context/base/spec-def.mkiv
+++ b/tex/context/base/spec-def.mkiv
@@ -16,4 +16,8 @@
\registerctxluafile{spec-pdf}{1.001}
+\appendtoks
+ \setupoutput[pdftex]%
+\to \everydump
+
\endinput
diff --git a/tex/context/base/spec-def.tex b/tex/context/base/spec-def.tex
index fcffbefde..74fac733a 100644
--- a/tex/context/base/spec-def.tex
+++ b/tex/context/base/spec-def.tex
@@ -18,6 +18,11 @@
\unprotect
+%D Ok, messy, but we need this because we load drivers before
+%D references.
+
+\newif\ifcollectreferenceactions
+
%D The following libraries are defined. Two postscript
%D drivers are supported, as well as two mechanisms for
%D interactive texts.
@@ -986,11 +991,6 @@
\defineoutput [xdv] [dvi,xtx,xet]
\defineoutput [xdv2pdf] [dvi,xtx,xet]
-%D Please let me know if we need more. From now on we default
-%D to:
-
-\setupoutput [dvips]
-
%D We don't enable \ACROBAT, because pure \POSTSCRIPT\ is not
%D that strong on objects and \PDFTEX\ does a better job.
%D Some reasonable alternatives are:
@@ -1008,4 +1008,9 @@
\loadmarkfile{spec-def}
+%D Please let me know if we need more. From now on we default
+%D to:
+
+% \setupoutput [dvips] % see mkii/mkiv files
+
\protect \endinput
diff --git a/tex/context/base/spec-dpx.tex b/tex/context/base/spec-dpx.tex
index 3dc82d49e..0753d173c 100644
--- a/tex/context/base/spec-dpx.tex
+++ b/tex/context/base/spec-dpx.tex
@@ -661,9 +661,6 @@
{\dogetobjectreference{#1}{#2}#3%
\ifx#3\empty\else\edef#3{#3}\fi}
-% \def\doPDFgetobjectpage #1#2#3{..}
-% \def\doPDFgetobjectpagereference#1#2#3{..}
-
\def\doPDFgetpagereference#1#2%
{\edef#2{@page#1}}
@@ -693,48 +690,24 @@
\definespecial\dostopclipping
{\PDFcode{Q n}}
-%D 4. Modified codes from \type{supp-mpe}
+%D 4. Modified codes from \type{supp-pdf}
-\def\stopMPshading
+\def\dosetMPsomePDFshade#1#2%
{\global\advance\currentPDFshade \plusone
- \setxvalue{obj:Sh:\currentMPspecial}%
- {/Sh\the\currentPDFshade\space @obj:Sh:\currentMPspecial\space}%
- \setxvalue{mps:Sh:\currentMPspecial}%
- {\the\currentPDFshade}}
-
-\defineMPspecial{30}
- {\startMPshading{14}% type 2
- \setMPshadingcolors{4}{5}{6}{9}{10}{11}%
- \special{pdf:object @ftn:Sh:\currentMPspecial\space
- <>}%
- \special{pdf:object @obj:Sh:\currentMPspecial\space
- <>}%
- \stopMPshading}
-
-\defineMPspecial{31}
- {\startMPshading{16}% type 3
- \setMPshadingcolors{4}{5}{6}{10}{11}{12}%
- \special{pdf:object @ftn:Sh:\currentMPspecial\space
- <>}%
- \special{pdf:object @obj:Sh:\currentMPspecial\space
- <>}%
- \stopMPshading}
+ \special{pdf:object @ftn:Sh:\currentPDFshade\space
+ <>}%
+ \special{pdf:object @obj:Sh:\currentPDFshade\space
+ <>}%
+ \appendtoPDFdocumentshades{/Sh\the\currentPDFshade\space @obj:Sh:\currentPDFshade}%
+ \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
\def\handleMPfigurespecial#1#2#3#4#5#6#7% toto : combine with ext fig
{\doiffileelse{#7}
diff --git a/tex/context/base/spec-fdf.mkii b/tex/context/base/spec-fdf.mkii
index a329dc50a..1ada3e880 100644
--- a/tex/context/base/spec-fdf.mkii
+++ b/tex/context/base/spec-fdf.mkii
@@ -39,12 +39,8 @@
%D 20K named destinations "x(x) x"). Of course when you use
%D page destinations, the saving is nil.
-% \beginETEX \scantokens
-%
% \doifnotmode{atpragma}{\let\next\setPDFdestination} % experimental
%
-% \bgroup
-%
% \catcode`\/=\@@active \catcode`\#=\@@active
% \catcode`\<=\@@active \catcode`\>=\@@active
% \catcode`\[=\@@active \catcode`\]=\@@active
@@ -75,8 +71,6 @@
% \egroup}
%
% \doifnotmode{atpragma}{\let\setPDFdestination\next} % experimental
-%
-% \endETEX
%D This is a slow one, that uses \type{\lccode}'s to
%D change the glyph as well as converts sensisitve ones into a
@@ -114,8 +108,6 @@
\@EA\handletokens\ascii\with\docommand
\egroup}
-% \beginETEX \scantokens
-%
% \doifnotmode{atpragma}{\let\next\sanitizePDFstring} % experimental
%
% \bgroup
@@ -149,8 +141,6 @@
%
% \doifnotmode{atpragma}{\let\sanitizePDFstring\next} % experimental
%
-% \endETEX
-%
% There is an unicode variant in spec-tst!
\protect \endinput
diff --git a/tex/context/base/spec-fdf.tex b/tex/context/base/spec-fdf.tex
index 51da45ff7..ff801c95f 100644
--- a/tex/context/base/spec-fdf.tex
+++ b/tex/context/base/spec-fdf.tex
@@ -2166,8 +2166,6 @@
% test should happen in core-ref
-\beginETEX \ifcsname
-
\def\getsecondaryPDFreferences
{\ifcase\nofsecondaryreferences\else
\ifcsname PDF-SR:\the\nofsecondaryreferences\endcsname
@@ -2179,23 +2177,6 @@
\expandafter\getsecondaryPDFreferences
\fi}
-\endETEX
-
-\beginTEX
-
-\def\getsecondaryPDFreferences
- {\ifcase\nofsecondaryreferences\else
- \@EA\ifx\csname PDF-SR:\the\nofsecondaryreferences\endcsname\relax\else
- \xdef\secondaryPDFreferences
- {/Next << \csname PDF-SR:\the\nofsecondaryreferences\endcsname\space
- \secondaryPDFreferences >>}%
- \fi
- \global\advance\nofsecondaryreferences \minusone
- \expandafter\getsecondaryPDFreferences
- \fi}
-
-\endTEX
-
%D \macros
%D {loadFDFfields, showFDFfields,
%D getFDFfield, setFDFfield}
diff --git a/tex/context/base/spec-ini.tex b/tex/context/base/spec-ini.tex
index a344219ac..221b8f4a2 100644
--- a/tex/context/base/spec-ini.tex
+++ b/tex/context/base/spec-ini.tex
@@ -301,17 +301,6 @@
\let\currentspecial \empty
\let\currentspecialfile\empty
-\let\preloadedspecials \empty
-
-%D \macros
-%D {preloadspecials}
-%D
-%D The following command can be used to show the loaded list
-%D of specials.
-
-\def\preloadspecials
- {\doifsomething\preloadedspecials
- {\showmessage\m!specials1\preloadedspecials}}
%D \macros
%D {startspecials}
@@ -330,8 +319,7 @@
\doifelsenothing{#1}
{\let\currentspecial\s!unknown}
{\def\currentspecial{#1}}%
- \unprotect
- \addtocommalist\currentspecial\preloadedspecials}
+ \unprotect}
\def\startspecials
{\localpushmacro\currentspecial
@@ -376,11 +364,7 @@
{\the\everyresetspecials
\def\docommand##1%
{\letvalue{\@@speclst@@##1}\empty}%
- \processcommacommand[\@@allspecials]\docommand
- \ifx\preloadedspecials\empty \else
- \showmessage\m!specials3\preloadedspecials
- \let\preloadedspecials\empty
- \fi}
+ \processcommacommand[\@@allspecials]\docommand}
%D \macros
%D {definespecial}
@@ -426,8 +410,7 @@
\makeshortfilename[\truefilename{\f!specialprefix\currentspecialfile}]%
\startreadingfile
\readsysfile\shortfilename{\showmessage\m!specials5\currentspecialfile}\donothing
- \stopreadingfile
- \showmessage\m!specials1\preloadedspecials}}
+ \stopreadingfile}}
\def\usespecials[#1]%
{\ifnum\realpageno<2
@@ -613,8 +596,7 @@
\let#1\gobbletenarguments \fi}
\def\resetspecials
- {\the\everyresetspecials
- \let\preloadedspecials\empty}
+ {\the\everyresetspecials}
\def\definespecial#1%
{\@EA\chardef\csname\@@speclst@@\string#1\endcsname=1
@@ -673,9 +655,25 @@
{\dousespecials{#1}}
{\showmessage\m!specials7{#1}}}}
+% Beware, from now on changing the (default) driver files demands
+% remaking the format (no big deal, since only i adapt the driver
+% and need delayed loading).
+
+\let\currentoutput\empty
+
\def\setupoutput[#1]%
- {\ifnum\realpageno<\plustwo % new
- \resetspecials\processcommacommand[#1]\dosetupoutput
- \fi}
+ {\doifnot{#1}{\currentoutput}
+ {\ifnum\realpageno<\plustwo % new
+ \resetspecials\processcommacommand[#1]\dosetupoutput
+ \edef\currentoutput{#1}%
+ \fi}}
+
+\def\preloadspecials % it's nicer to report this
+ {\doifsomething\currentoutput
+ {\showmessage\m!specials1\currentoutput}}
+
+\appendtoks
+ \savecurrentvalue\usedoutputdriver\currentoutput
+\to \everyfirstshipout
\protect \endinput
diff --git a/tex/context/base/spec-tpd.tex b/tex/context/base/spec-tpd.tex
index a12d4f862..49aabb3f6 100644
--- a/tex/context/base/spec-tpd.tex
+++ b/tex/context/base/spec-tpd.tex
@@ -186,8 +186,7 @@
\pdfoutput\zerocount
\to \everyresetspecials
-\pdfoutput =1 % we reset that one with \everyresetspecials
-\pdfcompresslevel=9 % apart from debugging, no reason for value 0
+\pdfoutput=1 % we reset that one with \everyresetspecials
%D Just in case we mimmick specials, we have to make sure no
%D default specials end up in the process.
@@ -1070,7 +1069,7 @@
/Border [0 0 0]
\ifhighlighthyperlinks \else /H /N \fi
/A \lastPDFaction}%
- \fi}
+ \fi}
% less #2 passing
@@ -1097,7 +1096,7 @@
/Border [0 0 0]
\ifhighlighthyperlinks \else /H /N \fi
/A \lastPDFaction}%
- \fi}
+ \fi}
\else
diff --git a/tex/context/base/supp-fun.tex b/tex/context/base/supp-fun.tex
index b3b270328..fdeb5bbe8 100644
--- a/tex/context/base/supp-fun.tex
+++ b/tex/context/base/supp-fun.tex
@@ -377,7 +377,7 @@
%D \definecolor[FunnyColor][r=\FunnyR,g=\FunnyG,b=\FunnyB]%
%D \color[FunnyColor]}
%D
-%D \TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}
+%D %\TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}
%D The third and fourth argument can be used to gain special
%D effects on the individual words. Of course one needs ...
%D \stopbuffer
@@ -560,7 +560,7 @@
\def\NormalizeFontSize#1#2#3#4#5%
{\bgroup
- \dimen0=#4% #4 can be \ht0 or so
+ \dimen0=#4% #4 can be \ht0 or so
\setbox0\hbox{\definedfont[#5 at 5pt]#3}% 10pt
\ifdim\wd0>\zeropoint
\dimen2=#10 % #1 is \wd or \ht
@@ -573,10 +573,13 @@
\else
\dimen0\bodyfontsize
\fi
- \definedfont[#5 at \the\dimen0]%
- \expandafter
- \egroup
- \expandafter\font\expandafter#2\fontname\font\relax}
+ % mkii
+ % \definedfont[#5 at \the\dimen0]%
+ % \expandafter
+ % \egroup
+ % \expandafter\font\expandafter#2\fontname\font\relax}
+ % mkiv safe (file: prefix etc)
+ \expanded{\egroup\def\noexpand#2{\definedfont[#5 at \the\dimen0]}}}
%D Afterwards, we have access to the calculated size by:
diff --git a/tex/context/base/supp-lan.tex b/tex/context/base/supp-lan.tex
index ec9176b50..87bf4c3fb 100644
--- a/tex/context/base/supp-lan.tex
+++ b/tex/context/base/supp-lan.tex
@@ -295,22 +295,6 @@
%D but I decided to reserve it for future use. At least it
%D remembers us of the symmetry.
-\beginTEX
-
-\def\installdiscretionaries#1#2#3%
- {\defconvertedargument\ascii{#1}%
- \setevalue{\strippedcsname\mathmodediscretionary\string#1}{\ascii}%
- \setvalue {\strippedcsname\textmodediscretionary\string#1}{#3}%
- \catcode`#1=\@@active
- \scratchcounter=\the\uccode`~
- \uccode`~=`#1
- \uppercase{\unexpanded\def~{\discretionarycommand~}}%
- \uccode`~=\scratchcounter}
-
-\endTEX
-
-\beginETEX \detokenize
-
\def\installdiscretionaries#1#2#3%
{\setevalue{\strippedcsname\mathmodediscretionary\string#1}{\detokenize{#1}}%
\setvalue {\strippedcsname\textmodediscretionary\string#1}{#3}%
@@ -320,8 +304,6 @@
\uppercase{\unexpanded\def~{\discretionarycommand~}}%
\uccode`~=\scratchcounter}
-\endETEX
-
\def\domathmodediscretionary#1%
{\getvalue{\strippedcsname\mathmodediscretionary\string#1}}
@@ -1110,38 +1092,6 @@
%D
%D In later modules we will see how these commands are used.
-\beginTEX
-
-\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\expandafter\ifx\csname\@cc@\string#1\string#2\endcsname\relax
- \def\next{\getvalue{\@nc@\string#1}#2}%
- \else
- \def\next{\getvalue{\@cc@\string#1\string#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\@EA\ifx\csname\@cs@\string#1\string#2\string#3\endcsname\relax
- \expandafter\ifx\csname\@cc@\string#1\string#2\endcsname\relax
- \def\next{\getvalue{\@nc@\string#1}#2#3}%
- \else
- \def\next{\getvalue{\@cc@\string#1\string#2}#3}%
- \fi
- \else
- \def\next{\getvalue{\@cs@\string#1\string#2\string#3}}%
- \fi\fi
- \next}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\long\def\handlecompoundcharacterone#1#2%
{\if\string#1\string#2% was: \ifx#1#2%
%\def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}}%
@@ -1166,27 +1116,12 @@
\fi\fi\fi
\next}
-\endETEX
-
%D For very obscure applications (see for an application \type
%D {lang-sla.tex}) we provide:
\def\dosimplifiedcompoundcharacter#1%
{#1}
-\beginTEX
-
-\def\simplifiedcompoundcharacter#1#2%
- {\@EA\ifx\csname\@cc@\string#1\string#2\endcsname\relax
- #2%
- \else
- \@EA\@EA\@EA\dosimplifiedcompoundcharacter\csname\@cc@\string#1\string#2\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\simplifiedcompoundcharacter#1#2%
{\ifcsname\@cc@\string#1\string#2\endcsname
\@EA\@EA\@EA\dosimplifiedcompoundcharacter\csname\@cc@\string#1\string#2\endcsname
@@ -1194,8 +1129,6 @@
#2%
\fi}
-\endETEX
-
%D \macros
%D {midworddiscretionary}
%D
diff --git a/tex/context/base/supp-mat.tex b/tex/context/base/supp-mat.tex
index 3c66566d3..3215a132b 100644
--- a/tex/context/base/supp-mat.tex
+++ b/tex/context/base/supp-mat.tex
@@ -193,7 +193,7 @@
%D {cramped}
%D
%D \TEX provides no primitive to force in cramped math mode. Here is
-%D a macro that does so. It is based on a solution by Don Knuth (\userul
+%D a macro that does so. It is based on a solution by Don Knuth (\useurl
%D {http://www.ctan.org/tex-archive/digests/tex-implementors/042}).
\def\cramped
diff --git a/tex/context/base/supp-mps.tex b/tex/context/base/supp-mps.tex
index 6b3cea88c..83deb4678 100644
--- a/tex/context/base/supp-mps.tex
+++ b/tex/context/base/supp-mps.tex
@@ -731,14 +731,6 @@
\def\writeMPgraph
{\immediate\write\MPwrite{mpgraph:=\the\currentMPgraphic;}}
-\beginTEX
-
-\ifx \honorunexpanded \undefined \else % not really needed
- \prependtoks \honorunexpanded \to \everyMPgraphic
-\fi
-
-\endTEX
-
\def\startwritingMPgraphic
{\blabelgroup
\global\advance\nofMPgraphics \plusone
@@ -861,10 +853,10 @@
%D \setupbodyfont[plr]
%D \stopMPenvironment
%D
-%D \TeX: ± ¶
+%D \TeX: ± ¶
%D
%D \startMPcode
-%D draw btex MetaPost: ± ¶ etex scaled 5 ;
+%D draw btex MetaPost: ± ¶ etex scaled 5 ;
%D \stopMPcode
%D \stoptyping
@@ -1128,7 +1120,7 @@
%D \stoptyping
\def\includeMPgraphic#1%
- {\executeifdefined{\@@MPG#1}}
+ {\executeifdefined{\@@MPG#1};} % ; if not found
\def\enableincludeMPgraphics
{\let\handleuseMPgraphic \secondoftwoarguments
@@ -1846,6 +1838,8 @@
\def\dodoMPdivtenE #1#2{#1.#2}
\def\dodoMPdivtenF #1{.#1}
+% if we assume etex ... \def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}
+
%D \macros
%D {startMPclip,grabMPclippath}
%D
diff --git a/tex/context/base/supp-pdf.tex b/tex/context/base/supp-pdf.tex
index 248b2ce92..95730939d 100644
--- a/tex/context/base/supp-pdf.tex
+++ b/tex/context/base/supp-pdf.tex
@@ -1511,97 +1511,6 @@
% \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
% \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
-%D We cannot use \type {\beginETEX} here since in plain we
-%D get \type {\outer} problems, sigh.
-
-%OLD \beginTEX
-%OLD
-%OLD \def\MPcriteriumA {512pt} % scale
-%OLD \def\MPcriteriumB {2pt} % scale
-%OLD
-%OLD \endTEX
-%OLD
-%OLD \ifx\MPcriteriumA\undefined
-%OLD
-%OLD \newdimen\MPcriteriumA \MPcriteriumA=512pt
-%OLD \newdimen\MPcriteriumB \MPcriteriumB= 2pt
-%OLD
-%OLD \fi
-
-%OLD \def\doMPconcat#1#2#3#4%
-%OLD {\dimen12=#1pt % p_x
-%OLD \dimen14=#3pt % p_y
-%OLD %
-%OLD \chardef\MPfactor0
-%OLD \ifdim\dimen4<\MPcriteriumB\ifdim\dimen4>-\MPcriteriumB
-%OLD \ifdim\dimen6<\MPcriteriumB\ifdim\dimen6>-\MPcriteriumB
-%OLD \ifdim\dimen8<\MPcriteriumB\ifdim\dimen8>-\MPcriteriumB
-%OLD \ifdim\dimen10<\MPcriteriumB\ifdim\dimen10>-\MPcriteriumB
-%OLD \chardef\MPfactor1
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \ifcase\MPfactor % spurious 0 removed
-%OLD \chardef\MPfactor1
-%OLD \ifdim\dimen12<\MPcriteriumA\ifdim\dimen12>-\MPcriteriumA
-%OLD \ifdim\dimen14<\MPcriteriumA\ifdim\dimen14>-\MPcriteriumA
-%OLD \chardef\MPfactor16
-%OLD \fi\fi
-%OLD \fi\fi
-%OLD \fi
-%OLD %
-%OLD \multiply\dimen12 \MPfactor
-%OLD \multiply\dimen14 \MPfactor
-%OLD %
-%OLD \doMPreducedimen12
-%OLD \doMPreducedimen14
-%OLD %
-%OLD \dimen16 \dimen 0
-%OLD \multiply \dimen16 \dimen 6
-%OLD \dimen20 \dimen 2
-%OLD \multiply \dimen20 \dimen 4
-%OLD \advance \dimen16 -\dimen20
-%OLD %
-%OLD \dimen18 \dimen12
-%OLD \multiply \dimen18 \dimen 6
-%OLD \dimen20 \dimen14
-%OLD \multiply \dimen20 \dimen 4
-%OLD \advance \dimen18 -\dimen20
-%OLD \dimen20 \dimen 4
-%OLD \multiply \dimen20 \dimen10
-%OLD \advance \dimen18 \dimen20
-%OLD \dimen20 \dimen 6
-%OLD \multiply \dimen20 \dimen 8
-%OLD \advance \dimen18 -\dimen20
-%OLD %
-%OLD \multiply \dimen12 -\dimen 2
-%OLD \multiply \dimen14 \dimen 0
-%OLD \advance \dimen12 \dimen14
-%OLD \dimen20 \dimen 2
-%OLD \multiply \dimen20 \dimen 8
-%OLD \advance \dimen12 \dimen20
-%OLD \dimen20 \dimen 0
-%OLD \multiply \dimen20 \dimen10
-%OLD \advance \dimen12 -\dimen20
-%OLD %
-%OLD \ifdim\dimen16=1pt \else
-%OLD \ifdim\dimen16>\MPconcatfactor 1pt \relax
-%OLD \doMPreducedimen16
-%OLD \divide \dimen18 \dimen16 \doMPexpanddimen18
-%OLD \divide \dimen12 \dimen16 \doMPexpanddimen12
-%OLD \else
-%OLD \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
-%OLD \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
-%OLD \fi
-%OLD \fi
-%OLD %
-%OLD \divide\dimen18 \MPfactor
-%OLD \divide\dimen12 \MPfactor
-%OLD %
-%OLD \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
-%OLD \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
-
%D DHL: Ideally, $r_x$, $r_y$, $s_x$, $s_y$ should be in macros, not
%D dimensions (they are scalar quantities after all, not lengths). I
%D suppose the authors decided to do calculations with integer
diff --git a/tex/context/base/supp-tpi.tex b/tex/context/base/supp-tpi.tex
index dc9d2e0e5..e4bc5cc72 100644
--- a/tex/context/base/supp-tpi.tex
+++ b/tex/context/base/supp-tpi.tex
@@ -322,7 +322,7 @@
\global\let\TPIClinetype\empty
\global\let\TPICgrayscale\empty}
-%D I have to admit that by using the \METAPOST\ B‚zier cubics
+%D I have to admit that by using the \METAPOST\ B‚zier cubics
%D routines these implementation does produce better curves
%D then most \DVI\ drivers do using the \TPIC\ prescribed
%D b-splines. Take for instance the sequence:
@@ -343,7 +343,7 @@
%D the path specials will be used for arbitraty curves. And for
%D b-splines to produce nice curves, one will often use many
%D points to get the desired results. Therefore, using the
-%D \METAPOST\ B‚zier curves will certainly produce similar and
+%D \METAPOST\ B‚zier curves will certainly produce similar and
%D even better graphics, except in those rare cases where one
%D uses delinberately the not that accurate features of
%D b-splines. Hereby the user is warned.
diff --git a/tex/context/base/syst-cat.mkiv b/tex/context/base/syst-cat.mkiv
index 46ee0f394..b387eb2ed 100644
--- a/tex/context/base/syst-cat.mkiv
+++ b/tex/context/base/syst-cat.mkiv
@@ -30,6 +30,8 @@
\ifx\xmlcatcodesn\undefined \newcatcodetable \xmlcatcodesn \fi % normal
\ifx\xmlcatcodese\undefined \newcatcodetable \xmlcatcodese \fi % entitle
\ifx\xmlcatcodesr\undefined \newcatcodetable \xmlcatcodesr \fi % reduce
+\ifx\typcatcodesa\undefined \newcatcodetable \typcatcodesa \fi % { }
+\ifx\typcatcodesb\undefined \newcatcodetable \typcatcodesb \fi % < >
\newtoks \setdefaultcatcodes
@@ -115,6 +117,8 @@
tex.xmlcatcodesn = \number\xmlcatcodesn ; % normal
tex.xmlcatcodese = \number\xmlcatcodese ; % entitle
tex.xmlcatcodesr = \number\xmlcatcodesr ; % reduce
+ tex.typcatcodesa = \number\typcatcodesa ; % { }
+ tex.typcatcodesb = \number\typcatcodesb ; % < >
\stopruntimectxluacode
\protect \endinput
diff --git a/tex/context/base/syst-cat.tex b/tex/context/base/syst-cat.tex
index 8994f207b..c7fe7142f 100644
--- a/tex/context/base/syst-cat.tex
+++ b/tex/context/base/syst-cat.tex
@@ -21,7 +21,8 @@
\newif \ifrecatcodeuppercharacters % only used in good old tex
-\newcount\cctdefcounter \cctdefcounter\plusone % 0 = signal
+% \newcount\cctdefcounter \cctdefcounter\plusone % 0 = signal
+\newcount\cctdefcounter \cctdefcounter\zerocount % 0 = signal, so advance before allocate
\newcount\cctcountera
\newcount\cctcounterb
@@ -123,6 +124,8 @@
\ifx\xmlcatcodesn\undefined \newcatcodetable \xmlcatcodesn \fi % normal
\ifx\xmlcatcodese\undefined \newcatcodetable \xmlcatcodese \fi % entitle
\ifx\xmlcatcodesr\undefined \newcatcodetable \xmlcatcodesr \fi % reduce
+\ifx\typcatcodesa\undefined \newcatcodetable \typcatcodesa \fi % { }
+\ifx\typcatcodesb\undefined \newcatcodetable \typcatcodesb \fi % < >
% was redefined in core-job anyway: \catcode`\^^L = 13 % ascii form-feed
@@ -142,6 +145,26 @@
\catcode`\^^Z = 12
\stopcatcodetable
+\startcatcodetable \typcatcodesa
+ \catcode`\^^I = 12
+ \catcode`\^^M = 12
+ \catcode`\^^L = 12
+ \catcode`\ = 12
+ \catcode`\^^Z = 12
+ \catcode`\{ = 1
+ \catcode`\} = 2
+\stopcatcodetable
+
+\startcatcodetable \typcatcodesb
+ \catcode`\^^I = 12
+ \catcode`\^^M = 12
+ \catcode`\^^L = 12
+ \catcode`\ = 12
+ \catcode`\^^Z = 12
+ \catcode`\< = 1
+ \catcode`\> = 2
+\stopcatcodetable
+
\startcatcodetable \texcatcodes
\catcode`\^^I = 10
\catcode`\^^M = 5
diff --git a/tex/context/base/syst-etx.tex b/tex/context/base/syst-etx.tex
index 13163a681..6ccfa25e0 100644
--- a/tex/context/base/syst-etx.tex
+++ b/tex/context/base/syst-etx.tex
@@ -274,8 +274,9 @@
%D A few bonus bindings.
-\let\normalprotected = \protected
-\let\normalunexpanded = \unexpanded
+\ifx\normalprotected \undefined \let\normalprotected \protected \fi
+\ifx\normalunexpanded\undefined \let\normalunexpanded\unexpanded \fi
+\ifx\normalexpanded \undefined \let\normalexpanded \expanded \fi
%D \macros
%D {begcsname}
diff --git a/tex/context/base/syst-ext.tex b/tex/context/base/syst-ext.tex
index 5929cac18..5d3afce3a 100644
--- a/tex/context/base/syst-ext.tex
+++ b/tex/context/base/syst-ext.tex
@@ -470,20 +470,20 @@
%D \starttyping
%D \newconditional\doublesided
%D \setfalse
-%D
+%D \stoptyping
%D Setting a conditional is done by \type{\settrue} and
%D \type{\setfalse}:
%D
%D \starttyping
%D \settrue\doublesided
%D \setfalse
-%D
+%D \stoptyping
%D while testing is accomplished by:
%D
%D \starttyping
%D \ifconditional\doublesided ... \else ... \fi
%D \setfalse
-%D
+%D \stoptyping
%D We cannot use the simple scheme:
%D
%D \starttyping
@@ -1072,7 +1072,7 @@
%D
%D \def\EveryLine%
%D {\afterassignment\doEveryLine\scratchtoks}
-%D
+%D \stoptyping
%D The real implementation is a bit more complicated but we
%D prefer something more versatile.
@@ -1778,7 +1778,7 @@
\long\def\HandleSimpleGroup#1#2% no inner group (so no kerning interference)
{\bgroup
- \long\def\BeforeGroup{\bgroup#1\aftergroup\AfterGroup}% interferes
+ %long\def\BeforeGroup{\bgroup#1\aftergroup\AfterGroup}% interferes
\long\def\BeforeGroup{\bgroup\aftergroup\AfterGroup#1}%
\long\def\AfterGroup {#2\egroup}%
\afterassignment\BeforeGroup
diff --git a/tex/context/base/syst-fnt.tex b/tex/context/base/syst-fnt.tex
index 40733c4f8..7ffc6464e 100644
--- a/tex/context/base/syst-fnt.tex
+++ b/tex/context/base/syst-fnt.tex
@@ -15,13 +15,13 @@
\unprotect
-\def\fontslantperpoint {\fontdimen1}
-\def\fontinterwordspace {\fontdimen2}
-\def\fontinterwordstretch{\fontdimen3}
-\def\fontinterwordshrink {\fontdimen4}
-\def\fontexheight {\fontdimen5}
-\def\fontemwidth {\fontdimen6}
-\def\fontextraspace {\fontdimen7}
+\def\fontslantperpoint {\fontdimen1 }
+\def\fontinterwordspace {\fontdimen2 }
+\def\fontinterwordstretch{\fontdimen3 }
+\def\fontinterwordshrink {\fontdimen4 }
+\def\fontexheight {\fontdimen5 }
+\def\fontemwidth {\fontdimen6 }
+\def\fontextraspace {\fontdimen7 }
\def\slantperpoint {\fontdimen1\font}
\def\interwordspace {\fontdimen2\font}
@@ -31,12 +31,12 @@
\def\emwidth {\fontdimen6\font}
\def\extraspace {\fontdimen7\font}
-\def\mathsupdisplay {\fontdimen13}
-\def\mathsupnormal {\fontdimen14}
-\def\mathsupcramped {\fontdimen15}
-\def\mathsubnormal {\fontdimen16}
-\def\mathsubcombined {\fontdimen17}
-\def\mathaxisheight {\fontdimen22}
+\def\mathsupdisplay {\fontdimen13 }
+\def\mathsupnormal {\fontdimen14 }
+\def\mathsupcramped {\fontdimen15 }
+\def\mathsubnormal {\fontdimen16 }
+\def\mathsubcombined {\fontdimen17 }
+\def\mathaxisheight {\fontdimen22 }
\def\currentspaceskip {\interwordspace\!!plus\interwordstretch\!!minus\interwordshrink\relax}
diff --git a/tex/context/base/syst-gen.tex b/tex/context/base/syst-gen.tex
index 361b14174..78311de38 100644
--- a/tex/context/base/syst-gen.tex
+++ b/tex/context/base/syst-gen.tex
@@ -2525,7 +2525,7 @@
%D \else
%D #3%
%D \fi}
-%D \starttyping
+%D \stoptyping
%D
%D And before we had \type{\p!doifinstringelse} available, we
%D used:
diff --git a/tex/context/base/syst-new.tex b/tex/context/base/syst-new.tex
index 15c35687b..92d1ea192 100644
--- a/tex/context/base/syst-new.tex
+++ b/tex/context/base/syst-new.tex
@@ -361,26 +361,26 @@
%D \adddimenmacro 10pt 5pt \paperwidth \to \bagger
%D \stoptyping
-\newdimen\dimentoaddto
-
-\def\adddimenregister#1\to#2% will be obsolete once full etex
- {\begingroup
- #2=\zeropoint
- \dimentoaddto\zeropoint
- \def\docommand%
- {\advance#2 \dimentoaddto
- \futurelet\next\dodocommand}%
- \def\dodocommand%
- {\ifx\next\relax
- \expanded{\endgroup#2=\the#2}%
- \else
- \@EA\afterassignment\@EA\docommand\@EA\dimentoaddto
- \fi}%
- \docommand#1\relax}
-
-\def\adddimenmacro#1\to#2%
- {\adddimenregister#1\to\scratchdimen
- \edef#2{\the\scratchdimen}}
+% \newdimen\dimentoaddto
+
+% \def\adddimenregister#1\to#2% will be obsolete once full etex
+% {\begingroup
+% #2=\zeropoint
+% \dimentoaddto\zeropoint
+% \def\docommand%
+% {\advance#2 \dimentoaddto
+% \futurelet\next\dodocommand}%
+% \def\dodocommand%
+% {\ifx\next\relax
+% \expanded{\endgroup#2=\the#2}%
+% \else
+% \@EA\afterassignment\@EA\docommand\@EA\dimentoaddto
+% \fi}%
+% \docommand#1\relax}
+
+% \def\adddimenmacro#1\to#2%
+% {\adddimenregister#1\to\scratchdimen
+% \edef#2{\the\scratchdimen}}
%D \macros
%D {freezedimenmacro}
@@ -391,8 +391,11 @@
%D \freezedimenmacro\leftmargindistance
%D \stoptyping
+% \def\freezedimenmacro#1%
+% {\scratchdimen#1\edef#1{\the\scratchdimen}}
+
\def\freezedimenmacro#1%
- {\scratchdimen#1\edef#1{\the\scratchdimen}}
+ {\edef#1{\the\dimexpr#1}}
%D The next one is slower:
%D
diff --git a/tex/context/base/syst-pdt.tex b/tex/context/base/syst-pdt.tex
index c8f2555f3..e241a9a2b 100644
--- a/tex/context/base/syst-pdt.tex
+++ b/tex/context/base/syst-pdt.tex
@@ -37,12 +37,12 @@
\bindprimitive ifabsdim ifpdfabsdim
\bindprimitive ifabsnum ifpdfabsnum
-\ifx\pdfobjcompresslevel\undefined \newcount\pdfobjcompresslevel \else \pdfobjcompresslevel=3 \fi
-\ifx\pdfgentounicode \undefined \newcount\pdfgentounicode \else \pdfgentounicode =1 \fi
+\def\nopdfcompression {\pdfobjcompresslevel 0 \pdfcompresslevel 0 }
+\def\maximumpdfcompression{\pdfobjcompresslevel 1 \pdfcompresslevel 9 }
+\def\normalpdfcompression {\pdfobjcompresslevel 1 \pdfcompresslevel 3 }
-\def\nopdfcompression % for myself
- {\pdfcompresslevel \zerocount
- \pdfobjcompresslevel\zerocount}
+\ifx\pdfobjcompresslevel\undefined \newcount\pdfobjcompresslevel \fi \normalpdfcompression
+\ifx\pdfgentounicode \undefined \newcount\pdfgentounicode \fi \pdfgentounicode=1
\let\normalquitvmode \quitvmode
\let\normalnoligatures\noligatures
diff --git a/tex/context/base/syst-tex.tex b/tex/context/base/syst-tex.tex
index 44549dab4..a8aea2683 100644
--- a/tex/context/base/syst-tex.tex
+++ b/tex/context/base/syst-tex.tex
@@ -213,8 +213,9 @@
%
% \endETEX
%
-% \let\normalprotected = \protected
-% \let\normalunexpanded = \unexpanded
+% \ifx\normalprotected \undefined \let\normalprotected \protected \fi
+% \ifx\normalunexpanded\undefined \let\normalunexpanded\unexpanded \fi
+% \ifx\normalexpanded \undefined \let\normalexpanded \expanded \fi
\beginETEX \savinghyphcodes
diff --git a/tex/context/base/type-gyr.tex b/tex/context/base/type-gyr.tex
index 80b391f77..ee21cc784 100644
--- a/tex/context/base/type-gyr.tex
+++ b/tex/context/base/type-gyr.tex
@@ -47,6 +47,7 @@
\definetypescriptprefix [n:bonum] [TeXGyreBonum]
\definetypescriptprefix [n:schola] [TeXGyreSchola]
\definetypescriptprefix [n:adventor][TeXGyreAdventor]
+\definetypescriptprefix [n:cursor] [TeXGyreCursor]
\definetypescriptprefix [f:pagella] [pl]
\definetypescriptprefix [f:termes] [tm]
@@ -54,8 +55,9 @@
\definetypescriptprefix [f:bonum] [bk]
\definetypescriptprefix [f:schola] [cs]
\definetypescriptprefix [f:adventor][ag]
+\definetypescriptprefix [f:cursor] [cr]
-\starttypescript [serif] [pagella,termes,heros,bonum,schola,adventor] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x]
+\starttypescript [serif,sans,mono] [pagella,termes,heros,bonum,schola,adventor,cursor] [ec,texnansi,cs,el,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]
diff --git a/tex/context/base/type-ini.tex b/tex/context/base/type-ini.tex
index d01b9c73b..17b1c2088 100644
--- a/tex/context/base/type-ini.tex
+++ b/tex/context/base/type-ini.tex
@@ -234,24 +234,11 @@
\def\dodefinetypescriptsynonym[#1][#2]%
{\ifsecondargument\setevalue{\??tm#1}{#2}\fi}
-\beginTEX
-
-\def\truetypescript#1%
- {\expandafter\ifx\csname\??tm#1\endcsname\relax
- #1\else\@EA\truetypescript\csname\??tm#1\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\truetypescript#1%
{\ifcsname\??tm#1\endcsname
\@EA\truetypescript\csname\??tm#1\endcsname\else#1%
\fi}
-\endETEX
-
% script [serif] [default] [size]
% script [serif] [computer-modern] [size]
% script [serif] [computer-modern] [ec]
@@ -421,10 +408,17 @@
\let\usedmapfile\gobbletwoarguments
\let\usedmapline\gobbletwoarguments
+\def\doregisterloadedmapfile#1%
+ {\immediatewriteutilitycommand{\usedmapfile{=}{#1}}}
+
+\beginLUATEX
+ \let\doregisterloadedmapfile\gobbleoneargument
+\endLUATEX
+
\def\doloadfontmapfile#1%
{\ifundefined{#1\c!state}%
\writestatus\m!fonts{using map file: #1}%
- \immediatewriteutilitycommand{\usedmapfile{=}{#1}}%
+ \doregisterloadedmapfile{#1}%
\doloadmapfile{=}{#1.\f!fontmapextension}% +/add =/replace -/remove
\setxvalue{#1\c!state}{1}%
\fi}
@@ -560,14 +554,15 @@
{\dododefinetypeface[#1][#2]%
\iffifthargument % sixth is optional
% we need to expand since in #6 there can be a \typescripttwo
- \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!text=,#6]}% \geteparameters
+ \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,\s!text=,#6]}% \geteparameters
\pushmacro\relativefontsize
\pushmacro\typefaceencoding
\pushmacro\fontclass
\let\relativefontsize\@@tsrscale
\let\typefaceencoding\@@tsencoding
\setcurrentfontclass{#1}%
- \letvalue{\fontclass\s!features}\@@tsfeatures % new per 16/6/2007
+ \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] / \typefaceencoding}\fi
@@ -582,6 +577,36 @@
\getparameters[\??tf#1#2][#3]%
\fi\fi\fi}
+% eventually we will split this module (no time now)
+
+% hm, math needs encoding
+
+% \beginLUATEX
+% \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
+% \expanded{\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,\t!special]%
+% \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}
+% \endLUATEX
+
\def\dododefinetypeface[#1][#2]% saveguard against redefinition
{\doifsomething{#1}
{\doifundefined{\??tf#1\s!default}{\setgvalue{\??tf#1\s!default}{#2}}%
diff --git a/tex/context/base/type-msw.tex b/tex/context/base/type-msw.tex
index 343e76eab..4757b5008 100644
--- a/tex/context/base/type-msw.tex
+++ b/tex/context/base/type-msw.tex
@@ -38,12 +38,12 @@
\definefontsynonym [SansBoldItalic] [Verdana-BoldItalic]
\stoptypescript
-\starttypescript [sans] [verdana] [texnansi]
+\starttypescript [sans] [verdana] [texnansi,ec,qx]
\definefontsynonym [Verdana] [\typescriptthree-verdana] [encoding=\typescriptthree]
\definefontsynonym [Verdana-Bold] [\typescriptthree-verdanab] [encoding=\typescriptthree]
\definefontsynonym [Verdana-Italic] [\typescriptthree-verdanai] [encoding=\typescriptthree]
\definefontsynonym [Verdana-BoldItalic] [\typescriptthree-verdanaz] [encoding=\typescriptthree]
- \loadmapfile[texnansi-microsoft-verdana.map]
+ \loadmapfile[\typescriptthree-microsoft-verdana.map]
\stoptypescript
% arial
@@ -56,12 +56,12 @@
\definefontsynonym [SansBoldItalic] [Arial-BoldItalicMT]
\stoptypescript
-\starttypescript [sans] [arial] [texnansi]
+\starttypescript [sans] [arial] [texnansi,ec,qx]
\definefontsynonym [ArialMT] [\typescriptthree-arial] [encoding=\typescriptthree]
\definefontsynonym [Arial-BoldMT] [\typescriptthree-arialbd] [encoding=\typescriptthree]
\definefontsynonym [Arial-ItalicMT] [\typescriptthree-ariali] [encoding=\typescriptthree]
\definefontsynonym [Arial-BoldItalicMT] [\typescriptthree-arialbi] [encoding=\typescriptthree]
- \loadmapfile[texnansi-microsoft-arial.map]
+ \loadmapfile[\typescriptthree-microsoft-arial.map]
\stoptypescript
\stoptypescriptcollection
diff --git a/tex/context/base/type-one.tex b/tex/context/base/type-one.tex
index 07acef72a..5ca09b30a 100644
--- a/tex/context/base/type-one.tex
+++ b/tex/context/base/type-one.tex
@@ -538,36 +538,36 @@
% \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]
+ \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 [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]
+ \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 [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]
+ \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)
diff --git a/tex/context/base/type-otf.tex b/tex/context/base/type-otf.tex
index 82f859df4..29dee2e74 100644
--- a/tex/context/base/type-otf.tex
+++ b/tex/context/base/type-otf.tex
@@ -296,7 +296,7 @@
\definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [f:cursor] [cursor]
\definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [f:chorus] [chorus] % not the full set
-\starttypescript [serif] [adventor,bonum,cursor,heros,pagella,schola,termes]
+\starttypescript [serif,sans,mono] [adventor,bonum,cursor,heros,pagella,schola,termes]
\definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [file:texgyre\typescriptprefix{f:\typescripttwo}-regular] [features=default]
\definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [file:texgyre\typescriptprefix{f:\typescripttwo}-italic] [features=default]
\definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [file:texgyre\typescriptprefix{f:\typescripttwo}-bold] [features=default]
@@ -353,7 +353,7 @@
\definefontsynonym [SansBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps]
\stoptypescript
-\starttypescript [sans] [cursor] [name]
+\starttypescript [mono] [cursor] [name]
\definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular]
\definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
\definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold]
diff --git a/tex/context/base/type-siz.tex b/tex/context/base/type-siz.tex
index 018f979bb..c5a8753ca 100644
--- a/tex/context/base/type-siz.tex
+++ b/tex/context/base/type-siz.tex
@@ -168,6 +168,9 @@
[mm] [default]
\stoptypescript
+% todo: instead of assuming designsize we will set it explicitly (saves these
+% -1000 problems at the lua end)
+
% cmr
\starttypescript [serif] [computer-modern] [size]
diff --git a/tex/context/base/unic-ini.mkii b/tex/context/base/unic-ini.mkii
index ac1851fb6..27ef38620 100644
--- a/tex/context/base/unic-ini.mkii
+++ b/tex/context/base/unic-ini.mkii
@@ -15,11 +15,6 @@
%D Sorry, we only support his in \ETEX.
-\beginTEX
- \def\useunicodevector[#1]{}
- \expandafter \endinput
-\endTEX
-
\unprotect
% ÀÃÂÃÄÅà áâãäå
@@ -687,62 +682,46 @@
% We have to compensate for etex's rounding (thanks to Taco and
% Nanning) for pointing/sorting this out:
+\chardef \utf@a= 64
+\mathchardef \utf@b= 4096
+\newcount\utf@c\utf@c=262144
+\chardef \utf@d= 192
+\chardef \utf@e= 224
+\chardef \utf@f= 240
+\chardef \utf@g= 128
+\mathchardef \utf@h= 256
+\chardef \utf@i= 127
+\mathchardef \utf@j= 2048
+\chardef \utf@k= 32
+
+% div: \numexp#1/#2\relax
+% mod: \numexp#1-(#1/#2)*#2\relax
+
% \def\numbertoutf#1%
-% {\ifnum#1<128
+% {\ifnum#1<\utf@g
% \rawcharacter{#1}%
% \else\ifnum#1<2048
-% \rawcharacter{\the\numexpr192+(#1-32)/64\relax}%
-% \rawcharacter{\the\numexpr128+(#1-((#1-32)/64)*64)\relax}%
+% \rawcharacter{\numexpr192+(#1/64)\relax}% 192 + (ud div 64)
+% \rawcharacter{\numexpr128+(#1-(#1/64)*64)\relax}% 128 + (ud mod 64)
+% \else\ifnum#1<2097152
+% \rawcharacter{\numexpr224+(#1-(#1/4096)\relax}% 224 + (ud div 4096)
+% \rawcharacter{\numexpr128+(#1-((#1/64)-((#1/64)/64)*64)\relax}% 128 + ((ud div 64) mod 64)
+% \rawcharacter{\numexpr128+(#1-(#1-(#1/64)*64)\relax}% 128 + (ud mod 64)
% \else
-% \rawcharacter{\the\numexpr224+(#1-2048)/4096\relax}%
-% \rawcharacter{\the\numexpr128+(#1-(((#1-2048)/4096)*4096)-32)/64\relax}%
-% \rawcharacter{\the\numexpr128+(#1-(((#1-2048)/4096)*4096)-((#1-(((#1-2048)/4096)*4096)-32)/64)*64)\relax}%
+% % todo
% \fi\fi}
-\beginETEX \numexpr
-
- \chardef \utf@a= 64
- \mathchardef \utf@b= 4096
- \newcount\utf@c\utf@c=262144
- \chardef \utf@d= 192
- \chardef \utf@e= 224
- \chardef \utf@f= 240
- \chardef \utf@g= 128
- \mathchardef \utf@h= 256
- \chardef \utf@i= 127
- \mathchardef \utf@j= 2048
- \chardef \utf@k= 32
-
- % div: \numexp#1/#2\relax
- % mod: \numexp#1-(#1/#2)*#2\relax
-
- % \def\numbertoutf#1%
- % {\ifnum#1<\utf@g
- % \rawcharacter{#1}%
- % \else\ifnum#1<2048
- % \rawcharacter{\numexpr192+(#1/64)\relax}% 192 + (ud div 64)
- % \rawcharacter{\numexpr128+(#1-(#1/64)*64)\relax}% 128 + (ud mod 64)
- % \else\ifnum#1<2097152
- % \rawcharacter{\numexpr224+(#1-(#1/4096)\relax}% 224 + (ud div 4096)
- % \rawcharacter{\numexpr128+(#1-((#1/64)-((#1/64)/64)*64)\relax}% 128 + ((ud div 64) mod 64)
- % \rawcharacter{\numexpr128+(#1-(#1-(#1/64)*64)\relax}% 128 + (ud mod 64)
- % \else
- % % todo
- % \fi\fi}
-
- \def\numbertoutf#1% okay?
- {\ifnum#1<\utf@g
- \rawcharacter{#1}%
- \else\ifnum#1<\utf@j
- \rawcharacter{\the\numexpr\utf@d+(#1-\utf@k)/\utf@a\relax}%
- \rawcharacter{\the\numexpr\utf@g+(#1-((#1-\utf@k)/\utf@a)*\utf@a)\relax}%
- \else
- \rawcharacter{\the\numexpr\utf@e+(#1-\utf@j)/\utf@b\relax}%
- \rawcharacter{\the\numexpr\utf@g+(#1-(((#1-\utf@j)/\utf@b)*\utf@b)-\utf@k)/\utf@a\relax}%
- \rawcharacter{\the\numexpr\utf@g+(#1-(((#1-\utf@j)/\utf@b)*\utf@b)-((#1-(((#1-\utf@j)/\utf@b)*\utf@b)-\utf@k)/\utf@a)*\utf@a)\relax}%
- \fi\fi}
-
-\endETEX
+\def\numbertoutf#1% okay?
+ {\ifnum#1<\utf@g
+ \rawcharacter{#1}%
+ \else\ifnum#1<\utf@j
+ \rawcharacter{\the\numexpr\utf@d+(#1-\utf@k)/\utf@a\relax}%
+ \rawcharacter{\the\numexpr\utf@g+(#1-((#1-\utf@k)/\utf@a)*\utf@a)\relax}%
+ \else
+ \rawcharacter{\the\numexpr\utf@e+(#1-\utf@j)/\utf@b\relax}%
+ \rawcharacter{\the\numexpr\utf@g+(#1-(((#1-\utf@j)/\utf@b)*\utf@b)-\utf@k)/\utf@a\relax}%
+ \rawcharacter{\the\numexpr\utf@g+(#1-(((#1-\utf@j)/\utf@b)*\utf@b)-((#1-(((#1-\utf@j)/\utf@b)*\utf@b)-\utf@k)/\utf@a)*\utf@a)\relax}%
+ \fi\fi}
\def\numbertohexstring#1{0x\uchexnumbers{\utfdiv{#1}}\uchexnumbers{\utfmod{#1}}}
@@ -750,10 +729,6 @@
\let\numbertoutf\numbertohexstring
\endXETEX
-\beginTEX
- \let\numbertoutf\numbertohexstring
-\endTEX
-
\def\uchartoutf#1#2%
{\expandafter\numbertoutf\expandafter{\the\numexpr#1*\utf@h+#2\relax}}
diff --git a/tex/context/base/verb-ini.tex b/tex/context/base/verb-ini.tex
index e30c9ecfe..27c30d20e 100644
--- a/tex/context/base/verb-ini.tex
+++ b/tex/context/base/verb-ini.tex
@@ -1127,11 +1127,6 @@
%
% \MPxy{word}
-\beginETEX \scantokens
-
-%\def\naturaltextext#1#2\relax
-% {\bgroup\prettynaturalfont{\restorecatcodes\scantokens{\ignorespaces#2}}\egroup}
-
\def\naturaltextext#1\relax
{\bgroup
\prettynaturalfont{\restorecatcodes\scantokens{\ignorespaces#1}}%
@@ -1145,15 +1140,6 @@
\prettynaturalfont{\scantokens\expandafter{\ascii}\ifhmode\unskip\fi}%
\egroup}
-\endETEX
-
-\beginTEX
-
-\def\naturaltextext
- {\disableprettynow}
-
-\endTEX
-
\installnewpretty N \naturaltextext
%D When seen in action this gives:
diff --git a/tex/context/base/verb-tex.tex b/tex/context/base/verb-tex.tex
index 29f4deea3..a70edd353 100644
--- a/tex/context/base/verb-tex.tex
+++ b/tex/context/base/verb-tex.tex
@@ -275,8 +275,6 @@
% {\disableprettyafterwards % only when enabled of course
% \ifnewpretty\expandafter\handlenewpretty\fi\TEXtypethree}
-\beginETEX \scantokens
-
\long\gdef\naturalTEXtext#1#2\relax% local alternative for \naturaltextext
{\convertargument#2\to\ascii
\doifinstringelse{\letterpercent}{\ascii}
@@ -285,8 +283,6 @@
{\long\def\next{\bgroup\prettynaturalfont{\restorecatcodes\scantokens{\ignorespaces#2}}\egroup}}%
\next}
-\endETEX
-
\gdef\TEXtypezero
{\ifnaturaltextext
\expandafter\naturalTEXtext
diff --git a/tex/context/base/x-cals.mkiv b/tex/context/base/x-cals.mkiv
index 9e601c5d0..daa9f2477 100644
--- a/tex/context/base/x-cals.mkiv
+++ b/tex/context/base/x-cals.mkiv
@@ -103,7 +103,12 @@ do
sum = sum + v
end
end
- local delta = sum - tex.hsize:todimen()
+-- local delta = sum - tex.hsize:todimen()
+local hsize = tex.hsize
+if type(hsize) == "string" then
+ hsize = hsize:todimen()
+end
+local delta = sum - hsize
if shrink_widths and delta > 0 then
adapt(shrink_widths,w,delta,sum,n,"shrink")
elseif stretch_widths and delta < 0 then
diff --git a/tex/context/base/x-mathml.lua b/tex/context/base/x-mathml.lua
index f13667c3d..0e279dfe8 100644
--- a/tex/context/base/x-mathml.lua
+++ b/tex/context/base/x-mathml.lua
@@ -31,6 +31,7 @@ local o_replacements = { -- in main table
["@r"] = "\\mmlrightdelimiter.",
["{"] = "\\mmlleftdelimiter\\lbrace",
["}"] = "\\mmlrightdelimiter\\rbrace",
+-- ["|"] = "\\mmlmiddledelimiter\\vert",
["("] = "\\mmlleftdelimiter(",
[")"] = "\\mmlrightdelimiter)",
["["] = "\\mmlleftdelimiter[",
diff --git a/tex/context/base/x-mathml.mkiv b/tex/context/base/x-mathml.mkiv
index ac0703c3b..e5f39975c 100644
--- a/tex/context/base/x-mathml.mkiv
+++ b/tex/context/base/x-mathml.mkiv
@@ -66,13 +66,27 @@
\startformula\MMLhack\xmlfirst{#1}{/mml:math}\stopformula
\stopxmlsetups
-\ifx\MMLleft \undefined \let\MMLleft \firstofoneargument \fi
-\ifx\MMLright\undefined \let\MMLright\firstofoneargument \fi
+\ifx\MMLleft \undefined \let\MMLleft \firstofoneargument \fi
+\ifx\MMLright \undefined \let\MMLright \firstofoneargument \fi
+\ifx\MMLmiddle\undefined \let\MMLmiddle\firstofoneargument \fi
\setfalse\mmlignoredelimiter
-\def\mmlleftdelimiter #1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{\MMLleft #1}\fi}
-\def\mmlrightdelimiter#1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{\MMLright#1}\fi}
+\def\mmlleftdelimiter #1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{\MMLleft #1}\fi}
+\def\mmlrightdelimiter #1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{\MMLright #1}\fi}
+\def\mmlmiddledelimiter#1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{\MMLmiddle#1}\fi}
+
+\def\mmlchar#1{\char#1 } % used in lua code
+
+% \newcount\delimiternesting \appendtoks \delimiternesting\zerocount \to \everymathematics
+
+% \def\mmlleftdelimiter #1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{%
+% \advance\delimiternesting\plusone \MMLleft #1}\fi}
+% \def\mmlrightdelimiter #1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{%
+% \advance\delimiternesting\plusone \MMLright#1}\fi}
+% \def\mmlmiddledelimiter#1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{%
+% \ifcase\delimiternesting\MMLleft\else\MMLmiddle\fi#1}\fi}
+
%D Remark: from now on this is a module and no longer an xtag
%D filter. There is an intermediate cleaner module but it has
@@ -1624,8 +1638,14 @@
% semantic mapping elements
+\setupMMLappearance[semantics][\c!state=\v!start]
+
\startxmlsetups mml:semantics
- \xmlfirst{#1}{/(mml:annotation\string|apply)}
+ \doifelse\MMLsemanticsstate\v!start {
+ \xmlall{#1}{/mml:annotation}
+ } {
+ \xmlall{#1}{/!mml:annotation}
+ }
\stopxmlsetups
\usemodule[x][calcmath]
@@ -1640,7 +1660,7 @@
\xmldoifelse {#1} {[oneof(@encoding,'calcmath','cm')]} {
\calcmath{\xmlflush{#1}}
} {
- % unsupported
+ \xmlall{#1}{../!mml:annotation}
}
}
\stopxmlsetups
@@ -1836,8 +1856,9 @@
\stopxmlsetups
\startxmlsetups mml:mfenced % {} around separator is needed for spacing
- \def\MMLleft {\left }% weird
- \def\MMLright{\right}
+ \def\MMLleft {\left }% weird
+ \def\MMLright {\right}
+ \def\MMLmiddle{\middle}
\ctxlua{lxml.mml.mfenced("#1","/*")}
\stopxmlsetups
@@ -2028,8 +2049,9 @@
% \ifcase\xmlcount{#1}{/mml:mo}\relax
% \xmlflush{#1}
% \else % no \let
-% \def\MMLleft {\left }
-% \def\MMLright{\right}
+% \def\MMLleft {\left }
+% \def\MMLright {\right}
+% \def\MMLmiddle{\middle}
% \enabledelimiter
% \checkdelimiters{\xmlall{#1}{/mml:mo}}
% \fakeleftdelimiter
@@ -2046,8 +2068,9 @@
\begingroup
\ifnum\xmlcount{#1}{/mml:mo}=\plustwo
\xmldoifelse {#1} {/mml:mo[position()==1 or position()==\xmlnofelements{#1}]} {% we need a {}
- \def\MMLleft {\left }
- \def\MMLright{\right}
+ \def\MMLleft {\left }
+ \def\MMLright {\right}
+ \def\MMLmiddle{\middle}
\enabledelimiter
\checkdelimiters{\xmlall{#1}{/mml:mo}}
\fakeleftdelimiter
@@ -2109,12 +2132,12 @@
\startxmlsetups mml:mover
% \mathop {
- \edef\mmlovertoken{\xmlraw{#1}{/mml:mo[position()==2]}}
+ \edef\mmlovertoken{\xmlraw{#1}{/mml:*[position()==2]}}
\doifelse{\utfmathclass\mmlovertoken}{accent} {
\edef\mmlovercommand{\utfmathcommand\mmlovertoken}
\mmlexecuteifdefined\mmlovercommand\mathematics{\mmlfirst{#1}}
} {
- \edef\mmlbasetoken{\xmlraw{#1}{/mml:mo[position()==1]}}
+ \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[position()==1]}}
\edef\mmlbasecommand{\utfmathfiller\mmlbasetoken}
\edef\mmlovercommand{\utfmathfiller\mmlovertoken}
\vbox {
@@ -2133,12 +2156,12 @@
\startxmlsetups mml:munder
% \mathop {
- \edef\mmlundertoken{\xmlraw{#1}{/mml:mo[position()==2]}}
+ \edef\mmlundertoken{\xmlraw{#1}{/mml:*[position()==2]}}
\doifelse{\utfmathclass\mmlundertoken}{accent} {
\edef\mmlundercommand{\utfmathcommand\mmlundertoken}
\mmlexecuteifdefined\mmlundercommand\mathematics{\mmlfirst{#1}}
} {
- \edef\mmlbasetoken {\xmlraw{#1}{/mml:mo[position()==1]}}
+ \edef\mmlbasetoken {\xmlraw{#1}{/mml:*[position()==1]}}
\edef\mmlbasecommand {\utfmathfiller\mmlbasetoken}
\edef\mmlundercommand{\utfmathfiller\mmlundertoken}
\vtop {
@@ -2156,7 +2179,7 @@
\stopxmlsetups
\startxmlsetups mml:munderover
- \edef\mmlbasetoken{\xmlraw{#1}{/mml:mo[position()==1]}}
+ \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[position()==1]}}
\edef\mmlbasecommand{\utfmathcommand\mmlbasetoken}
\mmlexecuteifdefined\mmlbasecommand{\mathematics{\mmlfirst{#1}}}_{\mmlsecond{#1}}^{\mmlthird{#1}}
\stopxmlsetups
diff --git a/tex/context/base/x-res-01.tex b/tex/context/base/x-res-01.tex
index 14dcbc570..dc14e7054 100644
--- a/tex/context/base/x-res-01.tex
+++ b/tex/context/base/x-res-01.tex
@@ -255,8 +255,8 @@
background=color,backgroundcolor=white,color=]
{\externalfigure
[\XMLflush{rl:file}]
- [maxheight=80pt,frame=off,maxwidth=130pt,factor=max]}%
-% [factor=max]}%
+ %[maxheight=80pt,frame=off,maxwidth=130pt,factor=max]}%
+ [factor=max]}%
[GridPg]%
\let\FigWid\figurenaturalwidth
\let\FigHei\figurenaturalheight
diff --git a/tex/context/base/x-set-01.tex b/tex/context/base/x-set-01.tex
index 65fd78865..75e1d43e2 100644
--- a/tex/context/base/x-set-01.tex
+++ b/tex/context/base/x-set-01.tex
@@ -12,6 +12,10 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D This file is obsolete.
+
+\endinput
+
\unprotect
\def\SETUPnamespace{xmlns:cd="http://www.pragma-ade.com/commands"}
diff --git a/tex/context/base/x-set-02.tex b/tex/context/base/x-set-02.tex
index 0582aadc5..da531f6cb 100644
--- a/tex/context/base/x-set-02.tex
+++ b/tex/context/base/x-set-02.tex
@@ -12,6 +12,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D This file is obsolete.
+
\unprotect \bgroup \catcode`\<=\@@other
\def\setinterfacecomponent#1#2#3%
diff --git a/tex/context/base/xtag-exp.tex b/tex/context/base/xtag-exp.tex
index 14c3c7a71..af49782d9 100644
--- a/tex/context/base/xtag-exp.tex
+++ b/tex/context/base/xtag-exp.tex
@@ -11,12 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\beginTEX
- \writestatus{XML}{sorry, XML is only supported in (pdf)etex}
- \def\startXMLdefinitions{\gobbleuntil\stopXMLdefinitions}
- \endinput
-\endTEX
-
\writestatus{loading}{Context XML Macros (expansion)}
\unprotect
diff --git a/tex/context/base/xtag-ext.tex b/tex/context/base/xtag-ext.tex
index 752007f5f..a0f43ff4e 100644
--- a/tex/context/base/xtag-ext.tex
+++ b/tex/context/base/xtag-ext.tex
@@ -11,11 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\beginTEX
- \writestatus{xml}{sorry, xml is only supported in (pdf)etex}
- \expandafter \endinput
-\endTEX
-
\writestatus{loading}{Context XML Macros (extras)}
\unprotect
diff --git a/tex/context/base/xtag-ini.tex b/tex/context/base/xtag-ini.tex
index 90b50dc06..ca1fa9a05 100644
--- a/tex/context/base/xtag-ini.tex
+++ b/tex/context/base/xtag-ini.tex
@@ -16,34 +16,20 @@
%D Beware: don't rely on \longempty things, since this may
%D change!
-% \newif\ifprocessingXML
-
-\beginTEX
- \writestatus{XML}{sorry, XML is only supported in (pdf)etex}
- \def\startXMLdefinitions{\gobbleuntil\stopXMLdefinitions}
- \endinput
-\endTEX
-
-% tzt nog eens child grabber maken; mooier in mathml
-
%D This module is highly optimized for speed, which sometimes
%D leads to rather unreadable code. Sorry for this.
-\beginETEX XML
+\bgroup \obeylines
- \bgroup \obeylines
+\gdef\startXMLdefinitions% keep %
+ {\bgroup\obeylines\dostartXMLdefinitions}
- \gdef\startXMLdefinitions% keep %
- {\bgroup\obeylines\dostartXMLdefinitions}
+\gdef\dostartXMLdefinitions #1
+ {\egroup\doifsomething{#1}{\writestatus{XML}{loading #1 support}}}
- \gdef\dostartXMLdefinitions #1
- {\egroup\doifsomething{#1}{\writestatus{XML}{loading #1 support}}}
+\global\let\stopXMLdefinitions\relax
- \global\let\stopXMLdefinitions\relax
-
- \egroup
-
-\endETEX
+\egroup
% todo: XMLfullsave == also attributes
% csnames
diff --git a/tex/context/base/xtag-map.tex b/tex/context/base/xtag-map.tex
index c071d0377..af6ca6112 100644
--- a/tex/context/base/xtag-map.tex
+++ b/tex/context/base/xtag-map.tex
@@ -16,10 +16,6 @@
%D We also need something that lets content as-is, like for
%D instance XML embedded in a chemical caption.
-\beginTEX
- \endinput
-\endTEX
-
\writestatus{loading}{Context XML Macros (remapping)}
%D A fundamental characteristic of \TEX\ is that much
diff --git a/tex/context/base/xtag-pre.tex b/tex/context/base/xtag-pre.tex
index 67e80ee78..173e7d298 100644
--- a/tex/context/base/xtag-pre.tex
+++ b/tex/context/base/xtag-pre.tex
@@ -11,10 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\beginTEX
- \endinput
-\endTEX
-
\writestatus{loading}{Context XML Macros (predefined)}
%D Here we predefine some escapes, processing instructions,
diff --git a/tex/context/base/xtag-stk.tex b/tex/context/base/xtag-stk.tex
index 193b47132..b5fcb7e9d 100644
--- a/tex/context/base/xtag-stk.tex
+++ b/tex/context/base/xtag-stk.tex
@@ -11,11 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\beginTEX
- \writestatus{XML}{sorry, XML is only supported in (pdf)etex}
- \endinput
-\endTEX
-
\writestatus{loading}{Context XML Macros (stacks)}
%D This module is experimental. Don't use it (yet). It needs a
diff --git a/tex/context/bib/bibl-apa.tex b/tex/context/bib/bibl-apa.tex
index 85fe51aba..c6085c3c3 100644
--- a/tex/context/bib/bibl-apa.tex
+++ b/tex/context/bib/bibl-apa.tex
@@ -199,7 +199,7 @@
\fi}%
{}%
\insertedition{ }{ edition}{}%
- \insertpublisher{. }{.}{.}%
+ \insertpublisher{ }{.}{.}%
\insertpages{ }{p. }{ }%
\insertnote{}{.}{}%
}
@@ -241,8 +241,8 @@
}%
\fi}%
{ }%
- \insertedition{ }{ edition}{}%
- \insertpublisher{. }{.}{.}%
+ \insertedition{ }{ edition.}{}%
+ \insertpublisher{ }{.}{.}%
\insertnote{ }{.}{}%
}
@@ -250,8 +250,8 @@
\insertauthors{}{ }{\insertthekey{}{. }{}}%
\insertpubyear{(}{). }{}%
\inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
- \insertedition{ }{ edition}{}%
- \insertpublisher{. }{.}{.}%
+ \insertedition{ }{ edition.}{}%
+ \insertpublisher{ }{.}{.}%
\insertpages{}{p. }{}%
\insertnote{ }{.}{}%
}
@@ -260,8 +260,8 @@
\insertauthors{}{ }{\insertthekey{}{. }{}}%
\insertpubyear{(}{). }{}%
\inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
- \insertedition{ }{ edition}{}%
- \insertorg{. }{.}{.}%
+ \insertedition{ }{ edition.}{}%
+ \insertorg{ }{.}{.}%
\insertpages{}{p. }{}%
\insertnote{ }{.}{}%
}
@@ -343,7 +343,7 @@
\insertpubyear{(}{). }{}%
\inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
\insertbibtype{}{, }{Master's thesis, }%
- \insertpublisher{. }{.}{.}%
+ \insertpublisher{ }{.}{.}%
\insertpages{ }{p. }{}%
\insertnote{ }{.}{}%
}
@@ -352,8 +352,8 @@
\insertauthors{}{ }{}%
\insertpubyear{(}{). }{}%
\inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
- \insertbibtype{}{, }{PhD thesis}%
- \insertpublisher{. }{.}{.}%
+ \insertbibtype{}{, }{PhD thesis,}%
+ \insertpublisher{ }{.}{.}%
\insertpages{ }{ p. }{}%
\insertnote{ }{.}{}%
}
@@ -362,7 +362,7 @@
\insertauthors{}{ }{\insertthekey{}{. }{}}%
\insertpubyear{(}{). }{}%
\inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
- \insertpublisher{. }{.}{.}%
+ \insertpublisher{ }{.}{.}%
\insertpages{ }{p. }{}%
\insertnote{ }{.}{}%
}
@@ -371,8 +371,8 @@
\insertauthors{}{ }{}%
\insertpubyear{(}{). }{}%
\inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
- \insertbibtype{}{\insertvolume{ }{, }{, }}{Technical Report, }%
- \insertpublisher{. }{.}{.}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Technical Report}%
+ \insertpublisher{ }{.}{.}%
\insertpages{ }{p. }{}%
\insertnote{ }{.}{}%
}
@@ -381,7 +381,7 @@
\insertauthors{}{ }{}%
\insertpubyear{(}{). }{}%
\inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
- \insertpublisher{. }{.}{.}%
+ \insertpublisher{ }{.}{.}%
\insertpages{ }{p. }{}%
\insertbibtype{(}{)}{}%
\insertnote{ }{.}{}%
diff --git a/tex/context/bib/t-bib.tex b/tex/context/bib/t-bib.tex
index 9088a8587..2cf79c3be 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=2008.04.17,
+%D version=2008.10.23,
%D title=\CONTEXT\ Publication Module,
%D subtitle=Publications,
%D author=Taco Hoekwater,
@@ -62,7 +62,7 @@
%D \item fix a bug in \type{\cite{- }} (17/5/2006)
%D \item support \type{\cite[authornum]} (18/5/2006)
%D \item make \type{\cite} unexpandable (20/6/2006)
-%D \item allow hyperlinks in author\&year combo's
+%D \item allow hyperlinks in author\&year combo's
%D (cite list compression has to be off) (20/6/2006)
%D \item fix duplicate labels for per-chapter style (20/6/2006)
%D \item allow \type{\setupcite[interaction=(start|stop)]}
@@ -70,7 +70,7 @@
%D \item make the default criterium for \type{\placepublications} be \type{previous} (23/6/2006)
%D \item fix \type{\normalauthor} and \type{\normalshortauthor} spacing (29/6/2006)
%D \item do not typeset empty arguments to \type{\typesetapublication} (29/6/2006)
-%D \item add \type{symbol=none} to \type{\setuplist} in unnumbered
+%D \item add \type{symbol=none} to \type{\setuplist} in unnumbered
%D mode to prevent typesetting of bare numbers (29/6/2006)
%D \item remove two incorrect spaces from bibl-num.tex (1/7/2006)
%D \item reset font styles within \type{\cite}, so that font switches
@@ -80,7 +80,7 @@
%D \item test \type{\iflocation} before deciding to use the
%D interactive version of cite (18/7/2006)
%D \item support \type{\setupcite[authoretallimit=1]} (18/7/2006)
-%D \item support use of \type{\cite} within titles and captions by
+%D \item support use of \type{\cite} within titles and captions by
%D saveguarding the list item extraction and reference placement
%D code (19/7/2006)
%D \item support \type{\setuppublicationlist[title=\chapter]} (4/8/2006)
@@ -88,15 +88,15 @@
%D \item hook added for repeated authors in publication list
%D \type{\setuppublicationlist[artauthorcommand=\mythreeargscommand]}
%D (4/8/2006)
-%D \item make the bracketed arguments of \type{\artauthor}, \type{\author}
+%D \item make the bracketed arguments of \type{\artauthor}, \type{\author}
%D and \type{\editor} (bbl commands) optional (4/8/2006)
%D \item the constants \type{sorttype}, \type{compress} and
%D \type{autohang} have moved to the core (8/8/2006)
%D \item bibtex is now registered as a program to be run by texexec (8/8/2006)
%D \item fix a bug in \type{\setupcite[authoretallimit=1]} (9/8/2006)
-%D \item fix a bug inside citations that prevented lastpubsep from ever being
+%D \item fix a bug inside citations that prevented lastpubsep from ever being
%D used due to a volatile \type{\commalistsize} (25/8/2006).
-%D \item added the possibility of \type{\placepublications[option=continue]}
+%D \item added the possibility of \type{\placepublications[option=continue]}
%D (6/9/2006)
%D \item Mojca translated Master's Thesis to Masterarbeit (bibl-apa-de.tex)
%D (12/9/2006)
@@ -113,6 +113,9 @@
%D that made the space before the {\it et al.} text disappear. (18/4/2007)
%D \item Attempt to fix percent signs in bbl files. As a side-effect,
%D this prohibits comments in \tex{startpublication} blocks! (17/4/2008)
+%D \item Patch from Matthias W\"achter that allows arbitrary .bst
+%D files to be used with \tex{setupbibtex} (25/9/2008)
+%D \item Extended for the new multilingual setups for the Oct 2008 current of ConTeXt (23/10/2008)
%D \stopitemize
%D
%D \subject{WISHLIST}
@@ -126,6 +129,14 @@
\unprotect
+%D start with a temp hack the file will still work with pre-Oct 20078
+%D versions of ConTeXt:
+
+
+\def\startinterface #1
+ {\doifnot{#1}{all}{\doifnotinset\currentinterface{#1}{\gobbleuntil\stopinterface}}}
+
+
%D A few new shortcuts:
\definesystemvariable {pv} % PublicationVariable
@@ -148,67 +159,97 @@
%D Some constants for the multi-lingual interface
-\startconstants dutch english
-
- database: database database
- artauthor: artauthor artauthor
- editor: editor editor
- authoretallimit: authoretallimit authoretallimit
- artauthoretallimit: artauthoretallimit artauthoretallimit
- editoretallimit: editoretallimit editoretallimit
- authoretaldisplay: authoretaldisplay authoretaldisplay
- artauthoretaldisplay: artauthoretaldisplay artauthoretaldisplay
- editoretaldisplay: editoretaldisplay editoretaldisplay
- authoretaltext: authoretaltext authoretaltext
- artauthoretaltext: artauthoretaltext artauthoretaltext
- editoretaltext: editoretaltext editoretaltext
- otherstext: otherstext otherstext
- andtext: andtext andtext
- totalnumber: totalnumber totalnumber
- firstnamesep: firstnamesep firstnamesep
- vonsep: vonsep vonsep
- juniorsep: juniorsep juniorsep
- surnamesep: surnamesep surnamesep
- lastnamesep: lastnamesep lastnamesep
- finalnamesep: finalnamesep finalnamesep
- namesep: namesep namesep
- pubsep: pubsep pubsep
- lastpubsep: lastpubsep lastpubsep
- refcommand: refcommand refcommand
- samplesize: samplesize samplesize
-
-\stopconstants
-
-\startvariables dutch english
- german czech
- italian romanian
- french
- title: titel title
- titel titul
- titolo titlu
- titre
- short: kort short
- kurz short
- short short
- short
- cite: cite cite
- cite cite
- cite cite
- cite
- bbl: bbl bbl
- bbl bbl
- bbl bbl
- bbl
- bib: bib bib
- bib bib
- bib bib
- bib
- author: auteur author
- autor autor
- autore autor
- auteur
-
-\stopvariables
+\startinterface all
+ \setinterfaceconstant {database} {database}
+ \setinterfaceconstant {artauthor} {artauthor}
+ \setinterfaceconstant {editor} {editor}
+ \setinterfaceconstant {authoretallimit} {authoretallimit}
+ \setinterfaceconstant {artauthoretallimit} {artauthoretallimit}
+ \setinterfaceconstant {editoretallimit} {editoretallimit}
+ \setinterfaceconstant {authoretaldisplay} {authoretaldisplay}
+ \setinterfaceconstant {artauthoretaldisplay} {artauthoretaldisplay}
+ \setinterfaceconstant {editoretaldisplay} {editoretaldisplay}
+ \setinterfaceconstant {authoretaltext} {authoretaltext}
+ \setinterfaceconstant {artauthoretaltext} {artauthoretaltext}
+ \setinterfaceconstant {editoretaltext} {editoretaltext}
+ \setinterfaceconstant {otherstext} {otherstext}
+ \setinterfaceconstant {andtext} {andtext}
+ \setinterfaceconstant {totalnumber} {totalnumber}
+ \setinterfaceconstant {firstnamesep} {firstnamesep}
+ \setinterfaceconstant {vonsep} {vonsep}
+ \setinterfaceconstant {juniorsep} {juniorsep}
+ \setinterfaceconstant {surnamesep} {surnamesep}
+ \setinterfaceconstant {lastnamesep} {lastnamesep}
+ \setinterfaceconstant {finalnamesep} {finalnamesep}
+ \setinterfaceconstant {namesep} {namesep}
+ \setinterfaceconstant {pubsep} {pubsep}
+ \setinterfaceconstant {lastpubsep} {lastpubsep}
+ \setinterfaceconstant {refcommand} {refcommand}
+ \setinterfaceconstant {samplesize} {samplesize}
+\stopinterface
+
+\startinterface dutch
+ \setinterfacevariable {title} {titel}
+ \setinterfacevariable {short} {kort}
+ \setinterfacevariable {cite} {cite}
+ \setinterfacevariable {bbl} {bbl}
+ \setinterfacevariable {bib} {bib}
+ \setinterfacevariable {author} {auteur}
+\stopinterface
+
+\startinterface english
+ \setinterfacevariable {title} {title}
+ \setinterfacevariable {short} {short}
+ \setinterfacevariable {cite} {cite}
+ \setinterfacevariable {bbl} {bbl}
+ \setinterfacevariable {bib} {bib}
+ \setinterfacevariable {author} {author}
+\stopinterface
+
+\startinterface german
+ \setinterfacevariable {title} {titel}
+ \setinterfacevariable {short} {kurz}
+ \setinterfacevariable {cite} {cite}
+ \setinterfacevariable {bbl} {bbl}
+ \setinterfacevariable {bib} {bib}
+ \setinterfacevariable {author} {autor}
+\stopinterface
+
+\startinterface czech
+ \setinterfacevariable {title} {titul}
+ \setinterfacevariable {short} {short}
+ \setinterfacevariable {cite} {cite}
+ \setinterfacevariable {bbl} {bbl}
+ \setinterfacevariable {bib} {bib}
+ \setinterfacevariable {author} {autor}
+\stopinterface
+
+\startinterface italian
+ \setinterfacevariable {title} {titolo}
+ \setinterfacevariable {short} {short}
+ \setinterfacevariable {cite} {cite}
+ \setinterfacevariable {bbl} {bbl}
+ \setinterfacevariable {bib} {bib}
+ \setinterfacevariable {author} {autore}
+\stopinterface
+
+\startinterface romanian
+ \setinterfacevariable {title} {titlu}
+ \setinterfacevariable {short} {short}
+ \setinterfacevariable {cite} {cite}
+ \setinterfacevariable {bbl} {bbl}
+ \setinterfacevariable {bib} {bib}
+ \setinterfacevariable {author} {autor}
+\stopinterface
+
+\startinterface french
+ \setinterfacevariable {title} {titre}
+ \setinterfacevariable {short} {short}
+ \setinterfacevariable {cite} {cite}
+ \setinterfacevariable {bbl} {bbl}
+ \setinterfacevariable {bib} {bib}
+ \setinterfacevariable {author} {auteur}
+\stopinterface
\def\biblistname{pubs} % for compatibility
@@ -217,7 +258,6 @@
\let\preloadbiblist\relax
-
\ifx\currentcomponent\v!text
% single file
\edef\temp{\the\everystarttext}%
@@ -300,15 +340,14 @@
\def\dosetupbibtex[#1]%
{\let\@@pbdatabase\empty
- \let\@@pbsort \empty
- \getparameters[\??pb][#1]%
+ \getparameters[\??pb][sort=\s!default,#1]%
\expanded{\processaction[\@@pbsort]}
[ \v!no=>\def\bibstyle{cont-no},
\v!author=>\def\bibstyle{cont-au},
\v!title=>\def\bibstyle{cont-ti},
\v!short=>\def\bibstyle{cont-ab},
\s!default=>\def\bibstyle{cont-no},
- \s!unknown=>\def\bibstyle{cont-no}]%
+ \s!unknown=>\def\bibstyle{\@@pbsort}]%
\ifx\@@pbdatabase\empty\else \writeauxfile \fi}
\dosetupbibtex[bibtex=bibtex]
@@ -578,11 +617,11 @@
\def\dododocomplexbibdef[#1]#2#3%
{\@EA\increment\csname \currentype @num\endcsname
\setevalue{\??pb @\currentype\csname \currentype @num\endcsname}%
- {{\secondarg}{#2}{#3}{#1}{\firstarg}}\ignorespaces}%
+ {{\secondarg}{#2}{#3}{#1}{\firstarg}}\ignorespaces}%
\def\complexbibdef#1%
{\@EA\newcounter\csname #1@num\endcsname
- \@EA\def\csname bib@#1\endcsname{\docomplexbibdef{#1}}%
+ \@EA\def\csname bib@#1\endcsname{\docomplexbibdef{#1}}%
\@EA\def\csname insert#1s\endcsname##1##2##3%
{\specialbibinsert{#1}{\csname #1@num\endcsname}{##1}{\unskip ##2}{##3}}}
@@ -658,7 +697,7 @@
\else \bibalternative\c!lastnamesep \fi
\else
\bibalternative\c!namesep
- \fi \fi
+ \fi \fi
\fi}%
\processcommacommand[#3]\processauthoritem }
@@ -745,7 +784,7 @@
\catcode`\%=12
\dosingleempty\dostartpublication}
-\def\stoppublication
+\def\stoppublication
{} % the \catcode of % is reset below
%D Only specifying the key in the argument is also
@@ -778,7 +817,7 @@
\setxvalue{pbdu-\@@pbk}{\@@pbu}
\setxvalue{pbdd-\@@pbk}{\the\toks0}
\xdef\allrefs{\allrefs,\@@pbk}%
- \egroup
+ \egroup
\catcode`\%=\bibmodsavedpercent\relax }
% intialization of the order-list:
@@ -892,9 +931,9 @@
{\exitloop}}%
\let\localpublist\glocalpublist}
-%
+%
\def\typesetpubslist
- {\dobeginoflist
+ {\dobeginoflist
\edef\askedlevel{\csname \??li pubs\c!criterium\endcsname}%
\ifx\askedlevel\v!all
\def\bibrefprefix{}%
@@ -902,7 +941,7 @@
\preparebibrefprefix
\fi
\ifsortbycite
- \filllocalpublist
+ \filllocalpublist
\iftypesetall
\let\localallrefs\allrefs
\processcommacommand[\localpublist]\typesetapublication
@@ -917,11 +956,11 @@
\iftypesetall
\processcommacommand[\allrefs]\typesetapublication
\else
- %
+ %
\filllocalpublist
\processcommacommand[\allrefs]\maybetypesetapublication
\fi
- \fi
+ \fi
\doendoflist }
\newif\ifinpublist
@@ -997,14 +1036,27 @@
\def\completepublications
{\dosingleempty\docompletepublications}
+\def\bibdogetupsometextprefix#1#2#3%
+ {\ifcsname#2#1#3\endcsname
+ \csname#2#1#3\endcsname
+ \else\@EA\ifx\csname\??la#1\c!default\endcsname\empty
+ \ifcsname#2#3\endcsname
+ \csname#2#3\endcsname
+ \else\ifcsname#2\s!en#3\endcsname
+ \csname#2\s!en#3\endcsname
+ \else
+ \reporttextprefixerror{#1}{#2}{#3}%
+ \fi\fi
+ \else
+ \bibdogetupsometextprefix{\csname\??la#1\c!default\endcsname}{#2}{#3}%
+ \fi\fi}
+
\def\docompletepublications[#1]%
- {%\getparameters[\??pv data][#1]%
- \begingroup
- \setuplist[pubs][\c!criterium=\v!previous,#1]
+ {\begingroup
+ \setuplist[pubs][\c!criterium=\v!previous,#1]
\begingroup
- \loggingall
\let\handletextprefix\firstoftwoarguments
- \edef\headtextpubs{\dogetupsometextprefix\headlanguage\c!title{pubs}}%
+ \edef\headtextpubs{\bibdogetupsometextprefix\headlanguage\c!title{pubs}}%
\doifdefinedelse
{\??pv data\v!title}
{\doifemptyelsevalue
@@ -1035,7 +1087,7 @@
{\global\let\bibcounter\!!zerocount }%
\inpublisttrue
\typesetpubslist
- \inpublistfalse
+ \inpublistfalse
\endgroup }
@@ -1043,8 +1095,8 @@
%D
\unexpanded\def\typesetapublication#1%
- {\doifsomething{#1}{\doglobal\increment\bibcounter
- \bgroup
+ {\doifsomething{#1}{\doglobal\increment\bibcounter
+ \bgroup
\makepbkvalue{#1}%
\ifgridsnapping
\snaptogrid\vbox{\dodolistelement{pubs}{}{\bibcounter}%
@@ -1117,7 +1169,7 @@
{\begingroup
\setupinteraction[\c!style=]%
\edef\temp{#2}%
- \ifx\empty\temp \secondargumentfalse
+ \ifx\empty\temp \secondargumentfalse
\else \secondargumenttrue \fi
\ifsecondargument
\processcommalist[#2]\docitation
@@ -1207,7 +1259,7 @@
\newcounter\citationnumber
\def\docitation#1{%
- \iftrialtypesetting \else
+ \iftrialtypesetting \else
\ifdoinpututilities\else
\doglobal\increment\citationnumber
\expanded{\rawreference{}{cite-\jobname-\citationnumber}{#1}}%
@@ -1450,7 +1502,7 @@
%D \macros{preparebibrefprefix}
%D
%D The reference list only writes bare references when the criterium
-%D is `all'. Otherwise, a prefix is added to make sure that pdfTeX
+%D is `all'. Otherwise, a prefix is added to make sure that pdfTeX
%D does not encounter duplicate named references. On the generation
%D side, this is not a big problem. \type{\preparebibrefprefix}
%D creates a suitable string to prepend if a prefix is needed.
@@ -1473,9 +1525,9 @@
%D \macros{preparebibreflist}
%D
-%D But this optional prefixing is a bit of a problem on the
+%D But this optional prefixing is a bit of a problem on the
%D other side. We would like to do \type{\goto{}[article-full]}
-%D but can't do it like that, because the actual label may be
+%D but can't do it like that, because the actual label may be
%D \type{1:2:0:3:4:article-full]} or so. The problem is solved
%D by building a commalist that looks like this:
%D \starttyping
@@ -1491,7 +1543,7 @@
\def\preparebibreflist#1%
{\let\bibreflist\empty
\def\storeitem##1%
- {\ifx\bibreflist\empty
+ {\ifx\bibreflist\empty
\edef\prefix{##1\sectionseparator}%
\edef\bibreflist{\prefix#1,#1}%
\else
@@ -1499,7 +1551,7 @@
\edef\bibreflist{\prefix#1,\bibreflist}%
\fi}%
\expanded{\processseparatedlist[\bibrefprefix][\sectionseparator]}\storeitem }
-
+
%D \macros{gotobiblink,inbiblink,atbiblink}
%D
%D The final task is looping over that list until a match is found.
@@ -1589,7 +1641,7 @@
{\bibalternative\v!left
\ixbibauthoryear{#1}
{\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
- {\bibalternative\c!pubsep
+ {\bibalternative\c!pubsep
\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
{\bibalternative\c!lastpubsep
\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}%
@@ -1737,7 +1789,7 @@
{\ifbibreffound\else
\doifreferencefoundelse
{##1}
- {\global\bibreffoundtrue
+ {\global\bibreffoundtrue
\@EA\doglobal\@EA\addtocommalist\@EA{\reftypet}\therefs }%
{}\fi}%
\processcommacommand[\bibreflist]\setuplink
diff --git a/tex/context/interface/cont-cs.xml b/tex/context/interface/cont-cs.xml
index 212cc0ac1..a0095af10 100644
--- a/tex/context/interface/cont-cs.xml
+++ b/tex/context/interface/cont-cs.xml
@@ -291,7 +291,7 @@
-
+
@@ -313,12 +313,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -331,8 +349,8 @@
-
-
+
+
@@ -359,13 +377,13 @@
-
-
+
+
-
+
@@ -389,6 +407,9 @@
+
+
+
@@ -407,10 +428,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -453,7 +512,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -469,6 +544,9 @@
+
+
+
@@ -4018,7 +4096,8 @@
-
+
+
@@ -5106,7 +5185,7 @@
-
+
@@ -5121,7 +5200,7 @@
-
+
@@ -5986,7 +6065,7 @@
-
+
@@ -6407,7 +6486,7 @@
-
+
@@ -6445,7 +6524,7 @@
-
+
@@ -6459,7 +6538,7 @@
-
+
@@ -6471,7 +6550,7 @@
-
+
@@ -6581,7 +6660,7 @@
-
+
@@ -6669,7 +6748,7 @@
-
+
@@ -6690,7 +6769,7 @@
-
+
@@ -6782,7 +6861,7 @@
-
+
@@ -6940,7 +7019,7 @@
-
+
@@ -7432,7 +7511,7 @@
-
+
@@ -7485,7 +7564,7 @@
-
+
@@ -9907,4 +9986,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/cont-cz.xml b/tex/context/interface/cont-cz.xml
index 5fdde65e5..d1b2de2ee 100644
--- a/tex/context/interface/cont-cz.xml
+++ b/tex/context/interface/cont-cz.xml
@@ -1,6 +1,4 @@
-
-
-
-
-
+
@@ -25,18 +22,18 @@
-
+
-
+
-
+
-
+
@@ -52,14 +49,14 @@
-
+
-
+
-
+
-
+
@@ -68,9 +65,9 @@
-
+
-
+
@@ -79,9961 +76,9958 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tex/context/interface/cont-de.xml b/tex/context/interface/cont-de.xml
index 8e8f35c69..6f3927090 100644
--- a/tex/context/interface/cont-de.xml
+++ b/tex/context/interface/cont-de.xml
@@ -291,7 +291,7 @@
-
+
@@ -313,12 +313,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -331,8 +349,8 @@
-
-
+
+
@@ -359,13 +377,13 @@
-
-
+
+
-
+
@@ -389,6 +407,9 @@
+
+
+
@@ -407,10 +428,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -453,7 +512,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -469,6 +544,9 @@
+
+
+
@@ -4018,7 +4096,8 @@
-
+
+
@@ -5106,7 +5185,7 @@
-
+
@@ -5121,7 +5200,7 @@
-
+
@@ -5986,7 +6065,7 @@
-
+
@@ -6407,7 +6486,7 @@
-
+
@@ -6445,7 +6524,7 @@
-
+
@@ -6459,7 +6538,7 @@
-
+
@@ -6471,7 +6550,7 @@
-
+
@@ -6581,7 +6660,7 @@
-
+
@@ -6669,7 +6748,7 @@
-
+
@@ -6690,7 +6769,7 @@
-
+
@@ -6782,7 +6861,7 @@
-
+
@@ -6940,7 +7019,7 @@
-
+
@@ -7432,7 +7511,7 @@
-
+
@@ -7485,7 +7564,7 @@
-
+
@@ -9907,4 +9986,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/cont-en.xml b/tex/context/interface/cont-en.xml
index f5f30226d..d4c9283d9 100644
--- a/tex/context/interface/cont-en.xml
+++ b/tex/context/interface/cont-en.xml
@@ -291,7 +291,7 @@
-
+
@@ -313,12 +313,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -331,8 +349,8 @@
-
-
+
+
@@ -359,13 +377,13 @@
-
-
+
+
-
+
@@ -389,6 +407,9 @@
+
+
+
@@ -407,10 +428,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -453,7 +512,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -469,6 +544,9 @@
+
+
+
@@ -4018,7 +4096,8 @@
-
+
+
@@ -9907,4 +9986,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/cont-fr.xml b/tex/context/interface/cont-fr.xml
index 4492a443c..291574bff 100644
--- a/tex/context/interface/cont-fr.xml
+++ b/tex/context/interface/cont-fr.xml
@@ -291,7 +291,7 @@
-
+
@@ -313,12 +313,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -331,8 +349,8 @@
-
-
+
+
@@ -359,13 +377,13 @@
-
-
+
+
-
+
@@ -389,6 +407,9 @@
+
+
+
@@ -407,10 +428,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -453,7 +512,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -469,6 +544,9 @@
+
+
+
@@ -4018,7 +4096,8 @@
-
+
+
@@ -5986,7 +6065,7 @@
-
+
@@ -6379,7 +6458,7 @@
-
+
@@ -6407,7 +6486,7 @@
-
+
@@ -6445,7 +6524,7 @@
-
+
@@ -6581,7 +6660,7 @@
-
+
@@ -6669,7 +6748,7 @@
-
+
@@ -7485,7 +7564,7 @@
-
+
@@ -7572,7 +7651,7 @@
-
+
@@ -9907,4 +9986,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/cont-it.xml b/tex/context/interface/cont-it.xml
index 57590ac49..c59511b61 100644
--- a/tex/context/interface/cont-it.xml
+++ b/tex/context/interface/cont-it.xml
@@ -291,7 +291,7 @@
-
+
@@ -313,12 +313,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -331,8 +349,8 @@
-
-
+
+
@@ -359,13 +377,13 @@
-
-
+
+
-
+
@@ -389,6 +407,9 @@
+
+
+
@@ -407,10 +428,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -453,7 +512,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -469,6 +544,9 @@
+
+
+
@@ -4018,7 +4096,8 @@
-
+
+
@@ -5106,7 +5185,7 @@
-
+
@@ -5121,7 +5200,7 @@
-
+
@@ -5986,7 +6065,7 @@
-
+
@@ -6379,7 +6458,7 @@
-
+
@@ -6407,7 +6486,7 @@
-
+
@@ -6445,7 +6524,7 @@
-
+
@@ -6459,7 +6538,7 @@
-
+
@@ -6471,7 +6550,7 @@
-
+
@@ -6581,7 +6660,7 @@
-
+
@@ -6669,7 +6748,7 @@
-
+
@@ -6940,7 +7019,7 @@
-
+
@@ -7432,7 +7511,7 @@
-
+
@@ -7485,7 +7564,7 @@
-
+
@@ -7572,7 +7651,7 @@
-
+
@@ -9907,4 +9986,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/cont-nl.xml b/tex/context/interface/cont-nl.xml
index 27116ea99..9daaadbd5 100644
--- a/tex/context/interface/cont-nl.xml
+++ b/tex/context/interface/cont-nl.xml
@@ -291,7 +291,7 @@
-
+
@@ -313,12 +313,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -331,8 +349,8 @@
-
-
+
+
@@ -359,13 +377,13 @@
-
-
+
+
-
+
@@ -389,6 +407,9 @@
+
+
+
@@ -407,10 +428,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -453,7 +512,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -469,6 +544,9 @@
+
+
+
@@ -4018,7 +4096,8 @@
-
+
+
@@ -5106,7 +5185,7 @@
-
+
@@ -5121,7 +5200,7 @@
-
+
@@ -5986,7 +6065,7 @@
-
+
@@ -6407,7 +6486,7 @@
-
+
@@ -6445,7 +6524,7 @@
-
+
@@ -6459,7 +6538,7 @@
-
+
@@ -6471,7 +6550,7 @@
-
+
@@ -6581,7 +6660,7 @@
-
+
@@ -6669,7 +6748,7 @@
-
+
@@ -6690,7 +6769,7 @@
-
+
@@ -6782,7 +6861,7 @@
-
+
@@ -6940,7 +7019,7 @@
-
+
@@ -7432,7 +7511,7 @@
-
+
@@ -7485,7 +7564,7 @@
-
+
@@ -7572,7 +7651,7 @@
-
+
@@ -9907,4 +9986,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/cont-pe.xml b/tex/context/interface/cont-pe.xml
new file mode 100644
index 000000000..4dcda95ed
--- /dev/null
+++ b/tex/context/interface/cont-pe.xml
@@ -0,0 +1,10222 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/cont-ro.xml b/tex/context/interface/cont-ro.xml
index 47bc89d29..67d25d6f7 100644
--- a/tex/context/interface/cont-ro.xml
+++ b/tex/context/interface/cont-ro.xml
@@ -291,7 +291,7 @@
-
+
@@ -313,12 +313,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -331,8 +349,8 @@
-
-
+
+
@@ -359,13 +377,13 @@
-
-
+
+
-
+
@@ -389,6 +407,9 @@
+
+
+
@@ -407,10 +428,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -453,7 +512,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -469,6 +544,9 @@
+
+
+
@@ -4018,7 +4096,8 @@
-
+
+
@@ -5106,7 +5185,7 @@
-
+
@@ -5121,7 +5200,7 @@
-
+
@@ -5986,7 +6065,7 @@
-
+
@@ -6407,7 +6486,7 @@
-
+
@@ -6445,7 +6524,7 @@
-
+
@@ -6459,7 +6538,7 @@
-
+
@@ -6471,7 +6550,7 @@
-
+
@@ -6581,7 +6660,7 @@
-
+
@@ -6669,7 +6748,7 @@
-
+
@@ -7432,7 +7511,7 @@
-
+
@@ -7485,7 +7564,7 @@
-
+
@@ -9907,4 +9986,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tex/context/interface/keys-cs.xml b/tex/context/interface/keys-cs.xml
index a43193291..25200070e 100644
--- a/tex/context/interface/keys-cs.xml
+++ b/tex/context/interface/keys-cs.xml
@@ -1,1663 +1,1589 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-cz.xml b/tex/context/interface/keys-cz.xml
index 98be99b81..ef47e5f3f 100644
--- a/tex/context/interface/keys-cz.xml
+++ b/tex/context/interface/keys-cz.xml
@@ -1,1661 +1,1590 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml
index 431774663..44945cd74 100644
--- a/tex/context/interface/keys-de.xml
+++ b/tex/context/interface/keys-de.xml
@@ -1,1663 +1,1589 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml
index e07455fd6..4bc9311e7 100644
--- a/tex/context/interface/keys-en.xml
+++ b/tex/context/interface/keys-en.xml
@@ -1,1663 +1,1589 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml
index 9a301d8b8..8815a94bf 100644
--- a/tex/context/interface/keys-fr.xml
+++ b/tex/context/interface/keys-fr.xml
@@ -1,1662 +1,1589 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml
index 48fc91213..885fddb28 100644
--- a/tex/context/interface/keys-it.xml
+++ b/tex/context/interface/keys-it.xml
@@ -1,1663 +1,1589 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml
index 91d935a19..deee34508 100644
--- a/tex/context/interface/keys-nl.xml
+++ b/tex/context/interface/keys-nl.xml
@@ -1,1663 +1,1589 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-pe.xml b/tex/context/interface/keys-pe.xml
new file mode 100644
index 000000000..0ac2bc83c
--- /dev/null
+++ b/tex/context/interface/keys-pe.xml
@@ -0,0 +1,1589 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml
index 75ec69b53..a93a06957 100644
--- a/tex/context/interface/keys-ro.xml
+++ b/tex/context/interface/keys-ro.xml
@@ -1,1663 +1,1589 @@
-
+
-
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/tex/context/interface/t-bib.xml b/tex/context/interface/t-bib.xml
index e7a8689db..93cf9f285 100644
--- a/tex/context/interface/t-bib.xml
+++ b/tex/context/interface/t-bib.xml
@@ -266,6 +266,7 @@
+
diff --git a/tex/generic/context/mptopdf.tex b/tex/generic/context/mptopdf.tex
index bb9f27d0c..fe3ad2ed9 100644
--- a/tex/generic/context/mptopdf.tex
+++ b/tex/generic/context/mptopdf.tex
@@ -171,5 +171,6 @@
\def\negatecolorcomponent#1% #1 = \macro
{\edef#1{\negatedcolorcomponent{#1}}}
+\countdef\realpageno=0 % to satisfy mkiv status reports
\dump
diff --git a/tpm/t-bib.tpm b/tpm/t-bib.tpm
index e4e94c215..f8e0bec08 100644
--- a/tpm/t-bib.tpm
+++ b/tpm/t-bib.tpm
@@ -11,9 +11,9 @@
A bibliographic subsystem for ConTeXt
Taco Hoekwater
- 556079
+ 566841
-
+
tex/context/bib/bibl-ams.tex
tex/context/bib/bibl-apa-de.tex
tex/context/bib/bibl-apa-fr.tex
@@ -31,7 +31,7 @@ bibtex/bst/context/cont-no.bst
bibtex/bst/context/cont-ti.bst
tpm/t-bib.tpm
-
+
doc/context/bib/bibmod-doc.pdf
doc/context/bib/bibmod-doc.tex
diff --git a/web2c/context.cnf b/web2c/context.cnf
index 6aa8fe687..6cb8ca806 100644
--- a/web2c/context.cnf
+++ b/web2c/context.cnf
@@ -182,7 +182,7 @@ trie_size = 500000
hyph_size = 8191
expand_depth = 10000
-buf_size.context = 4000000 % needed for omega bug
+buf_size.context = 1000000 % needed for omega bug
extra_mem_bot.context = 2000000
extra_mem_top.context = 4000000
font_max.context = 5000
--
cgit v1.2.3